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()”中使用的对象的技术名称是啥?

javascript中调用的这种形式或语法是啥? [关闭]

obs*R-squared是啥意思

为 DateTime 声明 obs 类型的正确方法是啥?

在 Django 中,如果存在的话,根据视图名称动态加载一些 JavaScript 的更聪明的方法是啥?

jmeter中的正则表达式是啥意思