console.log(++[[]][+[]]+[+[]]);
输出什么,var b=a={x:1};a.x=a={x:2};console.log(a.x);console.log(b);
又分别输出什么;为什么。从原理上来分析。
console.log(++[[]][+[]]+[+[]]);
输出什么,var b=a={x:1};a.x=a={x:2};console.log(a.x);console.log(b);
又分别输出什么;为什么。从原理上来分析。
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
第一题纯粹就是为了考查弱类型转换和运算符优先级的,实际项目中谁这么写代码早就被人打死了。
首先线拆解一下运算式,你要是仔细观察的话,实际上数学运算符只有一个 +,剩下的 + 要么是 ++ 要么是做类型转换的,等效于:
++[[]][+[]]
+[+[]]
。然后类型转换(一个对象前面加个 + 相当于强转成 Number,而
+[] === 0
),得到:++[[]][0]
+[0]
。先看左半部分:
++[[]][0]
,其中的[[]]
就是一个数组字面量,相当于有一个长度是一的数组、其中第一个元素是一个空数组,那么这个数组的取下标 0 就是这个空数组(即[[]][0] === []
)。现在式子已经变成了
++[]
+[0]
。左面是个自增,++i
和i++
的区别就不赘述了,继续变成1
+[0]
。最后这步有点儿奇葩了,运算式左边是个 Number、右边是个 Array。在 JS 里,+ 两边只要有一个不是 Number 的,就会变成两边先 toString() 然后字符串拼接。
(1).toString() === '1'
,[0].toString() === '0'
,两个字符串拼一块就是结果10
。第二题没什么好说的啊,就是连等赋值外加简单的引用类型问题。实际项目中也最好不要用连等赋值,会被打半死(手动滑稽)。
连等赋值的详解看这里:https://segmentfault.com/q/10...