Review of knowledge point

129 阅读1分钟

JS

1. arguments与callee,caller

-arguments对象在函数体中,代表正在执行的函数的参数。
-callee是arguments对象的一个属性,是正在被执行的Function对象
-arguments.length代表函数实参的长度,O.callee.length代表函数形参的长度。(O:arguments)

function calleeDemo(arg1, arg2) {
 console.log(arguments.length) // 3
 console.log(arguments.callee.length) // 2
}
calleeDemo(1, 2, 3)

-caller是函数的一个属性,返回一个对函数(调用当前函数的函数)的引用

function callerDemo() {
  if (callerDemo.caller) {
     console.log(callerDemo.caller.name) // callCallerDemo
  }
}
function callCallerDemo() {
  callerDemo()
}
callCallerDemo.name = 'callCallerDemo'

2. ES6之Symbol

-ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

let s = Symbol('age')
let obj = { [s]: 18 }
console.log(typeof Symbol, typeof Symbol())
// function string

-属性名的遍历:Symbol作为属性名的对象,for...in... / for...of...进行遍历时,Symbol属性不会出现在遍历中,也不会被 Object.definePropertyNames / JSON.stringify / Object.keys返回
要想获取对象所有类型的键名,可以使用Reflect.ownKeys(obj)方法,返回一个包含常规键名和Symbol键名的数组 Symbol.for(),Symbol.keyFor(),Symbol.hasInstance,Symbol.isConcatSpreadable 详细学习

2. var、let、const

-var与let区别

  • var声明的范围是函数作用域,let声明范围是块级作用域
  • let声明的变量不会在作用域中被提升,所以不可以重复声明
  • var声明的全局变量会成为windows对象的属性,而let声明的变量不会

3.构造函数的继承

说明链接

*4.作用域

  • 在非匿名自执行函数中,函数名只读不可修改。
var b = 10;
(function b(){
b = 20;
console.log(b);  // [Function b]
})();