Contents

关于JS函数的多参数处理

我们先来看个例子(提供:Mephisto)

1
2
3
4
5
6
7
8
9
10
11
12
//模长计算公式
function mag(){
var arg = Array.prototype.slice.call(arguments)
var mag = 0
for(var i=0; arg[i] !== undefined ;i++)
if (typeof arg[i] !== "number"){
mag += arg[i]*arg[i]
} else break
return Math.sqrt(mag)
}
//使用
mag(3, 4, 12) //13

当初为了理解这个函数,我写了一个例子

1
2
3
4
5
6
7
function fun1(){
return arguments
}
function fun2(){
return Array.prototype.slice.call(arguments)
}

方便起见,写两个例子

1
2
3
4
5
6
7
function ins1(){
fun1(undefined, 2, "3")
}
function ins2(){
fun2(undefined, 2, "3")
}

重头戏开始!
当我传入相同参数的时候,发生了这样的现象:

1
2
ins1() //[undefined, 2, "3"]
ins2() //[undefined, 2, "3"]

靠,那为啥不直接使用arguments呢,不理解

随即测试

1
2
typeof ins1() //"object"
typeof ins2() //"object"

这自然,数组本身也是对象

略微思考了一会,然后测试

1
2
ins1() instanceof Array //false
ins2() instanceof Array //true

到这里我马上明白,经过Array.prototype.slice.call处理带有length属性的对象之后,会返回一个数组的实例,这样就可以调用原本没有的Array的方法了,类似的String.prototype.slice.call同理。

另外,就上面最初的那个函数而言,使用arguments也没问题,大丈夫萌大奶。

BTW,Function.prototype.call方法理解起来实在太抽象,实质是改变this指向的对象,我每次看到都会慌慌的,dokidoki。

Contents