1. 程式人生 > >關於陣列的一些課外小知識

關於陣列的一些課外小知識

最近在看你不知道的js中,發現了一些很有意思的課外知識。大家都知道新建一個數組,無非就是用[]以及使用建構函式的方式。在紅寶書中也有提及應該儘量避免使用建構函式,除非十分必要,注意這一點。為什麼這麼說呢,因為使用建構函式來建立陣列經常會產生意想不到的結果。

 var a = new Array(1,2,3); // a  = [1,2,3] 

這是大家都知道,也是很明確的一種寫法,寫到這順帶提個小知識,也有很多人知道:建構函式Array(..)不要求必須帶new關鍵字,不帶new時,js會自動補上。有一點大家應該也都知道,也是Array建構函式的一個小問題,在Aarry建構函式中傳入一個數字引數的時候,該引數會被作為陣列的預設長度。用例子解釋:var a = new Array(5) 。console.log(a.length)  //  5。這是一個很容易忘記以及容易出錯的地方。但關鍵點在於,陣列本身中並沒有預設長度這個概念。這裡再提及一個小知識,假設一個數組沒有任何的單元(值),但它的length屬性卻顯示有單元數量,這樣奇特的資料結構會導致一些怪異的行為。而這一切都歸咎於已被廢止的舊特性(類似arguments這樣的類陣列)。我們將包含至少一個“空單元”的陣列成為稀疏陣列。

var a = new Array(3)

var  b = [undefined, undefined, undefined]

var c = []; c.length = 3;

b在當前版本的chrome中顯示為[undefined, undefined, undefined ],而a和c則顯示為[empty × 3]。更令人費解的應該算是在火狐中了,a和c都顯示為[ , , , ],誒?三個逗號,難道不是代表著四個單元嗎。他給出的解釋是,從ES5規範開始就允許在列表末尾多加一個逗號(在實際處理中會被忽略不計)。所有如果你在程式碼或者除錯控制檯輸入[ , , , ]實際上得到的是[ , , ]。因此針對這種情況,火狐將[ , , , ]改為顯示Array[< 3 empty slots>]。

最後一個有意思的例子,var  a = Array.apply(null, { length : 3});

先不說結果,先一步步來解釋下這如何解析的。 首先Array.apply中第一個引數為null,也就是把this指向了window作用域中,作用域在這並不是關鍵點,接著{length : 3 } 作為第二個引數。由於第二個引數必須是一個數組或者說是類陣列的元素,也就是說我們可以換種思想說,apply對第二個引數會進行遍歷。而{length : 3}作為類陣列,apply在遍歷時候,發現有長度,進行遍歷,可是實際三個單元又是空的,那進行遍歷時,自動的返回了undefined(進行物件或者陣列訪問,不存在的屬性會返回undefined)。

說到這應該可以知道答案了吧。// a = [undefined, undefined, undefined]

此篇文章多數知識來源於你不知道的js。