这个javascript语法有什么作用?

时间:2016-07-26 18:42:54

标签: javascript oop

r等于什么?为什么?

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

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

更新

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

2 个答案:

答案 0 :(得分:3)

让我们看一下作业,记住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,则验证将解释这两者值为false0 == false0 !== false

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

答案 1 :(得分:2)

来自MDN

  

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

Javascript中有8个“虚假”值

  • 未定义
  • 0
  • 的NaN
  • ''
  • “”
  • 的document.all

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

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

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

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