2010-12-14 73 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