我的具体例子将增加obj[s],如果它是真(有一个值),如果它是假的(还不存在于对象中),它将设置它等于1,从而添加到对象
但我要问的,一般看起来像:
something = doIfTruthy || doIfFalsey
我想它必须有一个名字,就像我们称呼这个"三元或条件运算符"一样
something = condition? ifTrue: ifFalse
我希望能够在我的笔记中用一个合适的名字来指代它。现在我就叫它"利用真理/谬误"。因为我就是这么用的
我也想知道你怎么称呼这种表达,因为它们很相似:
something = condition && ifTrue
您可以参考MDN上的此页面以获取有关操作符的更多信息,但您所询问的要点是:
A || B
称为"逻辑或";操作符,它将从左到右执行表达式,直到找到一个真表达式,返回第一个真表达式。
A && B
称为"Logical AND"操作符,它将从左到右执行表达式,直到找到一个假表达式,返回最后一个真表达式。
注:
我个人不建议跟随代码作者的脚步编写像
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];
为| |操作, JS将返回FIRST"truthy"它找到的值(从左到右阅读):
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"
另一个技巧是使用&&(和)在访问它之前确保它存在。
,,,操作, 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
Both || and &&操作从左到右读取…所以你可以有一些通常会把错误扔到右边的东西,因为JS一旦检测到真/假值就会停止从左到右的读取。