在Javascript中使用双重相等(松散相等)什么时候有意义?
考虑到和,作为一个JS新手,我一直试图避免使用双重相等,而是选择了三重相等在Javascript中使用双重相等(松散相等)什么时候有意义?,javascript,comparison,equality,Javascript,Comparison,Equality,考虑到和,作为一个JS新手,我一直试图避免使用双重相等,而是选择了三重相等 但是,当您希望允许Javascript自动转换类型时,何时使用双重质量有意义。例如 if (someElement.value == 3) 输入的值始终是字符串。=操作符将在此处自动将其转换为数字,因此您无需写入 if (parseInt(someElement.value) === 3) 你应该小心,因为一些自动转换可能不会达到你期望的效果。简短回答:使用=而不是=是没有意义的 长答案:虽然这毫无意义,但在某些情况
但是,当您希望允许Javascript自动转换类型时,何时使用双重质量有意义。例如
if (someElement.value == 3)
输入的值始终是字符串。=
操作符将在此处自动将其转换为数字,因此您无需写入
if (parseInt(someElement.value) === 3)
你应该小心,因为一些自动转换可能不会达到你期望的效果。简短回答:使用
=
而不是=
是没有意义的
长答案:虽然这毫无意义,但在某些情况下,您希望编写更少的代码,并且您对自己的输入很有把握
如果你真的明白什么是真实的,=
就没那么糟糕了。有一些错误,例如[1]==true
和[2]==false
请记住,Javascript的主要目标是供web设计师使用,这是您遇到的所有这些东西背后的原因之一
作为一个简单的例子,最好的方法是使用它来避免转换数据和检查相等性。下面是另一个例子:
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);
}
}
有一种情况下,使用
==
有一个明显的好处,那就是foo==null
:当且仅当foo===undefined | foo==null
这是一个常用的测试时,这才是正确的
即使在这里,使用node的
isNullOrUndefined(foo)
(实现为返回值==null;
!)这样的方法来表达意图也是一种更为清晰的方式,如果这不是您正在使用的代码库中的既定实践的话。您使用严格的相等(==)仅当您希望确保操作数的值相等且其数据类型也相同时。双等式(=)仅检查值是否相同,尤其是隐式转换的数值,而忽略数据类型。三重相等应始终有效,但必须先将一个或两个相等转换为相同的数据类型。但是,为什么不使用==“3”
?或者,如果3
将是一个固定的数字,如果你知道需要比较的类型,并且不希望出现任何意外的转换,那么为什么不把输入的值解析成一个数字呢?有很多方法可以剥猫皮。但这里,OP说“我一直试图避免使用双重相等,而是选择了三重相等。”考虑到这一点,OP更愿意使用Number(howManyTasksToRemoveInput.value)==tasks.length
或howManyTasksToRemoveInput.valueAsNumber==tasks.length
。数量“要删除的任务数”无论如何,真的应该是一个数字。你的观点是什么?当然==
可以被==
取代,这就是为什么很多使用linters的人强制只使用==
的原因。Javascript中没有一个地方可以接受=
不能使用==/code>。我的观点是,自Java以来就是这样脚本变得很简单。我不明白你的意思。OP选择避免使用==
而支持==
,并询问何时使用==
有意义(如果你总是可以使用更严格的等式,或使用更一致的数据类型等)。“==
可以被==
取代。”“没有一个地方[…]”反对使用==
。这正是我的观点。事实上,JavaScript被设计成一种简单的语言可能是==
存在的一个很好的理由。@Xufox gotcha,添加了一个总结,以准确回答问题