我在条件运算符的true子句中得到了一个未定义属性的意外行为:
实施例: 使用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"));
答案 0 :(得分:2)
试试这个条件:
console.log("hello world" + ((obj || {}).Name) ? ...);
或
console.log("hello world" + ((obj || 0).Name) ? ...);
因此您将检查obj
和obj.Name
实际上,您定义的条件仅检查obj
,但不检查obj.Name
您可以在ajaxian
上阅读有关此类情况的说明答案 1 :(得分: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"));
答案 2 :(得分:0)
您应该执行:(obj && obj.Name) ? obj.Name.toString(): "Object not defined"
你的病情
(obj) ? obj.Name.toString(): "Object not defined"
只检查是否定义了obj
,在调用obj.Name
之前,它不会检查.toString()
是否已定义。