此代码是否会在所有浏览器中按预期运行?关于它的规范是否有任何注释?
var attributes = this._attributes ? this._attributes : (this._attributes = []);
即。如果* this._attributes *未初始化,则将创建新数组,并将该数组分配给* this._attributes *和 attributes 。
答案 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)
- 让prop成为使用属性名P调用O的[[GetOwnProperty]]内部方法的结果。
- 如果prop未定义,请返回prop。
- 让proto成为O的[[Prototype]]内部属性的值。
- 如果proto为null,则返回undefined。
- 返回用参数P调用proto的[[GetProperty]]内部方法的结果。
醇>
因此它检查对象是否具有属性,如果是,则返回它,如果不是它搜索原型链,如果它找到了它返回它,否则它返回undefined
。