在网上看到这样的两个匪夷所思的js题目,没找到相关的解答,忘大佬们不吝赐教

console.log(++[[]][+[]]+[+[]]);输出什么,var b=a={x:1};a.x=a={x:2};console.log(a.x);console.log(b);又分别输出什么;为什么。从原理上来分析。

阅读 1.7k
2 个回答

第一题纯粹就是为了考查弱类型转换和运算符优先级的,实际项目中谁这么写代码早就被人打死了。

首先线拆解一下运算式,你要是仔细观察的话,实际上数学运算符只有一个 +,剩下的 + 要么是 ++ 要么是做类型转换的,等效于:++[[]][+[]] + [+[]]

然后类型转换(一个对象前面加个 + 相当于强转成 Number,而 +[] === 0),得到:++[[]][0] + [0]

先看左半部分:++[[]][0],其中的 [[]] 就是一个数组字面量,相当于有一个长度是一的数组、其中第一个元素是一个空数组,那么这个数组的取下标 0 就是这个空数组(即 [[]][0] === [])。

现在式子已经变成了 ++[] + [0]。左面是个自增,++ii++ 的区别就不赘述了,继续变成 1 + [0]

最后这步有点儿奇葩了,运算式左边是个 Number、右边是个 Array。在 JS 里,+ 两边只要有一个不是 Number 的,就会变成两边先 toString() 然后字符串拼接。(1).toString() === '1'[0].toString() === '0',两个字符串拼一块就是结果 10


第二题没什么好说的啊,就是连等赋值外加简单的引用类型问题。实际项目中也最好不要用连等赋值,会被打半死(手动滑稽)。

var b = a = { x: 1 };
a.x = a = { x: 2};
console.log(a.x); // 输出 2
console.log(b); // 输出 { x: { x: 2 } }

连等赋值的详解看这里:https://segmentfault.com/q/10...

推荐问题
宣传栏