最近在学习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
}