同樣是在廖雪峰大佬的教程中看的教程炕桨,這里貼上廖雪峰的練習(xí)題代碼:
1、利用reduce()求積:
'use strict';
function product(arr) {
function muiltly(x,y) {
// body...
return x*y
}
return arr.reduce(muiltly)
}
//測(cè)試肯腕;
if (product([1,2,3,4]) === 24&& product([0,1,2])===0) {
console.log('測(cè)試通過')
}
else {
console.log('測(cè)試失敗!');
}
2献宫、利用map和reduce實(shí)現(xiàn)一個(gè)string2int()函數(shù)(不要使用JavaScript內(nèi)置的parseInt()函數(shù)):
這個(gè)我個(gè)人感覺還是有點(diǎn)難度的,因?yàn)槭切“住?/h3>
'use strict';
function string2int(str) {
let arr =str.split('').map(x=>x*1);//這里首先將str變成一個(gè)數(shù)組实撒,split函數(shù)了解一下姊途,但是仍然是單個(gè)字符串涉瘾,*1用來將其變成單個(gè)數(shù)字
return arr.reduce((x,y)=>10*x+y);//這里的小括號(hào)很重要,(x,y)=>10*x+y相當(dāng)于function multiply(x,y){return 10*x+y
}
// 測(cè)試:
if (string2int('0') === 0 && string2int('12345') === 12345 && string2int('12300') === 12300) {
if (string2int.toString().indexOf('parseInt') !== -1) {
console.log('請(qǐng)勿使用parseInt()!');
} else if (string2int.toString().indexOf('Number') !== -1) {
console.log('請(qǐng)勿使用Number()!');
} else {
console.log('測(cè)試通過!');
}
}
else {
console.log('測(cè)試失敗!');
}
3捷兰、把用戶輸入的不規(guī)范的英文名字立叛,變?yōu)槭鬃帜复髮懀渌懙囊?guī)范名字寂殉。輸入:['adam', 'LISA', 'barT']囚巴,輸出:['Adam', 'Lisa', 'Bart']
function normalize(arr) {
// body...
// function nor(x) {
// return x.substring(0,1).toUpperCase()+x.substring(1).toLowerCase()
// }
return arr.map(x=>x.substring(0,1).toUpperCase()+x.substring(1).toLowerCase())
}
4原在、小明希望利用map()把字符串變成整數(shù)友扰,他寫的代碼很簡(jiǎn)潔:
'use strict';
var arr = ['1', '2', '3'];
var r;
r = arr.map(parseInt);
console.log(r);
'use strict';
function string2int(str) {
let arr =str.split('').map(x=>x*1);//這里首先將str變成一個(gè)數(shù)組实撒,split函數(shù)了解一下姊途,但是仍然是單個(gè)字符串涉瘾,*1用來將其變成單個(gè)數(shù)字
return arr.reduce((x,y)=>10*x+y);//這里的小括號(hào)很重要,(x,y)=>10*x+y相當(dāng)于function multiply(x,y){return 10*x+y
}
// 測(cè)試:
if (string2int('0') === 0 && string2int('12345') === 12345 && string2int('12300') === 12300) {
if (string2int.toString().indexOf('parseInt') !== -1) {
console.log('請(qǐng)勿使用parseInt()!');
} else if (string2int.toString().indexOf('Number') !== -1) {
console.log('請(qǐng)勿使用Number()!');
} else {
console.log('測(cè)試通過!');
}
}
else {
console.log('測(cè)試失敗!');
}
function normalize(arr) {
// body...
// function nor(x) {
// return x.substring(0,1).toUpperCase()+x.substring(1).toLowerCase()
// }
return arr.map(x=>x.substring(0,1).toUpperCase()+x.substring(1).toLowerCase())
}
'use strict';
var arr = ['1', '2', '3'];
var r;
r = arr.map(parseInt);
console.log(r);
結(jié)果:
1,NaN,NaN
結(jié)果竟然是1, NaN, NaN,小明百思不得其解庶柿,請(qǐng)幫他找到原因并修正代碼村怪。
我的代碼:
'use strict';
var arr = ['1', '2', '3'];
var r;
r = arr.map(x=>x*1)
// r = arr.map(parseInt);
console.log(r);
當(dāng)然,這雖然可以運(yùn)行正確浮庐,但是沒有說明為什么小明同學(xué)的代碼運(yùn)行的結(jié)果是什么原因?qū)е碌摹?br> 其實(shí)這里有一定的難度甚负,因?yàn)閙ap這個(gè)函數(shù)實(shí)際上是這個(gè)樣子的
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// Return element for new_array }[,
thisArg])
反正我不是很理解,大概意思就是說审残,map調(diào)的函數(shù)梭域,會(huì)調(diào)函數(shù)中的三個(gè)參數(shù):
currentValue|必填
callback 數(shù)組中正在處理的當(dāng)前元素。
index|可選
callback 數(shù)組中正在處理的當(dāng)前元素的索引搅轿。
array|可選
callback map 方法被調(diào)用的數(shù)組病涨。
thisArg|可選
執(zhí)行 callback 函數(shù)時(shí)使用的this 值。
然而對(duì)于parseInt這個(gè)函數(shù)來說呢璧坟,它會(huì)有兩個(gè)傳入?yún)?shù):
parseInt(string, radix)
一般情況下既穆,第二個(gè)為空,取0雀鹃,沒什么問題幻工,但是在小明這個(gè)案例中,出現(xiàn)了點(diǎn)問題黎茎,索引傳入了囊颅,索引如果是1-4的話,那么都會(huì)是NaN傅瞻,但是5-36是正常的踢代,然后36之后又是不正常的了。
因?yàn)閷?duì)于parseIn函數(shù)來說俭正,參數(shù)string(必須):表示的是要被解析的字符串奸鬓。radix(可選):表示表示要解析的數(shù)字的基數(shù)。該值介于 2 ~ 36 之間掸读。如果省略該參數(shù)或其值為 0串远,則數(shù)字將以 10 為基礎(chǔ)來解析宏多。如果它以 “0x” 或 “0X” 開頭,將以 16 為基數(shù)澡罚。如果該參數(shù)小于 2 或者大于 36伸但,則 parseInt() 將返回 NaN。