問題
一個長度為4空數(shù)組
用map()給數(shù)組元素賦值
為什么新數(shù)組還是空的呢?
下面的代碼為什么不輸出[empty × 4] [2,2,2,2]
代碼
var array = new Array(4);
var newArray = array.map(item=>{
return '2'
});
console.log(array,newArray);
// =>[empty × 4] [empty × 4]
解決
普通方法無法遍歷稀疏數(shù)組,只能用1樓所說的特殊方法才能遍歷
Array.map的callback只會針對已經(jīng)賦值過的item進(jìn)行調(diào)用(包括undefined)。
所以當(dāng)有的元素被刪除了,或者從來沒有被賦值的時候,callback不會調(diào)用這個元素。
callback is invoked only for indexes of the array which have assigned values, including undefined. It is not called for missing elements of the array (that is, indexes that have never been set, which have been deleted or which have never been assigned a value).
這個你需要通過閱讀V8引擎的源代碼來獲取答案:
function ArrayMap(f, receiver) {
CHECK_OBJECT_COERCIBLE(this, "Array.prototype.map");
// Pull out the length so that modifications to the length in the
// loop will not affect the looping and side effects are visible.
var array = TO_OBJECT(this);
var length = TO_LENGTH(array.length);
if (!IS_CALLABLE(f)) throw %make_type_error(kCalledNonCallable, f);
var result = ArraySpeciesCreate(array, length);
for (var i = 0; i < length; i++) {
if (i in array) {
var element = array[i];
%CreateDataProperty(result, i, %_Call(f, receiver, element, i, array));
}
}
return result;
}
在這里,我們注意到,它首先是用了一個TO_OBJECT來把數(shù)組轉(zhuǎn)為了對象,然后用了一個for循環(huán)在對象中查找下標(biāo),也就是這一句話:if (i in array),而當(dāng)我們用new Array(4)來創(chuàng)建數(shù)組時,實際創(chuàng)建的只是一個指針,并沒有創(chuàng)建實體的4個元素,所以當(dāng)它被轉(zhuǎn)化為對象時,得到是{}這樣的空對象,所以這里的每一個if語句分枝都不會被執(zhí)行。
但如果我們用var array = [null, null, null, null]或者哪怕array = [undefined, undefined, undefined, undefined]來做,效果都會大不一樣,因為以這樣方式創(chuàng)建的數(shù)組,轉(zhuǎn)化為的對象是:
{
0: undefined,
1: undefined,
2: undefined,
3: undefined,
}
當(dāng)對這樣的對象進(jìn)行if (i in array)操作時,可以找到相應(yīng)的下標(biāo),所以可以依次執(zhí)行。這就是根本原因。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。