字符串中的Javascript条件运算符运算符抛出错误

时间:2013-06-07 14:07:22

标签: javascript conditional-operator

我在条件运​​算符的true子句中得到了一个未定义属性的意外行为:

实施例: 使用Javascript:

var obj = undefined;

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

Fiddle

被驱逐的行为是获取一个日志条目,说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"));

Fiddle

3 个答案:

答案 0 :(得分:2)

试试这个条件:

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

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

因此您将检查objobj.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()是否已定义。