1.函数对象的属性
我们知道JavaScript中函数也是对象,那么对象中就可以有属性和方法
属性name:一个函数的名称我们可以通过name来访问;
function foo(){
}
console.log(foo.name) // foo
var bar = function(){
}
console.log(bar.name) // bar
属性length:属性length用于返回函数参数的个数:
rest参数是不参与参数的个数的;
var baz = (name, age, ...args) => {
}
console.log(baz.length)
2.认识arguments
arguments是一个对应于传递给函数的参数的类数组对象。
- 但是它却拥有数组的一些特性,比如length,可以通过index索引来访问;
- 它没有数组的一些方法,比如filter、map等。
arguments转Array
在开发中,我们经常需要将arguments转成Array,以便使用数组的一些特性。
常见的转化方式
1.遍历arguments,添加到一个新数组中。
var length = arguments.length
var arr = []
for (var i = 0; i < length; i++) {
arr.push(arguments[i])
}
console.log(arr)
2.调用数组slice函数的call方法(少用)
var arr1 = Array.prototype.slice.call(arguments);
var arr2 = [].slice.call(arguments)
3.ES6的两个方法
Array.from
[...arguments]
const arr3 = Array.from(arguments)
const arr4 = [...arguments]
箭头函数不绑定arguments
箭头函数是不绑定arguments的,所以我们在箭头函数中使用arguments会去上层作用域查找
console.log(arguments)
var foo = (x, y, z) =>{
console.log(arguments)
}
foo(10, 20, 30)
function bar (m, n){
return (x, y, z) => {
console.log(arguments)
}
}
3.函数的剩余(rest)参数
ES6中引用了rest parameter,可以将不定数量的参数放进一个数组中:
如果最后一个参数是...为前缀的,那么它会将剩余的参数放到该参数中,并且作为一个数组;
function foo(m, n, ...args){
console.log(m, n)
console.log(args)
}
那么剩余参数和arguments有什么区别呢?
剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参;
arguments对象不是一个真正的数组,而rest参数是一个真正的数组,可以进行数组的所有操作;
arguments是早期的ECMAScript中为了方便去获取所有的参数提供的一个数据结构,而rest参数是ES6中提供并且希望以此 来替代arguments的;
剩余参数必须放到最后一个位置,否则会报错。