因此在JavaScript中,我们有三个相等比较运算符。我一直在阅读ECMAScript规范,并研究它们的工作方式。有什么事打击了我。内置函数Object.is()
的比较步骤较少,比其他运算符更早终止的可能性。那么这是否使Object.is()
的运行速度比其他运算符更快?
以下是规范摘要:
Object.is()
- 如果Type(x)与Type(y)不同,则返回false。
如果Type(x)为Number,则
a。如果x为NaN而y为NaN,则返回true。
b。如果x为+ 0,y为-0,则返回false。
c。如果x为-0且y为 +0,返回假。
d。如果x与y相同,则返回true。e。返回false。
- 返回SameValueNonNumber(x,y)。
宽松等于==
比较x == y,其中x和y是值,产生true或 假。这样的比较如下:
如果Type(x)与Type(y)相同,则
a。返回执行严格相等比较x === y的结果。
- 如果x为null且y未定义,则返回true。
- 如果x未定义且y为空,则返回true。
- 如果Type(x)为Number而Type(y)为String,则返回比较结果x ==! ToNumber(y)。
- 如果Type(x)为String,Type(y)为Number,则返回比较结果! ToNumber(x)== y。
- 如果Type(x)为布尔值,则返回比较结果! ToNumber(x)== y。
- 如果Type(y)为Boolean,则返回比较结果x ==! ToNumber(y)。
- 如果Type(x)是字符串,数字或符号,而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
- 如果Type(x)是Object并且Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x)== y。
- 返回false。
严格等于===
比较x === y,其中x和y是值,产生true或 假。这样的比较如下:
如果Type(x)与Type(y)不同,则返回false。
如果Type(x)为Number,则
a。如果x为NaN,则返回false。
b。如果y为NaN,则返回false。
c。如果x与y相同,则返回true。
d。如果x为+ 0,y为-0,则返回true。e。如果x为-0,y为+0,则返回true。
f。返回false。
返回SameValueNonNumber(x,y)。
答案 0 :(得分:2)
规范中较少的步骤并不一定意味着实施中的步骤较少。各种优化都适用于此。因此,最后,我们只能做race the horses!(在您实际的用例中,某些综合while(true) Object.is(1, 1);
不会产生任何有用的结果)。如果确实(明显)更快,它是否会使您的代码更好,例如是
Object.is(user.age, 3)
比
更清晰 user.age === 3
?