先看如下代码运行结果:
这是怎么回事呢?
当你通过==比较两个值时,其中一个值可能受到强制转换。
强制 - 自动将值从一种类型转换为另一种类型。
这里的自动是关键词。JavaScript不是在显式转换你的类型,而是在幕后帮你完成。
解释前三个
console.log("1==true 是: ",1==true);//true
看到很多说的类型转化其实有点错误,并不是把1转化成true,而是把true转化成1。
在==的隐式转化中,是对两边进行Number(),Number(true) = 1
console.log("1===true 是: ",1===true);//false
=== 先比较类型,再比较值,也就是===会阻止true隐式转换,true就是Boolean型,不会转化成Number型,结果就是false
- 3和4和1,2同理
下面是数组相关(重要)
console.log('0=="0" 是:',0=="0");//true
0是一个数字,然后"0"是一个字符串,它们永远不应该相同的!大多数编程语言都遵守它。例如,Java中的0 == “0”,会返回下面这个:
error: incomparable types: int and String
这很有道理。如果要比较Java中的int和String,必须先把它们转换为相同的类型。
如果你有目的地利用它,这很方便,但如果你不知道它的含义,则可能有害。这是关于它的 官方ECMAScript语言规范(建议用qq浏览器进入官网,qq浏览器自带网页翻译)
If x is Number and y is String, return x == ToNumber(y)
译:如果 x 是数字类型,y 是字符串类型,将 y 转换成数字类型与 x 作比较后返回
所以我们的例子0 == “0”:因为 0 是一个数字类型,“0” 是一个字符串类型,则返回 0 == ToNumber(“0”)我们的字符串"0"已经被秘密转换成数字0,所以为true
console.log('0==="0" 是:',0==="0");//false
与 2 同理
console.log("0==[] 是:",0==[]);//true
解释规范相关部分:
If x is String or Number and y is Object, return x == ToPrimitive(y)
译:如果 x 是字符串或数字类型,然后 y 是对象类型,将 y 转换为基本数据类型与 x 作比较后返回
- 注意!数组是对象
- 再次根据规范,JS首先寻找一个对象的toString方法来强制转换它。在数组的情况下,toString连接其所有元素并将它们作为字符串返回。
[1, 2, 3].toString() // "1,2,3"
['hello', 'world'].toString() // "hello,world"
因为我们的数组是空的,我们没内容去拼接!所以就是返回一个空字符
[].toString() // ""
- 空字符串然后变成0你不能把这些东西搞定。现在我们已经将数组强制变成"",我们又回到了前面的算法(规范)
If x is Number and y is String, return x == ToNumber(y)
所以0==""
Since 0 is Number and "" is String, return 0 == ToNumber("")
ToNumber("")返回的就是0,也就是0=0 ,所以嘛 0==[ ] 就成立喽!
7.console.log('"0"==[] 是:',"0"==[]); //false
重点!
这是正确的
0 == "0" // true
因为被强制转换成这个0 == ToNumber(“0”)。
这也是正确的
0 == [] // true
复制代码因为强制转换执行两次:
- ToPrimitive([ ])转换为空字符串
- 然后ToNumber("")转换为 0 。
所以依照上述规则,我们很容易推出以下结论:
"0" == []
嘿嘿!但是很遗憾告诉你这是错误的!
分析:
"0" == []
再次参考规范:
If x is String or Number and y is Object, return x == ToPrimitive(y)
那就意味着…
Since "0" is String and [] is Object, return x == ToPrimitive([])
"0" == ""
“0"和” "都是字符串类型,所以JavaScript不需要再强制转换了。 是不是豁然开朗?所以
“0” == [ ] 是 false
总结
都使用三重等号(===),是最好的方法 ^_^
0 === "0" // false
0 === [] // false
"0" === [] // false
它完全避免强制转换