我使用JSLint来浏览JavaScript,它返回了很多建议,在做一些事情时,比如在if语句中比较idSele_UNVEHtype.value.length == 0,将==(两个等号)替换为===(三个等号).

==替换为===是否会带来性能优势?

任何性能改进都是受欢迎的,因为存在许多比较运算符.

如果没有进行类型转换,性能增益是否会超过==

推荐答案

严格相等运算符(===)的行为与抽象相等运算符(==)相同,不同之处在于不进行类型转换,并且类型必须相同才能被视为相等.

参考:Javascript Tutorial: Comparison Operators

==运算符将比较等式after doing any necessary type conversions.===运算符将not进行转换,因此如果两个值的类型不同,===将简单地返回false.两者都同样迅速.

To quote Douglas Crockford's excellent JavaScript: The Good Parts,

JavaScript有两组相等运算符:===!==,以及它们的邪恶双胞胎==!=.好的工作方式和你期望的一样.如果两个操作数类型相同且值相同,则===生成true!==生成false.当操作数属于同一类型时,邪恶的孪生sibling 会做正确的事情,但如果它们属于不同的类型,他们会试图强制执行值.他们这样做的规则既复杂又难以理解.以下是一些有趣的 case :

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true

Equality Comparison Table

缺乏及物性令人担忧.我的建议是永远不要使用邪恶的双胞胎.相反,始终使用===!==.刚才显示的所有比较都会产生false===运算符.


更新:

在 comments 中提出了@Casebash个好观点,在@Phillipe Laybaert'sanswer个关于对象的 comments 中提出了一个很好的观点.对于对象,=====彼此行为一致(特殊情况除外).

var a = [1,2,3];
var b = [1,2,3];

var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };

var e = "text";
var f = "te" + "xt";

a == b            // false
a === b           // false

c == d            // false
c === d           // false

e == f            // true
e === f           // true

特殊情况是,当您将一个基本体与一个计算结果为同一基本体的对象进行比较时,由于其方法为toStringvalueOf.例如,考虑字符串原语与使用String构造函数创建的字符串对象的比较.

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

这里,==运算符判断两个对象的值并返回true,但===运算符看到它们不是相同的类型并返回false.哪一个是正确的?这取决于你想比较什么.我的建议是完全绕过这个问题,只是不要使用String构造函数从字符串文本创建字符串对象.

Reference
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

Javascript相关问答推荐

如果没有尾随斜线,托管在收件箱中的React/Vite将无法工作

React对话框模式在用户单击预期按钮之前出现

我不知道为什么我的JavaScript没有验证我的表单

如何使用侧边滚动按钮具体滚动每4个格?

为什么ngModel不能在最后一个版本的Angular 17上工作?'

在这种情况下,如何 for each 元素添加id?

如何修复(或忽略)HTML模板中的TypeScript错误?'

JSDoc创建并从另一个文件导入类型

为什么我的导航条打开状态没有在窗口addeventlistener(Reaction Js)中更新?

这个值总是返回未定义的-Reaction

在css中放置所需 colored颜色 以填充图像的透明区域

使用Document.Evaluate() Select 一个包含撇号的HTML元素

FireBase云函数-函数外部的ENV变量

FileReader()不能处理Firefox和GiB文件

ngOnChanges仅在第二次调用时才触发

如何在AG-Grid文本字段中创建占位符

react 路由如何使用从加载器返回的数据

我为什么要使用回调而不是等待?

未捕获的不变违规:即使在使用DndProvider之后也应使用拖放上下文

扩散运算符未按预期工作,引发语法错误