0

我在条件运​​算符的真实子句中得到了未定义属性的这种意外行为:

示例:Javascript:

var obj = undefined;

console.log("hello world" + (obj) ? obj.Name.toString(): "Object not defined");

小提琴

预期的行为是得到一个日志条目,上面写着hello worldObject“未定义,而是抛出错误:SCRIPT5007: Unable to get value of the property 'Name': object is null or undefined。这怎么可能,检查对象,它不应该执行 htis coe 路径。一个工作示例是:

var obj = undefined;

console.log("hello world" + ((obj) ? obj.Name.toString(): "Object not defined"));

小提琴

4

3 回答 3

2

试试这个条件:

console.log("hello world" + ((obj || {}).Name) ? ...);

或者也

console.log("hello world" + ((obj || 0).Name) ? ...);

所以你会同时检查objobj.Name
实际上,您定义的条件仅检查obj但不检查obj.Name

您可以在ajaxian上阅读有关这种情况的解释

于 2013-06-07T14:10:19.493 回答
1

分组是这里的问题-您的行等效于以下内容:

("hello world" + obj) ? obj.Name.toString(): "Object not defined"

("hello world" + obj)等于"hello worldundefined",它在 JavaScript 中被强制转换为true布尔值,因此浏览器会尝试查找并运行该obj.Name.toString()函数,但该函数并不存在。

另外,我很确定大多数对象没有Name属性,除非您手动设置一个。未定义的值永远不会有一个Name属性,因为它不是一个对象并且不能转换为一个,因此给出了错误说明。

如果您想检查该特定属性,则必须执行以下操作:

var obj = undefined;
console.log("hello world" + (typeof obj === 'object' && obj.Name != null ? obj.Name.toString(): " Object not defined"));
于 2013-06-07T14:10:17.273 回答
0

你应该这样做:(obj && obj.Name) ? obj.Name.toString(): "Object not defined"

你的情况

(obj) ? obj.Name.toString(): "Object not defined"

仅检查是否已定义,在调用它之前obj不检查是否已定义。obj.Name.toString()

于 2013-06-07T14:14:38.250 回答