【译】两重相等 VS 三重相等

487 阅读4分钟
翻译: 江吉仪
校队: 金俊

问题:

JavaScript 有两个看上去很像,但差别很大的比较相等的符号。你可以使用== 或===,下面是不同之处:

三个等于号

当在 JavaScript 中使用===的时候,我们是想要严格相等,这意味着比较双方两个类型和值都要相等。

让我们看下两个关于严格相等的例子。

在这个例子里,我们比较数字 5 和数字 5,跟我们想的一样,true 返回.两个都是数字,而且两个的值都是 5。

5===5//true

考虑到这一点,我们再看下同样返回 true 的两个例子:

hello world' === 'hello word'

// true(都是字符串 值相同)

true === true

//true(都是布尔值,值相同)

OK,现在让我们看一些返回 false 的例子.

在这个例子里面,我们对比数字 77 和字符串 77,这个意思是我们对比的双方值相同的,类型不同,返回一个 false.

77==='77'//false (number v.string)

下面是两个其它的例子:

'cat' === 'dog' // false(都是字符串但值不同)

false===0 //false (值和类型都不同)

OK,我们验证了,三重(严格)相等的关键是对比的两边都要值和类型都要相等。

两个等号

当在 JavaScript 中使用两个等号我们是进行松散比较,两个等号同样执行类型强制转换。

类型强制转换的意思是两个值经过转换成公共类型之后才能进行比较。

让我们用一个例子证明一下,当我们用三重(严格)相等测试以下两个值的:

77==='77' //false(数字 v.字符串)

77不严格相等于"77",因为它们两个类型不一样,然而,如果我们对比他们使用的是松散对比...

77=='77' //true

你可以看到我们得到了一个true,这是因为类型转换,JavaScript 会尝试转换我们两个不同的值变成同一个类型,字符串'77'轻松转换成数字 77,所以我们会得到返回一个 true。

让我们看另一个例子。

前面我们使用严格相等对比 如果 false 等于 0:

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 经常使用 JavaScript 的工程师,你应该牢记他们

  1. false , 0 , 和 ""

当使用普通相等比较任何他们三个值的时候,他们总是相等,这是因为他们的值总是被强制转换成 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 development,如果你想收到我每周一次的邮件,请考虑输入邮箱订阅.喜欢的话可以在 Twitter 上关注我。

如果你觉得这个文章对你有用的话,点个赞表示你的支持吧!!

原文链接: codeburst.io/javascript-…