||运算符在 null 时不设置默认值

|| operator not setting default when null

本文关键字:设置 默认值 null 运算符      更新时间:2023-09-26

我正在运行这一行:

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

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

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

Chrome 正在抛出这个:

Uncaught TypeError: Cannot read property 'good' of null

既然是nullgood不应该设置为false吗?

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

如果代码始终具有值,但可能没有属性good,则按原样编写代码可以data。但不幸的是,JavaScript引擎不会检查语句中的所有内容是否未定义或为空,即它不会测试data,然后测试data["good"]等等。

您需要先测试data是否至少具有某种价值,即它是"真实的"。

修复 1

您可以像这样清楚地布置它:

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

修复 2

或者一个巧妙的快捷方式是使用 &&|| 将返回找到的第一个"真实"值的事实 - 它不必是布尔

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

关于运算符的 jquery 教程很好地解释了从 &&|| 运算符返回的内容。

// 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>");

假妖孽!

另一件需要注意的事情是,您希望存储在变量中的某些值的计算结果可能为 false,因此您可能会错误地以 good = false 结束。这取决于您期望在data["good"]里面是什么。

这将发生在以下情况下,同样来自 jquery 站点:

  • false - 布尔假值
  • "" - 空字符串
  • NaN - "非数字"
  • 空 - 空值
  • undefined - 未定义的值(即,如果数据没有属性"好")
  • 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>");

在您的情况下,我无法想象单行代码,它将检查data是否不为空,如果是,则data[good]放入变量中。

你必须首先摆脱Exception.我宁愿做:

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