2010-12-14 79 views
1

此代码在所有浏览器中都能按预期工作吗?有没有关于它的规格说明?表达式的结果是什么?

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

I.e.如果* this._attributes *未初始化,则将创建新数组,并将该数组分配给* this._attributes *和属性

回答

3

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

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

谢谢!你的方式更好。 – 2010-12-14 10:51:53

+0

@alex:我在没有看到你的答案的情况下添加了'||'位,但是你确实得到了这一点,所以有一个同情upvote :) – 2010-12-14 11:15:04

0

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

+0

当然你可以访问它,它只会返回'undefined'你不想引用一个未定义的变量,只有一个未定义的属性在访问时返回'undefined'。 – 2010-12-14 10:44:48

+0

访问未定义的自由变量和未定义的属性之间有区别。 OP做的很好。 – 2010-12-14 10:45:56

2

这将适用于所有浏览器。

这可能与...

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

实际做出更简洁我看不出有任何理由不。我不认为我会这样写,我不是那些带有副作用的作业的粉丝,但从语法上来说它没问题。

0

这工作得很好,当访问任何对象的未定义属性时,该访问将返回undefined。单一的事情你必须注意的是,你不要扩展Object.prototype有一个_attributes属性,因为这会把你搞砸,但再次,永远不会扩展原生原型。

从规格:

8.12.2 [[的getProperty]](P)

  1. 设丙是调用的O的[[GetOwnProperty]]内部方法的结果带物业名称P.
  2. 如果道具不是未定义的,则返回道具。
  3. 让proto为O的[[Prototype]]内部属性的值。
  4. 如果proto为null,则返回undefined。
  5. 返回参数调用原的[[的getProperty]]内部方法的结果P.

所以它检查该对象是否具有的特性,如果是的话则返回,如果不是它搜索在原型链上,如果它发现它返回它,否则返回undefined