Javascript 逻辑或和对象

Javascript Logical OR and Objects

谁能用这样的语句解释发生的一切:

POJO.someProperty = POJO.someProperty || {}

这是在检查 undefined 然后在 undefined = true 时简单地分配一个空对象吗?

此语句正在检查 POJO.someProperty 是否具有真值。如果是这样,则什么也不会发生。如果 属性 是假的,那么 属性 被分配一个空对象文字。

Falsy 表示以下几种情况之一:

  1. 一个false文字
  2. 数字0
  3. null
  4. undefined
  5. 一个空字符串

如果 属性 具有这些值中的任何一个,它将被重新分配给一个空对象。

在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)
} 

logical operators in javasript can return non boolean values. The Logical OR operator will return the first truthy value it finds in the operands. The Logical AND will return the first falsy value, or the last operand if all other operands are truhty.

Logical operators are typically used with Boolean (logical) values. When they are, they return a Boolean value. However, the && and || operators actually return the value of one of the specified operands, so if these operators are used with non-Boolean values, they may return a non-Boolean value.

  • 1 || 0 -> 1
  • 1 && '' -> ''

因此,当您的代码被评估时,如果 POJO.someProperty 未定义,则运算符将处理第二个运算符,它是一个空对象(这是一个真值),因此该值将被 returned并分配回 someProperty.

为什么用,正常使用是为了逃避属性 not defined 错误。假设您正在尝试访问 POJO.someProperty 的 属性,例如 POJO.someProperty.somekey,但是如果 POJO.someProperty 未定义,那么您将收到错误消息。但是这里如果它是未定义的那么我们分配一个空对象所以 POJO.someProperty.somekey 将 return 未定义不是错误。