原題描述:
不使用 loop 循環(huán)盖高,創(chuàng)建一個長度為 100 的數(shù)組卧蜓,并且每個元素的值等于它的下標(biāo)
這個問題的一些變種例如給一個長度 length 和 value烦秩,返回長度為 length 值全為 value 的數(shù)組等粒蜈。
1.誤區(qū)
最容易掉入陷阱的:
var arr = new Array(100);
arr = arr.map(function(item, index) {
return index;
});
// (100) [empty × 100]
2.解釋
坑在 Array(100)荷憋,可以看看MDN的規(guī)范。
在 47版本 Chrome 下(或者早些的 Chrome 版本)承绸,new Array(10) 會返回[ undefined,undefined,undefined,…….(100) ]裸影,
但這個 undefined 又跟你直接聲明的 [ undefined,undefined,undefined,…….(100) ] 不同
[ null, null ].map((item, index) => index); // [ 0, 1 ]
[ undefined, undefined ].map((item, index) => index); // [ 0, 1 ]
const b =new Array(100);
b.map((item, index) => index); // (100) [empty × 100]
3.正確的解決
其實(shí)這道題的面試官當(dāng)時是說不用loop的情況下的解決方案,用Array方法的話其實(shí)都是屬于loop八酒,目的是考察遞歸:
1. 遞歸+自執(zhí)行函數(shù)
var arr = [];
(function dfs(i) {
if (i < 100) {
arr.push(i);
dfs(++i);
}
}(0));
2. 轉(zhuǎn)化成字符串
Array(100).join(",").split(",").map(function(key,index) { return index })
3. apply轉(zhuǎn)換一下空民,可以看到j(luò)s的大多數(shù)坑的解決都有apply的身影。羞迷。界轩。
Array.apply(null, Array(100)).map((item,index) => index)
apply 在 es5 可以加類數(shù)組對象,在傳入的時候衔瓮,由于每一項(xiàng)的值都是不存在的浊猾,相當(dāng)于進(jìn)去的是 undefined(這里的 undefined 是真真切切的 undefined 。热鞍。葫慎。)
4. Int8Array
new Int8Array(100).map((item,index) => index)
Int8Array的規(guī)范可以看相關(guān)文檔
補(bǔ)充的解法
第一種
var ary = [];
ary.valueOf = function() {
ary.push(ary.length)
ary.length<100 && +ary
}
+ary
- js 里的 + 號在不同表達(dá)式里有不同含義
- 在這里,是加號
- 加號后面跟一個數(shù)組薇宠,觸發(fā)了隱式轉(zhuǎn)換
- 數(shù)組的隱式轉(zhuǎn)換包含兩個偷办,toString 和 valueOf,根據(jù)數(shù)組的隱式轉(zhuǎn)換規(guī)則澄港,這里調(diào)用 valueOf
- 但是 ary 的 valueOf 被改寫了椒涯,改成了看到的那個函數(shù),那個函數(shù)里每次會給 ary 新加一個與下標(biāo)相同的元素
- 如果下標(biāo)還沒到 100回梧,就再 +ary 一次废岂,相當(dāng)于又調(diào)用了一次 valueOf
- 于是就形成了遞歸
第二種
[...Object.keys(window).slice(0, 100)].map((v, i) => i);
// (100) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
轉(zhuǎn)載 https://blog.csdn.net/major_zhang/article/details/79616974