JavaScript-==vs==operators性能
几周前,我读到这篇文章,据说: 这是因为等式运算符==执行类型强制…这意味着 解释器隐式地尝试转换值,然后 做比较 另一方面,identity操作符===不进行类型转换 强制,因此它不会转换值的值 比较时JavaScript-==vs==operators性能,javascript,performance,equality,comparison-operators,equality-operator,Javascript,Performance,Equality,Comparison Operators,Equality Operator,几周前,我读到这篇文章,据说: 这是因为等式运算符==执行类型强制…这意味着 解释器隐式地尝试转换值,然后 做比较 另一方面,identity操作符===不进行类型转换 强制,因此它不会转换值的值 比较时 我开始怀疑这是否意味着当我使用“==”操作符时,我将获得良好的性能,因为在转换操作数时不会花费任何资源。在所有代码都转换成机器命令之后,这是否意味着,正如使用时C没有区别一样,无论性能如何,==显然是这种情况下更好的选择。其他任何事情,如更好的性能只是锦上添花。此外,两种方式的差异都很小。性能
我开始怀疑这是否意味着当我使用“==”操作符时,我将获得良好的性能,因为在转换操作数时不会花费任何资源。在所有代码都转换成机器命令之后,这是否意味着,正如使用
时C
没有区别一样,无论性能如何,==
显然是这种情况下更好的选择。其他任何事情,如更好的性能只是锦上添花。此外,两种方式的差异都很小。性能差异可以忽略不计,这意味着你不应该浪费宝贵的大脑周期去思考它。如果你真的想知道,你应该测试一下
使用==
,除非你有很好的理由不这样做(你可能不这样做)。这是一种脚本语言。这些操作符的性能不应该如此重要以至于你应该担心它,因为还有许多其他事情需要消耗更多的能量,比如它在虚拟机中运行,是弱类型的,在浏览器中与HTML DOM一起工作
此外,两个操作符所做的事情完全不同,因此在任何情况下,一个操作符都不可能与另一个操作符互换
也就是说,我认为(但还没有测试)==
更快。原因是,它只需要比较类型,如果匹配,则比较原始数据。如果一种类型与另一种类型不匹配,则==
运算符将尝试将其转换为另一种类型。在大多数情况下,这将是一个更昂贵的操作
这是幸运的,因为在大多数情况下,==
是更好的选择
但是无论如何,你可以很容易地测试它(确保你测试了多个案例,都是同一类型的,也有几个不同的类型),但是如果你不知道如何测试它,我就不再担心它了。差异(如果有的话)不会杀死你。对于js,如果在字符串类型上使用===运算符,并且字符串是完全相同的字符,则将返回true。对于对象,它比较对象引用,而不是内容
从:
11.9.6严格相等比较算法-比较x===y,其中x和y为值,产生真或假。这样的比较
执行的步骤如下:
如果类型(x)与类型(y)不同,则返回false
如果类型(x)未定义,则返回true
如果类型(x)为Null,则返回true
如果类型(x)为数字,则
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
如果类型(x)是字符串,那么如果x和y是完全相同的字符序列(相同的长度和相同的字符)
相应职位);否则,返回false
如果类型(x)为布尔值,则如果x和y均为真或均为假,则返回真李>
首先,性能根本不是一个问题。对于任何真正的脚本,与代码中的其他瓶颈相比,使用一个操作符而不是另一个操作符所获得的任何性能增益都将是无穷小的(通常DOM操作将是首要目标)
其次,在许多情况下,=
和==
将执行完全相同的步骤。当两个操作数的类型相同(例如,两个字符串或两个数字)时,ECMAScript规范对两个运算符具有完全相同的步骤。因此,如果在一个浏览器或其他环境中观察到同一类型操作数的两个运算符之间的性能差异,则无法保证甚至不可能在另一个浏览器中看到类似的差异
在typeof
的情况下,正如您在问题中提到的,两个操作数保证为相同的类型(字符串),并且两个运算符将执行完全相同的操作,因此,支持一个运算符而不支持另一个运算符的唯一原因是风格
JS社区作为一个整体在这一点上采取了相当强硬的态度:共识似乎是“除非你需要类型强制,否则永远不要使用=
和!=
”,这对我来说太教条了。我觉得一个带有易于验证的证据的答案是最好的
这些操作非常小,很难对其进行性能测试
- ==1648真
- ==1629对
- 对照试验1575正确
如果减去控制测试,在我的浏览器上,它们的速度似乎相差约30%。如果你多次这样做,你可以得到不同的答案,但是===通常出现得最快,我认为这只是一个证据,证明了差异是多么微不足道
我认为这很好地证明了其他人所说的,性能差异是一种浪费时间的想法,但它也表明===实际上更快。希望这个答案能节省其他人的时间,那些只需要看到证据的人
2019年更新
2019-04-09 Firefox改进测试:
- ==1383真
- ==1167真
- 控制测试429正确
2019-04-09改进试验的铬:
- ==249对
- ==248真
- 对照试验248正确
2019-04-09改进试验的边缘:
- ==22510真
- ==20315真
- 对照试验4968正确
这些年来,浏览器变得越来越智能,而且看起来