最近在學習es6,看到for-of這里,就想自己寫着練習一下,於是就准備寫一個小函數add來求和。函數很簡單,如add(1,2,3)這樣。於是我開始着手
一開始我是這么寫的
function add(){
var result=0;
for (var i = 0; i < arguments.length; i++) {
result+=arguments[i]
}
return result
}
啪啪啪馬上就寫好了,最基本的方法,不過好像太簡單了,着手升級一下。
用數組的方法寫一下
function add(){
var result=0;
arguments.forEach(function(item){
result+=item
})
return result
}
提示報錯:Uncaught TypeError: arguments.forEach is not a function
不可能,我明明都能打印出他的length出來
我肯定是遇到了一個假數組
確實,arguments看起來是個數組,但是並不是一個真正的數組。
打開chrome控制台,可以發現他跟真正的數組的區別;

對比兩者的原型可以發現,arguments的原型指向的是object,而數組指向的是array
這讓我想起一個笑話:
剛剛從大學本科畢業的小明決定買房,雖然他只有3000的月薪,但是他花了一年就做到了。一年后他那着存的3萬元和他父親給他的297萬,終於買了房和車。
沒辦法人家是親生的,[ ]雖然自己沒有forEach方法,但是他父親Array有啊,需要的時候直接就拿過來了。但是arguments指向的是object,他父親也沒錢給他買房,那怎么辦,只好到處借了。
先像七大姑借了forEach過來
function add(){
var result=0;
Array.prototype.forEach.call(arguments,(i)=>{
result+=i;
})
return result
}
好像還不夠,又像八大姨借了reduce過來
function add(){
return Array.prototype.reduce.call(arguments,(pre,next)=>{
return pre+next
})
}
雖然籌夠錢買房了,但是思來思去,總是借錢了不好,於是發奮塗牆,期望不用借錢也能自己買房
1.Array.from:將一個 ArrayLike 對象或者 Iterable 對象轉換成一個 Array。
function add(){
var arr=Array.from(arguments);
return arr.reduce(arguments,(pre,next)=>{
return pre+next
})
}
2.展開運算符
function(...arg){
return arg.reduce((pre,next)=>{
return pre+next
})
}
3.當然最簡單的for of
function(){
var result=0;
for(const i of arguments){
result+=i
};
return result
}
