我正在运行这一行:
var good = data["good"] || false;
其中data
来自jquery ajax请求中的success
方法。
但是,如果good
为空,我认为这样做会默认false
到data["good"]
,但事实并非如此。
Chrome正在抛出这个:
Uncaught TypeError: Cannot read property 'good' of null
由于它是null
,因此good
不应设置为false
吗?
答案 0 :(得分:5)
问题不是data["good"]
是null
,而data
本身就是null
。
如果data
始终有值,但您的代码可能没有问题,但可能没有属性good
。但不幸的是,JavaScript引擎无法检查语句中的所有是否未定义或为空,即它不会测试data
,然后测试data["good"]
等等。
您需要首先测试data
是否至少具有某种值,也就是说,它是" truthy"。
你可以清楚地说出来:
var good = false;
if(data && data["good"]) {
good = data["good"];
}
或者一个简洁的捷径是使用&&
和||
将返回第一个" 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;
另外要注意的是,您希望存储在变量中的某些值可能会评估为false,因此您可能会错误地以good = false
结尾。这取决于您希望在data["good"]
内的内容。
以下内容同样来自the jquery site:
false
- 布尔值false ""
- 空字符串NaN
- &#34; not-a-number&#34; undefined
- 未定义的值(即,如果数据没有属性&#34;良好&#34;)0
- 数字为零。如果您认为可能是这种情况,您可能需要在支票中更具体:
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;
答案 1 :(得分:0)
在你的情况下,我无法想象单行,它将检查data
是否为空,如果是,则将data[good]
置于变量中。
首先,你必须摆脱Exception
。
我宁愿这样做:
var good = false;
if(data){
good = data["good"] || false;
}