在JavaScript中,何时使用双等号(宽松相等)是有意义的?

6

考虑到类型转换性能问题, 作为一个JS新手,我总是尽量避免使用双等号,而选择使用三等号。

然而,在什么情况下使用双等号更合适呢?


只有在想要保证操作数的值相等且数据类型也相同时,才使用严格相等(===)。双等号(==)仅检查值是否相同,特别是具有隐式转换的数字值,并忽略数据类型。三重等号应该总是有效的,但不是没有额外的步骤,需要先将一个或两个转换为相同的数据类型。 - Christian Hur
3个回答

3
简短回答:永远不要使用==代替===
详细回答:虽然永远不要使用==,但在你确定输入的情况下,有些情况下你想写更少的代码。
如果你真正理解真值是什么,==不那么糟糕。它也有一些陷阱,例如[1] == true[2] == false
记住,JavaScript的主要目标之一是成为网页设计师容易使用的语言,这就是你遇到所有这些东西的原因之一。
作为一个简单的例子,正如Barmar所说的,最好的方法是使用它来避免转换数据并检查相等性。以下是另一个例子:
const deleteTodos = _ => {
    if (howManyTasksToRemoveInput.value == tasks.length) {
        warningLabel.innerHTML = "You can't remove all the list";
    } else if (howManyTasksToRemoveInput.value > tasks.length) {
        warningLabel.innerHTML = "You DEFINITELY can't remove more tasks than you have";
    } else {
        tasks.splice(0, +howManyTasksToRemoveInput.value);
    }
}

但是在这里,OP说:“我一直试图避免使用双等号,而选择使用三等号。” 有了这个想法,OP宁愿使用Number(howManyTasksToRemoveInput.value) === tasks.lengthhowManyTasksToRemoveInput.valueAsNumber === tasks.length。无论如何,“要删除的任务数量”都应该是一个数字。 - Sebastian Simon
你的观点是什么?当然可以用 === 替换 ==,这就是为什么很多人使用 lint 工具强制只使用 ===。在 Javascript 中,没有一个地方不接受 === 而必须使用 ==。我的观点是因为 Javascript 被设计成易学易用的语言,所以才有这个情况。我不明白您的意思。 - Jorjon
OP选择避免使用==,而选择使用===,并询问何时使用==有意义(如果您始终可以使用更严格的相等性或使用更一致的数据类型等)。 _“==可以被===替换”_和_“没有一个地方[…]”_是反对使用==的很好的观点。这正是我的观点。事实上,JavaScript被设计成一种易于使用的语言,这可能是存在==的一个很好的理由。 - Sebastian Simon
@Xufox,明白了,我添加了一个摘要以便更准确地回答问题。 - Jorjon

3

有一种情况下,使用==会带来明显的好处,即foo == null:只有当foo === undefined || foo === null时才为真,这是一个常用的测试方法。

即使在这种情况下,如果你的代码库中没有已经确立的惯例,使用像node的isNullOrUndefined(foo)(它实现为return value == null;!)是表达意图更清晰的方法。


1

当您想让JavaScript自动转换类型时。例如:

if (someElement.value == 3)

value 属性始终是一个字符串。在这里,== 运算符会自动将其转换为数字,因此您不必编写

if (parseInt(someElement.value) === 3)

你需要小心,因为某些自动转换可能不会按照你的预期进行。


但是,为什么不使用 === "3" 呢?或者如果 3 将成为一个固定的数字,为什么不将输入值解析为数字,如果您已经知道需要比较的类型,并且不希望进行任何意外的转换呢? - Sebastian Simon
1
有很多种方法可以解决这个问题。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接