2011-09-12 95 views
6

我刚才一直在看Underscore.js的_.isEqual功能和代码的部分是这样的:Underscore.js这行是否需要进行相等性检查?

if (a === b) return true; 

if (typeof a !== typeof b) return false; 

if (a == b) return true; 

我只是想知道,如果有其中第三条语句可以达成任何情况下,并评估为true

编辑:只是要清楚,这不是我自己的代码,我说的是,我读下划线的来源,特别是this line和我很好奇他们为什么这样做。

+1

有一些奇怪的边缘情况下,这是可能的... –

+0

@nickf:考虑到当类型相同时'=='和'==='是相同的,我看不出第一次和第三次测试会提供不同的结果。即使在'null'的情况下,'typeof'与内部的'Type'不同,它不强制为除'undefined'之外的任何值,它具有不同的'typeof'值。如果那里有*边缘案例,你怎么知道你会希望它强制?对相同的值进行'=='和'==='测试似乎很奇怪。要么你想要类型强制,要么你不需要。 – user113716

+0

......我应该在上面的评论中通过*“you”*来阐明,我并不是想暗示* nickf *,而是*一个人*。 – user113716

回答

3

我刚才浏览了Underscore回购,发现有人问the exact same thing这个简短的讨论,看起来实际上没有必要。

遵循由ECMAScript语言规范在section 11.9.6section 11.9.3中定义的算法似乎表明在上述情况下没有一对值应该返回true。因此,总之,不,那种情况是不可能的

+0

+1在这个讨论中找到好的 – user113716

1

唯一情况=====出乎意料反应是一个文本字符串("123")相对于一个构造的字符串(new String("123")),其将失败第一测试时。

但是,在第二个测试中,它被捕获,因为构造的字符串类型为object,但文字类型为string

基于此,我会说不,第三个陈述永远不可能达成,并评估为真。

1

当您使用==运算符并且表达式具有不同类型时,JavaScript在比较之前通常会将两者转换为相同类型。

例如,这可能发生在nullundefinednull == undefined是真的,尽管null === undefined是错误的。然而typeof null"object",而typeof undefined"undefined"。所以,在这种情况下,您应该在第二条语句中返回false。

您可以阅读该规范(第11.9.3)的所有细节,这是非常投入: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf