有人可以解释在这样的声明中发生的所有事情:
POJO.someProperty = POJO.someProperty || {}
这是否检查未定义然后只是在undefined = true时分配一个空对象?
答案 0 :(得分:1)
此语句正在检查POJO.someProperty
是否具有真值。如果确实如此,则没有任何反应。如果属性是假的,则为属性分配一个空对象文字。
Falsy意味着以下几点之一:
false
字面null
undefined
如果属性具有任何这些值,则会将其重新分配给空对象。
答案 1 :(得分:1)
javasript中的logical operators可以返回非布尔值。 Logical OR运算符将返回它在操作数中找到的第一个truthy值。如果所有其他操作数都是falsy,则逻辑AND将返回第一个truhty值或最后一个操作数。
逻辑运算符通常与布尔(逻辑)值一起使用。 如果是,则返回布尔值。然而,&&和|| 运算符实际上返回一个指定操作数的值, 因此,如果这些运算符与非布尔值一起使用,它们可能会 返回非布尔值。
因此,当您的代码被评估时POJO.someProperty
未定义时,运算符将处理第二个运算符,该运算符是一个空对象(这是一个真值),以便返回值并将其分配回{{1 }}
为什么使用它,它通常用于转义属性未定义的错误。假设您尝试访问someProperty
的属性,例如POJO.someProperty
,但如果POJO.someProperty.somekey
未定义,则会出现错误。但是如果它未定义,那么我们将分配一个空对象,以便POJO.someProperty
将返回undefined而不是错误。
答案 2 :(得分:0)
在JavaScript中,与C一样,赋值表达式的值是右侧操作数的值。在您提供的示例中,在赋值发生之前评估赋值右侧的表达式。因为它是一个逻辑OR,如果{}
是假的,它将评估为对象文字POJO.someProperty
。
你可能会在其他地方看到这样使用的赋值表达式(注意if
表达式中的单个等号):
var x = 1;
var y = 0;
if (y = x) {
// This block executes because x is 1 (also, y is now 1)
}