表达的结果是什么?

时间:2010-12-14 10:37:38

标签: javascript

此代码是否会在所有浏览器中按预期运行?关于它的规范是否有任何注释?

var attributes = this._attributes ? this._attributes : (this._attributes = []);

即。如果* this._attributes *未初始化,则将创建新数组,并将该数组分配给* this._attributes *和 attributes

5 个答案:

答案 0 :(得分:3)

这个表达没有什么特别之处,你在任何主流浏览器中都没有问题。您可以使用|| operator

缩短它
var attributes = this._attributes || (this._attributes = []);

答案 1 :(得分:2)

这适用于所有浏览器。

实际上它可能会更加轻松......

var attributes = this._attributes || (this._attributes = []);

答案 2 :(得分:0)

不,我认为遗憾的是,如果未定义,您可能无法访问_attributes。所以你必须检查typeof attributes != "undefined"

答案 3 :(得分:0)

我没有看到任何理由。我不认为我是这样写的,我不喜欢有副作用的作业,但从语法上来说它很好。

答案 4 :(得分:0)

这很方便,当访问任何对象的未定义属性时,该访问将返回undefined。您需要注意的一件事是扩展Object.prototype以获得_attributes属性,因为这会让您感到困惑,但话又说回来,< strong>从不扩展原生原型。

来自规范:

  

8.12.2 [[GetProperty]](P)

     
      
  1. 让prop成为使用属性名P调用O的[[GetOwnProperty]]内部方法的结果。
  2.   
  3. 如果prop未定义,请返回prop。
  4.   
  5. 让proto成为O的[[Prototype]]内部属性的值。
  6.   
  7. 如果proto为null,则返回undefined。
  8.   
  9. 返回用参数P调用proto的[[GetProperty]]内部方法的结果。
  10.   

因此它检查对象是否具有属性,如果是,则返回它,如果不是它搜索原型链,如果它找到了它返回它,否则它返回undefined