2015-05-08 54 views
6

我有一個這樣的功能:JavaScript對象的元素是否按特定順序初始化?

parsers[1] = function(buf) { 
    return { 
     type: "init", 
     name: buf.readUTF8String(), 
     capacity: buf.readUInt32(), 
     port: buf.readUInt16() 
    }; 
} 

沒有得到任何保證namecapacityport將被初始化一個接一個?否則,緩衝區將以錯誤的順序讀取。

我當然可以依傍:

parsers[1] = function(buf) { 
    var ret = {type: "init"}; 
    ret.name = buf.readUTF8String(); 
    ret.capacity = buf.readUInt32(); 
    ret.port = buf.readUInt16(); 

    return ret; 
} 
+3

這是ES5規範的相關部分:[11.1.5 - Object initializer](http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5)。 – joews

+0

@joews:有點神祕,但我收集他們評估的順序。謝謝。 – coyotte508

+0

@joews他想要一個__擔保___,而不是學術猜測 –

回答

3

感謝@joews的評論,我可以回答我自己的問題。

從鏈接11.1.5 Object initializer

語法

ObjectLiteral

  • {}

  • {PropertyNameAndValueList }

  • {PropertyNameAndValueList,}

PropertyNameAndValueList

  • PropertyAssignment

  • PropertyNameAndValueList,PropertyAssignment

簡而言之,對象構造函數將參數或者作爲參數,無論是初始化值列表還是後跟逗號的初始化值列表。

該初始化值列表由PropertyAssignment或初始化值列表後跟PropertyAssignment組成,其基本意思是遞歸列表PropertyAssignment

現在的問題是,在過去PropertyNameAndValueList , PropertyAssignment,有沒有在這兩個要素進行評估特定的順序?

生產 PropertyNameAndValueList:

  1. obj是評估PropertyNameAndValueList的結果:PropertyNameAndValueList,PropertyAssignment 如下評價。

  2. propId成爲評估結果PropertyAssignment

  3. ...

如果2.是一定要遵循1.的訂單將得到保證。

5.2 Algorithm conventions

規範經常使用一個編號列表來指定的算法步驟。這些算法用於精確指定ECMAScript語言結構所需的語義。這些算法並不意味着使用任何特定的實現技術。在實踐中,可能會有更高效的算法來實現給定的功能。

...

爲了表達清楚起見,算法步驟可以被細分爲順序子步驟。

因此,期望的初始化順序是元素之後的元素,從我可以收集的元素。

0

正如在許多其他語言,我不會依賴於任何對象,也沒有將其初始化或值分配方式對性能的「訂單」至。

如果需要「外部」順序,我會嘗試通過這些屬性的映射來實現。

+1

這與對象內部實際屬性的順序沒有任何關係,而是在初始化表達式的順序是否受到尊重(重要的原因是函數調用的潛在副作用)時。 –

+0

或者你可以閱讀他的全部答案。 –

+0

如果你讀到Axel的回答,那就是他所說的。你的回答就像你在工作之前所做的那樣「不」。 –

相關問題