Javascript ||运算符未设置为空时的默认值

Javascript ||运算符未设置为空时的默认值,javascript,Javascript,我在运行这条线路: var good = data["good"] || false; 其中,data来自jqueryajax请求中的success方法 但是,如果data[“good”]为空,我认为这将默认good为false,但它不是空的 Chrome正在抛出以下内容: Uncaught TypeError: Cannot read property 'good' of null 既然它是null,那么good不应该设置为false?问题不在于数据[“good”]是null,而在于数据本

我在运行这条线路:

var good = data["good"] || false;
其中,
data
来自jqueryajax请求中的
success
方法

但是,如果
data[“good”]
为空,我认为这将默认
good
false
,但它不是空的

Chrome正在抛出以下内容:

Uncaught TypeError: Cannot read property 'good' of null

既然它是
null
,那么
good
不应该设置为
false

问题不在于
数据[“good”]
null
,而在于
数据本身是
null

如果
数据
始终有一个值,但可能没有属性
良好
,那么您的代码就可以了。但不幸的是,JavaScript引擎不会检查语句中的所有内容是否都未定义或为null,即它不会测试
数据,然后测试
数据[“good”]
,依此类推

您需要首先测试
数据
是否至少具有某种类型的值,也就是说,它是“真实的”

修正1 您可以这样清楚地进行布局:

var good = false;
if(data && data["good"]) {
    good = data["good"];
}
修正2 或者一个简洁的快捷方式是使用这样一个事实,即
&&
|
将返回找到的第一个“truthy”值-它不必是布尔值:

var good = (data && data["good"]) || false;
对从
&&
|
运算符返回的内容有很好的解释

//有一个值-设置为“foo”
var data1={good:'foo'};
var good1=(data1&&data1[“good”])| false;
文件。写(“+good1+”);
//数据为null-设置为false
var-data2=null;
var good2=(data2&&data2[“good”])| | false;
文件。写(“+good2+”);
//数据[“良好”]不存在-设置为false
var data3={bad:'hello'};
var good3=(data3&&data3[“good”])| | false;

文件。写(“+good3+”)
问题不在于
数据[“好”]
空的
,而在于
数据本身是
空的

如果
数据
始终有一个值,但可能没有属性
良好
,那么您的代码就可以了。但不幸的是,JavaScript引擎不会检查语句中的所有内容是否都未定义或为null,即它不会测试
数据,然后测试
数据[“good”]
,依此类推

您需要首先测试
数据
是否至少具有某种类型的值,也就是说,它是“真实的”

修正1 您可以这样清楚地进行布局:

var good = false;
if(data && data["good"]) {
    good = data["good"];
}
修正2 或者一个简洁的快捷方式是使用这样一个事实,即
&&
|
将返回找到的第一个“truthy”值-它不必是布尔值:

var good = (data && data["good"]) || false;
对从
&&
|
运算符返回的内容有很好的解释

//有一个值-设置为“foo”
var data1={good:'foo'};
var good1=(data1&&data1[“good”])| false;
文件。写(“+good1+”);
//数据为null-设置为false
var-data2=null;
var good2=(data2&&data2[“good”])| | false;
文件。写(“+good2+”);
//数据[“良好”]不存在-设置为false
var data3={bad:'hello'};
var good3=(data3&&data3[“good”])| | false;

文件。写(“+good3+”)在您的情况下,我无法想象有一个线性函数会检查
数据是否为空,如果为空,则将
数据[good]
放入变量中

首先,您必须排除异常。 我宁愿:

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

在您的情况下,我无法想象有一个线性函数会检查
data
是否为空,如果为空,则将
data[good]
放入变量中

首先,您必须排除异常。 我宁愿:

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

我正要写同样的,但它是不正确的<代码>好
在任何情况下都不会有数据[good]的值-OP未提及数据[good]将只包含布尔值。哦。。。好吧,我以为它检查了我要写的所有东西,但它不正确<代码>好
在任何情况下都不会有数据[good]的值-OP未提及数据[good]将只包含布尔值。哦。。。好吧,我以为它检查了一切