||当null时,operator不设置默认值

时间:2015-01-08 16:40:43

标签: javascript

我正在运行这一行:

var good = data["good"] || false;

其中data来自jquery ajax请求中的success方法。

但是,如果good为空,我认为这样做会默认falsedata["good"],但事实并非如此。

Chrome正在抛出这个:

Uncaught TypeError: Cannot read property 'good' of null

由于它是null,因此good不应设置为false吗?

2 个答案:

答案 0 :(得分:5)

问题不是data["good"]null,而data本身就是null

如果data始终有值,但您的代码可能没有问题,但可能没有属性good。但不幸的是,JavaScript引擎无法检查语句中的所有是否未定义或为空,即它不会测试data,然后测试data["good"]等等。

您需要首先测试data是否至少具有某种值,也就是说,它是" truthy"。

修复1

你可以清楚地说出来:

var good = false;
if(data && data["good"]) {
    good = data["good"];
}

修复2

或者一个简洁的捷径是使用&&||将返回第一个" truthy"发现 value - 它不必是布尔值:

var good = (data && data["good"]) || false;

jquery tutorial on Operators很好地解释了&&||运营商的回复。



// has a value - sets to "foo"
var data1 = { good: 'foo' };
var good1 = (data1 && data1["good"]) || false;
document.write("<div>" + good1 + "</div>");

// data is null - sets to false
var data2 = null;
var good2 = (data2 && data2["good"]) || false;
document.write("<div>" + good2 + "</div>");

// data["good"] doesn't exist - sets to false
var data3 = { bad: 'hello' };
var good3 = (data3 && data3["good"]) || false;
document.write("<div>" + good3 + "</div>");
&#13;
&#13;
&#13;

Falsy Gotchas!

另外要注意的是,您希望存储在变量中的某些值可能会评估为false,因此您可能会错误地以good = false结尾。这取决于您希望在data["good"]内的内容。

以下内容同样来自the jquery site

  • false - 布尔值false
  • "" - 空字符串
  • NaN - &#34; not-a-number&#34;
  • null - 空值
  • undefined - 未定义的值(即,如果数据没有属性&#34;良好&#34;)
  • 0 - 数字为零。

如果您认为可能是这种情况,您可能需要在支票中更具体:

&#13;
&#13;
var data = { good: 0 };

// 0 is falsy, so incorrectly sets to false
var good = (data && data["good"]) || false;
document.write("<div>" + good + "</div>");

// check the actual type and value - correctly set to 0
var good2 = (data && (typeof data["good"] != "undefined") && data["good"] != null)
    ? data["good"] : false;
document.write("<div>" + good2 + "</div>");
&#13;
&#13;
&#13;

答案 1 :(得分:0)

在你的情况下,我无法想象单行,它将检查data是否为空,如果是,则将data[good]置于变量中。

首先,你必须摆脱Exception。 我宁愿这样做:

var good = false;
if(data){
    good = data["good"] || false;
}