问题:
JavaScript 有两个视觉上很像,但是很不同的,去测试两个值的不同.你可以使用== 或者===,下面是不同之处
三个等于号
当在 JavaScript 中使用===的时候,我们是想要严格相等,这意味着,两个类型和值都要相等.
让我们看下两个关于严格相等的例子.
5===5//true
在这个例子里,我们比较数字 5 和数字 5,按照我们想的一样,true 返回.两个都是数字,而且两个的值都是 5
'hello world' === 'hello word'
// true(both string ,equal values)
true === true
//true(both booleans,equal values)
太棒了,现在让我们看下一些返回 false 的例子.
在这个例子里面,我们对比数字 77 和字符串 77,这个意思是我们对比的是两个值是相同的,但是类型不同,返回一个 false.
77==='77'//false (number v.string)
下面是两个其它的例子:
'cat' === 'dog'
// false(both are string ,but have different values)
false===0
//false (different type and differnt value)
太棒了,我们验证了,三重(严格)相等的关键是对比的两边都要值和类型都要相等.
两个等号
当在 JavaScript 中使用两个等号我们是进行松散比较.两个等号同样执行类型强制转换.
类型强制转换的意思是两个值只有经过转换成公共类型之后才能进行比较.
一个例子说明这个,前面的时候,我们测试两个不同的值使用三重(严格)相等
77==='77'
//false(number v.string)
77不严格相等于"77",因为它们两个类型不一样,然而,如果我们我们对比他们使用的是松散对比...
77=='77'
//true
你可以看我们得到了一个true,这是因为类型转换,JavaScript 会尝试转换我们两个不同的值变成同一个类型,字符串'77'可以轻松转换成数字 77,所以我们会得到返回一个 true.
让我们看另一个例子.
前面我们我们使用严格对比 如果 false 等于 0:
false
这个明显是 false,然而,如果我们对比这两个使用两重比较
false == 0
//true
居然返回了 true?为什么会这样?这个跟 JavaScript 中的虚值有关.我们会再下一节解释这个概念
虚值
为什么在 JavaScript 中 false == 0 .这是复杂的,因为在 JavaScript 中 0 是一个虚值.
类型强制转换会把 0 转换成一个 false 的布尔值,然后 false 等于 false
下面是六个虚值在 JavaScript 应该记住他们
false - 布尔值的 false
0 - 数字 0
''' - 空字符串
null
undefined
NaN - 不是一个数字
虚值的对比
下面是虚值的规则,如果你是一个 JavaScript 工程师,你应该牢记他们
false, 0 , and ""
当使用两重比较较任何他们三个值的时候,他们总是相等,这是因为他们的值总是被强制转换成 false
false == 0
// true
0==""
//true
"" == false
//true
2 null 和 undefined
当比较 null 和 undefined 的时候,他们总是和相等并和对方相等
null == null
// true
undefined == undefined
// true
null == undefined
// true
如果你尝试比较 null 和其他的值,都会返回 false.
3 NaN
最后,NaN 是不等于任何值,更酷的是,他都不等于他自己
NaN == null // false
NaN == undefined
// false
NaN == NaN
// false
关键点
就像你看到的那样,JavaScript类型转换有点疯狂,除非你很熟系 JavaScript,不然松散比较的价值比不上他出错的价值,记住六个虚值,和他们的规则,可以让你更好的使用两重相等
三重相等(严格相等) 比两重相等的优先级更好,当你可能的时候,你应该尽量使用严格相等,对比值和类型,你可以确定总是执行一个真正的对比.
最后
感谢你的阅读,如果你是阅读到学习 web 开发,查看六个月学会全栈 web 开发指南
我每周写 4 篇文章在 web 开发.如果你想添加收到每周一次的邮件列表,请考虑输入邮箱订阅.喜欢的话可以再 Twitter 上关注我
如果这个文章对你有用的话,点个赞表示你的支持吧
原文链接: https://codeburst.io/javascript-double-equals-vs-triple-equals-61d4ce5a121a