2016-02-13 50 views
0

爲什麼map()操作在不同類型的數組上運行時會生成不同的輸出?不同陣列上map()的不同結果

我認爲literalobj下面是相同的類型;爲什麼產生的數組不同?爲什麼非文字數組連接到一個元素?

爲什麼類型化數組不能創建一個字符串數組,而是返回原始類型數組?是否有規範要求映射操作無法將類型化數組轉換爲其他類型?

var literal = [1, 2, 3]; 
var obj = new Array([1, 2, 3]); 
var typed = new Uint32Array([1, 2, 3]); 


console.log(literal.map(String)); 
console.log(obj.map(String)); 
console.log(typed.map(String)); 

輸出

Array [ "1", "2", "3" ] 
Array [ "1,2,3" ] 
Uint32Array [ 1, 2, 3 ] 

我運行Firefox 44.0 https://jsfiddle.net/6c8p465r/1/

+4

'new Array'並不真的接受這樣的數組,你最終只有一個索引的數組,並且'Uint..'數組不能包含字符串 – adeneo

+3

**第二種情況:** var'obj'是二維數組,因此在調用'map'之前,在數組上調用'toString()'。 **第三種情況:**'Uint32Array'如名稱所示,存儲無法轉換爲數字的**整數數組**。 – Tushar

+0

有錯字^^^^:最後不能轉換爲** String ** _。 _Timeout:現在無法編輯:(_ – Tushar

回答

2

首先,使用文字陣列,或者使用數組構造會產生相同的結果,但你沒有使用構造函數正確。

以下內容將在數組內部生成一個數組,這就是爲什麼只有一個數組以字符串格式返回給您的原因。所以當你在這個地圖上調用map時,整個被映射的條目就是內部數組。

new Array([1, 2, 3]); // Produces [[1, 2, 3]] 

創建陣列要使用Array構造函數的方式正確的方法是在價值傳遞的只是參數:

new Array(1, 2, 3); // Produces [1, 2, 3] 

Uint32Array有幾件事情會與它必須先被理解。

  1. 它擁有無符號整數(不能轉換爲字符串)
  2. 它的構造是從Array構造不同

如果檢查出Uint32ArrayMozilla examples,你會看到,當使用這種方式時,值的數組預期會傳遞給構造函數。