摘要:在第一次循環(huán)的時候的值為,此后依次為。所以就出現(xiàn)了上面的問題。此外,在下打印的時候可能與在中打印出現(xiàn)不同的結(jié)果。尤其是是這種牽扯到數(shù)組下標的盡量不要使用來處理,如果非要使用可以做如下處理以避免如上的問題。
問題復現(xiàn)
var arr = ["a", "b", "c"]; var sid = ["Go"]; for (var key in arr) { sid[key + 1] = arr[key]; } console.log(sid)
很簡單的問題,最后的輸出結(jié)果卻是:
[ "Go", , , , , , , , , , , "b", , , , , , , , , , "c" ]問題分析
通過上面的輸入結(jié)果我們可以發(fā)現(xiàn)這么幾個問題:
sid里面多了很多空項,length明顯的增多了
arr[0]的值在sid中沒有出現(xiàn)
問題1:sid里面多了很多空項,length明顯的增多了略過痛苦的分析步驟直接來重點內(nèi)容:
通過打印key + 1我們可以找到問題的關(guān)鍵。通過打印我們可以得到如下信息。
在第一次循環(huán)的時候key + 1的值為01,此后依次為:11,21。
通過這個我們可以判斷: 這個key其實是一個String類型的。
所以上面的步驟相當于:
sid["01"] = arr[0]; sid["11"] = arr[1]; sid["21"] = arr[2];
究其原因,我只能在淺層面作出解釋:
這可能是因為for-in一般是用于對象的(狹義的對象),而對象的屬性是一個String類型,所以for-in的參數(shù)key被定義為一個String類型。這并沒有考慮過數(shù)組的屬性名(下標)不是String類型,而是一個Number類型的情況。所以就出現(xiàn)了上面的問題。此外在MDN的js語法關(guān)于for-in這塊出現(xiàn)過這樣的提示:
Note: for..in 不應(yīng)該被用來迭代一個下標順序很重要的 Array .
可能就包含這種情況吧。
問題2:arr[0]的值在sid中沒有出現(xiàn)arr[0]的值其實通過sid["01"]可以取到。
此外,在node下打印sid的時候可能與在console中打印出現(xiàn)不同的結(jié)果。
對于數(shù)組的遍歷,最好使用:forEach,map,some,filter,find等方法。尤其是是這種牽扯到數(shù)組下標的盡量不要使用for-in來處理,如果非要使用可以做如下處理:
var arr = ["a", "b", "c"]; var sid = ["Go"]; for (var key in arr) { sid[parseInt(key) + 1] = arr[key]; } console.log(sid)
以避免如上的問題。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85155.html
目錄 1.為什要遵守代碼規(guī)范 2.編寫代碼需遵守的幾個原則 3.編碼規(guī)范(Coding Conventions) 4.命名規(guī)范(Naming Conventions) 5.css基礎(chǔ)class類 1.為什要遵守代碼規(guī)范 軟件bug的修復是昂貴的,并且隨著時間的推移,這些bug的成本也會增加,尤其當這些bug潛伏并慢慢出現(xiàn)在已經(jīng)發(fā)布的軟件中時。當你發(fā)現(xiàn)bug 的時候就立即修復它是最好的,此時你代...
摘要:訪問全局對象在瀏覽器中,全局對象可以通過屬性在代碼的任何位置訪問除非你做了些比較出格的事情,像是聲明了一個名為的局部變量。 前言 才華橫溢的Stoyan Stefanov,在他寫的由O’Reilly初版的新書《JavaScript Patterns》(JavaScript模式)中,我想要是為我們的讀者貢獻其摘要,那會是件很美妙的事情。具體一點就是編寫高質(zhì)量JavaScript的一些要素...
摘要:語法參數(shù)當前遍歷項。遍歷的范圍在第一次調(diào)用前就會確定。已刪除的項不會被遍歷到。的是由提出的,目的是作為遍歷所有數(shù)據(jù)結(jié)構(gòu)的統(tǒng)一方法。不僅可以遍歷數(shù)組,還可以遍歷結(jié)構(gòu),某些類似數(shù)組的對象如對象對象,對象,以及字符串。 即使是最簡單的循環(huán),其中也深藏學問 ECMAScript5(es5)有三種for循環(huán) 簡單for for in forEach ECMAScript6(es6)新增 fo...
摘要:使用原型模式添加方法和屬性在前面的章節(jié)中,已經(jīng)學習過了如何定義一個構(gòu)建新對象時使用的構(gòu)造函數(shù)。向構(gòu)造函數(shù)的中添加方法和屬性是在對象被創(chuàng)建的時候為對象添加功能的另一種方式。讓我們繼續(xù)使用對象作為構(gòu)造函數(shù)的原型屬性。 本文原文來源:《Object-Oriented JavaScript》By Stoyan Stefanov本文翻譯來源:赤石俊哉 原創(chuàng)翻譯版權(quán)申明: 如果您是原文的原作者并且...
摘要:前幾天一個朋友在微信里面問我一個關(guān)于數(shù)組排序的問題。對數(shù)組的進行排序,然后把排完序的數(shù)組進行處理。翻譯成編程術(shù)語就是排序算法是不穩(wěn)定排序。因此第二個排序算法會把移動到最后,然后對剩余的數(shù)據(jù)進行排序。 前幾天一個朋友在微信里面問我一個關(guān)于 JS 數(shù)組排序的問題。 原始數(shù)組如下: var data = [ {value: 4}, {value: 2}, {value: un...
閱讀 1391·2021-11-04 16:11
閱讀 3050·2021-10-12 10:11
閱讀 2986·2021-09-29 09:47
閱讀 1622·2021-09-22 15:40
閱讀 1021·2019-08-29 15:43
閱讀 2811·2019-08-29 13:50
閱讀 1588·2019-08-29 13:28
閱讀 2697·2019-08-29 12:54