Javascript中这种表达式的名称是啥? obj[s] = ++obj[s] || 1
Posted
技术标签:
【中文标题】Javascript中这种表达式的名称是啥? obj[s] = ++obj[s] || 1【英文标题】:What is the name of this type of expression in Javascript? obj[s] = ++obj[s] || 1Javascript中这种表达式的名称是什么? obj[s] = ++obj[s] || 1 【发布时间】:2021-12-11 12:24:49 【问题描述】:我的具体示例将增加 obj[s] 如果它是真的(有一个值),如果它是假的(不存在于对象中)它将设置它等于 1 并因此将它添加到对象。
但总的来说,我要问的是:
something = doIfTruthy || doIfFalsey
我认为它必须有一个名字,就像我们如何称呼这个“三元或条件运算符”一样
something = condition? ifTrue: ifFalse
我希望能够在我的笔记中通过适当的名称来引用它。现在我只是称它为“exploit truthy/falsey”,因为这就是我使用它的方式。
我也想知道你怎么称呼这种表达方式,因为它很相似:
something = condition && ifTrue
【问题讨论】:
没有具体的名称。它使用 OR,因此从技术上讲它是一个 OR 表达式,但如果您愿意,也可以称为“带有后备的赋值”,并且大多数了解 JS 的人都会理解您。 相关:What does "var FOO = FOO || " (assign a variable or an empty object to that variable) mean in javascript?. 它们只是被称为“逻辑运算符”,而您“利用”的是它们的短路行为。另请注意,在操作数表达式中执行副作用是一种不好的做法,最好使用if
语句。或者,在您的特定示例中,obj[s] = (obj[s] ?? 0) + 1;
哦,这很有趣,因为最初我有 obj[s] = (obj[s] ?? 0) + 1;但是教练告诉我使用我在原始问题中的方法。我很高兴知道我原来的方法更好。
【参考方案1】:
您可以参考 MDN 上的 this page 以获取有关运算符的更多信息,但您要问的要点是:
A || B
被称为“逻辑或”运算符,它将从左到右执行表达式,直到找到一个真实的表达式,然后返回第一个真实的表达式。
A && B
被称为“逻辑与”运算符,它将从左到右执行表达式,直到找到一个虚假的表达式,然后返回最后一个真实的表达式。
旁注:
我个人不建议跟随代码作者的脚步写
obj[s] = ++obj[s] || 1
之类的东西,因为即使它很简洁,也需要一些阅读才能理解。考虑类似的事情:obj[s] ||= 0; ++obj[s];
或者:
obj[s] = (obj[s] || 0) + 1;
或者简单地说:
if (typeof obj[s] !== 'number') obj[s] = 0; ++obj[s];
【讨论】:
您甚至可能想使用??
而不是||
这很有趣!正如我在上面评论的那样,我最初有 obj[s] = (obj[s] || 0) + 1;然后被教练建议在我的问题中使用该方法。我认为有些人认为将所有内容都简化为“leet”,但我赞成清晰的代码。我很高兴我这样想是对的!【参考方案2】:
对于 ||操作,JS将返回它找到的FIRST“真实”值(从左到右读取):
var bob = false || undefined || 0 || null || "hi"
// ^ ^ ^ ^ ^
// nope nope nope nope yip
//
// => bob = "hi"
// --------------
// breaking
// --------------
var bob = false || "hi" || 0 || null || undefined
// ^ ^
// nope yip <-- stops here
// the rest are ignored
//
// => bob = "hi"
另一个技巧是在访问之前使用 && (and) 来确保某些内容存在。
对于 && 操作,JS 将返回它找到的 LAST "truthy" 值(从左到右读取)。
例如,如果您尝试从多级对象中读取属性。
var obj =
foo :
bar : "hi"
var bob = obj && obj.foo && obj.foo.bar;
// ^ ^ ^
// yip yip use this
//
// => bob = "hi"
// --------------
// breaking:
// --------------
var bob = obj && obj.foo && obj.foo.sally && obj.foo.bar;
// ^ ^ ^
// yip yip nope <-- stops here,
// ^ and returns the last "yip"
// | the rest are ignored |
// '-----------------------------------------------'
//
// => bob = obj.foo
两者||和 && 操作是从左到右读取的......所以你可以拥有通常可能会向右侧抛出错误的东西,因为一旦 JS 检测到真/假值,它就会停止从左到右读取。
【讨论】:
以上是关于Javascript中这种表达式的名称是啥? obj[s] = ++obj[s] || 1的主要内容,如果未能解决你的问题,请参考以下文章
javascript/vb“new ActiveXObject()”中使用的对象的技术名称是啥?