先看这行代码:

new Array([],null,undefined,null) == ",,,"; // true

挺神奇,哈?
这里有两件事情,首先当然是“==”这家伙引起了类型转换。 转换的规则是当两个对象a和b作比较时,如果一方是简单类型(假设是b吧),另一方是对象(假设是a);则把a类型转换成b的类型。前面的代码b(”,,,”)是字符串,简单类型,所以要求a(typeof Array是对象对吧)作类型转换到字符串。
另一件事情就是Array的类型转换,转换成字符串时,数组大概就是这样做的:首先把每一个元素转换成字符串,然后调用数组的join方法。既是本上a对象经历了这样的转变:
1. Array([],null,undefined,null)
2. Array(“”,””,””,””)
3. Array(“”,””,””,””).join()
4. “,,,”
最后变成了”,,,”,自然就返回true了。

同样的道理下面这行代码就不难理解了。

",,," == new Array(4); // true

再看个变态点的:

",,," == Array((null,'cool',false,NaN,4)); // true

其实这里主要是使用了逗号操作符的原因。MDN上时这样说逗号操作符的,从左往右计算,并返回右面的值。
所以(null,’cool’,false,NaN,4)的返回值就是4, 然后这个例子就变成,前面一个例子了。WTFJS。

相关文章

    共享到: