【问题标题】:Javascript conditional-operator operator in string throws error字符串中的Javascript条件运算符引发错误
【发布时间】:2013-06-07 14:07:21
【问题描述】:

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

示例: Javascript:

var obj = undefined;

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

Fiddle

预期的行为是得到一个日志条目说 hello worldObject"not defined 而是抛出一个错误: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

【问题讨论】:

  • 澄清一下 - 这是一个运算符优先级问题吗?
  • 我也想知道问题是什么(以及为什么在第一个代码中 obj 周围有括号)。

标签: javascript conditional-operator


【解决方案1】:

试试这个条件:

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

也可以

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

因此您将检查objobj.Name
实际上,您定义的条件只检查obj,而不检查obj.Name

您可以在ajaxian 上阅读有关这种情况的说明

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您应该改为:(obj && obj.Name) ? obj.Name.toString(): "Object not defined"

      你的情况

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-11
        • 2010-10-26
        • 2021-10-22
        • 2021-01-25
        • 2015-07-03
        • 2020-10-06
        • 1970-01-01
        相关资源
        最近更新 更多