Javascript ||,又名“为什么这不起作用?!”
我和其他人似乎总是希望一段 JavaScript 语法能够正常工作,但它却总是无法正常工作。
const isThisOrThat = "that" === ("this" || "that")
// this is false
为什么这种方法行不通?我们来探讨一下!
括号内
如果按照运算顺序,内部表达式会先求值。
"this" || "that"在 JavaScript 中,这是什么意思?
说实话,这有点儿让我数学头疼。在数学里,a || b = b || a`or` 运算符是可交换的,所以顺序无关紧要。但在 JavaScript 里就不一样了,顺序非常重要。
我们来看两个例子。
const example = "" || "that"
// "that"
JavaScript 首先会检查第一个值是否存在。JavaScript 检查的是一个假值,空字符串就是假值。由于第一个值不存在,所以它返回第二个值。
即使第二个值也为假,也会发生这种情况。
const example = "" || ""
// ""
那么,如果第一个值是真值(就像我们最初的例子一样),会发生什么呢?
const example = "this" || "that"
// "this"
example评估结果为"this"。
平等性检查
现在我们开始明白为什么上面的表达式行不通了。我们可以把它拆分成两部分。
const example = "this" || "that"
const isThisOrThat = "that" === example
// false
在我们检查相等性的时候,该字符串"that"根本不存在。
奇怪的是,顺序很重要。
const example = "that" || "this"
const isThisOrThat = "that" === example
// true
翻转原始表达式会改变最终的相等性检查结果。
确保这一点有效
如果我们真的想检查这两个字符串,我们需要检查两次相等性。
const isThisOrThat = "that" === "this" || "that" === "that"
// true
或者,我们可以使用数组检查。这种方法感觉更自然一些。
const isThisOrThat = ["that", "this"].includes("that")
// true
或者很奇怪
人们经常使用 `or` 来翻转值或设置默认值等等。我一直不太喜欢它,因为上面的例子就说明了这一点。一旦你开始编写这样的表达式,它就很容易把问题搞复杂。
文章来源:https://dev.to/laurieontech/javascript-aka-why-doesn-t-this-work-3eo6