JavaScript 深入之類陣列物件與 arguments

冴羽發表於2019-03-04

類陣列物件

所謂的類陣列物件:

擁有一個 length 屬性和若干索引屬性的物件

舉個例子:

即便如此,為什麼叫做類陣列物件呢?

那讓我們從讀寫、獲取長度、遍歷三個方面看看這兩個物件。

讀寫

長度

遍歷

是不是很像?

那類陣列物件可以使用陣列的方法嗎?比如:

然而上述程式碼會報錯: arrayLike.push is not a function

所以終歸還是類陣列吶……

呼叫陣列方法

如果類陣列就是任性的想用陣列的方法怎麼辦呢?

既然無法直接呼叫,我們可以用 Function.call 間接呼叫:

類陣列轉物件

在上面的例子中已經提到了一種類陣列轉陣列的方法,再補充三個:

那麼為什麼會講到類陣列物件呢?以及類陣列有什麼應用嗎?

要說到類陣列物件,Arguments 物件就是一個類陣列物件。在客戶端 JavaScript 中,一些 DOM 方法(document.getElementsByTagName()等)也返回類陣列物件。

Arguments物件

接下來重點講講 Arguments 物件。

Arguments 物件只定義在函式體中,包括了函式的引數和其他屬性。在函式體中,arguments 指代該函式的 Arguments 物件。

舉個例子:

列印結果如下:

arguments

我們可以看到除了類陣列的索引屬性和length屬性之外,還有一個callee屬性,接下來我們一個一個介紹。

length屬性

Arguments物件的length屬性,表示實參的長度,舉個例子:

callee屬性

Arguments 物件的 callee 屬性,通過它可以呼叫函式自身。

講個閉包經典面試題使用 callee 的解決方法:

接下來講講 arguments 物件的幾個注意要點:

arguments 和對應引數的繫結

傳入的引數,實參和 arguments 的值會共享,當沒有傳入時,實參與 arguments 值不會共享

除此之外,以上是在非嚴格模式下,如果是在嚴格模式下,實參和 arguments 是不會共享的。

傳遞引數

將引數從一個函式傳遞到另一個函式

強大的ES6

使用ES6的 … 運算子,我們可以輕鬆轉成陣列。

應用

arguments的應用其實很多,在下個系列,也就是 JavaScript 專題系列中,我們會在 jQuery 的 extend 實現、函式柯里化、遞迴等場景看見 arguments 的身影。這篇文章就不具體展開了。

如果要總結這些場景的話,暫時能想到的包括:

  1. 引數不定長
  2. 函式柯里化
  3. 遞迴呼叫
  4. 函式過載

歡迎留言回覆。

深入系列

JavaScript深入系列目錄地址:https://github.com/mqyqingfeng/Blog

JavaScript深入系列預計寫十五篇左右,旨在幫大家捋順JavaScript底層知識,重點講解如原型、作用域、執行上下文、變數物件、this、閉包、按值傳遞、call、apply、bind、new、繼承等難點概念。

如果有錯誤或者不嚴謹的地方,請務必給予指正,十分感謝。如果喜歡或者有所啟發,歡迎star,對作者也是一種鼓勵。

  1. JavaScirpt 深入之從原型到原型鏈
  2. JavaScript 深入之詞法作用域和動態作用域
  3. JavaScript 深入之執行上下文棧
  4. JavaScript 深入之變數物件
  5. JavaScript 深入之作用域鏈
  6. JavaScript 深入之從 ECMAScript 規範解讀 this
  7. JavaScript 深入之執行上下文
  8. JavaScript 深入之閉包
  9. JavaScript 深入之引數按值傳遞
  10. JavaScript 深入之call和apply的模擬實現
  11. JavaScript 深入之bind的模擬實現
  12. JavaScript 深入之new的模擬實現

相關文章