【问题标题】:What does that javascript syntax do?该javascript语法有什么作用?
【发布时间】:2016-11-30 13:22:53
【问题描述】:

r 等于什么?为什么?

换句话说,布尔运算符如何处理对象?

var data = {x:123, y:456};
var r = data && data.x || 0;

更新:

当我运行它时r 总是等于x,但我不明白为什么。

【问题讨论】:

  • r 的值将是(data.x 如果datatruthy)或0
  • 在您尝试运行此程序后,r 是什么?
  • 我从未见过&&|| 的这种组合。我通常将其视为var r = data ? data.x : 0;(字符较少,可能不会那么混乱)。
  • @RocketHazmat 如果123 是假的而0 不是假的,则行为略有不同。
  • @RocketHazmat,这并不完全等同。它必须是var r = data ? (data.x ? data.x : 0) : 0

标签: javascript oop


【解决方案1】:

我们看作业,记住JavaScript Operator Precedence

var r = data && data.x || 0

&&|| 之前被操作,如果&& 都强制为true,则&& 返回最后一个操作数,否则false。因此,它会简化为:

var r = data.x || 0

现在|| 运算符返回第一个返回 true 的操作数,由于 data.x 强制转换为 true,它将返回 data.x

var r  = data.x

关于 Javascript 对象本身,它们将始终返回 true,即使该对象为空。即obj = {}

另一方面,如果您验证一个对象的属性,情况就不同了:如果该属性的布尔值false 或数值0,验证会将这两个值都解释为@987654338 @,如0 == false,但0 !== false

实际上,我们假设: var data = { x:false, y:456 }; var r = data && data.x || 999; r 将等于 999,如果 data.x 设置为 `0,则相同。

【讨论】:

    【解决方案2】:

    来自MDN

    Javascript 在布尔上下文中使用类型强制。

    Javascript 中有 8 个“假”值

    • 未定义
    • 0
    • NaN
    • ''
    • ""
    • document.all

    在您的示例中,data && data.x || 0、&& 和 ||使其成为布尔上下文。 data 被强制转换为布尔值。如果它不是上面列出的值之一,则强制为 true。

    程序员经常通过检查值是否“假”来检查对象是否已定义(即非空且非未定义)。您的示例可以重写为

    var r = 0;
    if(data && data.x){
      r = data.x;
    }
    

    我认为这清楚地表明您正在检查是否定义了 data 并且 data.x 不是假的(例如 0)。如果您不确定变量是否包含有效对象,这是避免空引用错误的常用技术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      相关资源
      最近更新 更多