ECMA規範之Array-prototype-push

咱們幾乎天天都要用到push方法,咱們真的明白在調用push方法後,瀏覽是怎麼運行這個方法?es6

其中ecma規範第三版(1999)是這樣定義的:

  • 1 調用對象的[Get]方法獲取參數列表中第一個參數長度
  • 2 將結果用ToUint32方法賦值給n
  • 3 在參數列表中獲取下一個參數,若是沒有,直接跳到第七步
  • 4 調用對象的[Put]方法將當前參數Tostring,put到當前對象中去
  • 5 n自增1
  • 6 回到第三步,循環
  • 7 調用對象的[Put]方法,將參數長度和n put 到當前對象中去
  • 8 返回n

push原生方法的長度屬性爲1數組

到了2011年,咱們push規範進行了變動,大體變動以下:

  • 1 調用ToObject處理this對象,將結果賦值給O
  • 2 調用O對象的內部方法[Get]將第一個參數長度賦值給lenVal
  • 3 將ToUint32(lenVal)賦值給n
  • 4 將傳遞給函數調用的參數從左到右,依次賦值給items
  • 5 若是items不爲空,重複下列方法: a.移除items中的第一個元素,而且將移除元素的值賦給E b.調用O對象的[Put]內部方法,在O對象上設置ToString(n),E和true屬性。 c.n自增1
  • 6 當items爲空時,調用O對象的[Put]內部方法,設置O對象的參數長度,n和true等屬性。
  • 7 返回n

NOTE: push方法被刻意設計爲一種通用的方法;它並不要求this對象是一個數組對象。所以它能使用特定方法被其餘對象調用。函數

var obj={

    addElem : function addElem(elem){
        
        [].push.call(this,elem);
        //Array.prototype.push.call(this,elem);
    }
}

obj.addElem('1');
obj.addElem('2');
console.log(obj.length) //result is 2
複製代碼

時光回到2015年,ecma規範又一次更新,push固然也是更新了

咱們來看看具體有哪些更新:this

  • 1 ToObject(this)而且將值賦給O
  • 2 調用ReturnIfAbrupt(O) ps:這個函數是啥意思?目前還沒弄懂,弄懂再回來補充
  • 3 將O的長度調用ToLength()賦值給len ps:這個toLength又是什麼呢?
  • 4 調用ReturnIfAbrupt(len)
  • 5 步驟仍是跟第五版同樣,將全部傳遞進函數的參數從左至右賦值給items。
  • 6 將items中的元素個數賦值給argCount
  • 7 若是len + argCount > 2的53次方減一,拋出TypeError exception
  • 8 若是items不爲空,重複下列行爲: a.從items移除第一個元素,而且將這個元素的值賦給E b.調用Set方法設置O對象的ToString(len),E和true屬性 c.ReturnIfAbrupt(setStatus) d.len自增1
  • 9 若是items爲空,調用Set方法,設置O對象"length",len和true屬性
  • 10 ReturnIfAbrupt(setStatus).
  • 11 返回len

es6內部抽象程度更高,更加規範,調用了不少方法來處理不一樣的過程,那讓咱們來了解研究這些方法究竟是幹什麼的。spa

ToObject

Object抽象方法它能夠將參數轉變爲對象類型的值。prototype

arguments type result
Completion Record If argument is an abrupt completion, return argument. Otherwise return ToObject(argument.[[value]]).
Undefined Throw a TypeError exception.
Null Throw a TypeError exception.
Boolean 返回新的Boolean對象
Number 返回新的Number對象
String 返回新的String對象
Symbol 返回新的Symbol對象
Object 返回對象

其中Boolean,Number,String,Symbol,參數類型爲這些時,返回的新對象都是用internal slot(暫且翻譯爲內部插槽從新設置的對象),可是何爲internal slot,還不理解,理解再來敘說。翻譯

ReturnIfAbrupt

完成時 類型被用做記錄運行時,值傳遞的狀態,例如一些跳出局部控制的狀態(break, continue, return and throw)。設計

Field Value Meaning
[[type]] One of normal, break, continue, return, or throw 其中某一種狀態已經被調用
[[value]] Undefined, Null, Boolean, String, Symbol, Number, and Object中的一種,或者empty 值已經產生
[[target]] any ECMAScript string or empty The target label for directed control transfers.

重點:abrupt completion(忽然完成) 是指在[[Type]]之中除了nomral以外的狀態code

相關文章
相關標籤/搜索