1)连续赋值问题;
示例1:
var a,b; a=b=3; a.x = a = 4; console.log(a,b) // 4,3
示例2:
var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x);// --> undefined console.log(b.x);// --> { n: 2 }
示例1,说明了赋值计算是从右向左执行,“.”运算被视为变量声明,因此会优先执行;
示例2,再次印证了“.”运算的有优先计算权,并且执行的是{n:1}对象;
然后执行从右向左执行,会给a变量赋值{n:2};
然后执行从右向左执行,会给{n:1}对象增加一个新的属性
2)new关键字的含义
示例1:new Boolean(value)返回的是对象
对象的创建过程(new时[[construct]]的处理逻辑)
1. 创建一个build-in object对象p 并初始化
2. 如果F.prototype是Object类型,则将p内部的[[prototype]]设置为F.prototype
否则obj的[[prototype]]将为其初始值不需要指定(即Object.prototype).
3. 将p作为this,使用args参数调用F的内部[[Call]]方法.
3.1 内部[[Call]]方法创建当前执行上下文
3.2 调用F的函数体
3.3 销毁当前的执行上下文
3.4 返回F函数体的返回值.如果F的函数体没有返回值则返回undefined
4. 如果[[Call]]的返回值是Object类型,则返回这个值,否则返回p
示例2:Boolean(value);
value值为undefined null -0 +0 0 NAN ""下列值的时候,返回值为false,其他值外都返回true;