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] })();