对js中arguments(ES5)的理解
1、认识arguments
①默认就存在函数中的,是一个 对应于传递给函数的参数 的 类数组(array-like)对象,(长的像是一个数组, 本质上是一个对象): arguments
②array-like意味着它不是一个数组类型,而是一个对象类型:
但是它却拥有数组的一些特性,比如说length,以及可以通过index索引来访问;
但是它却没有数组的一些方法,比如forEach、map等;
function foo(num1, num2, num3) {
console.log(arguments);
//[Arguments] { '0': 10, '1': 20, '2': 30, '3': 40, '4': 50 }
// 常见的对arguments的操作是三个
// 1.获取参数的长度
console.log(arguments.length); //5
// 2.根据索引值获取某一个参数
console.log(arguments[2]); //30
console.log(arguments[3]); //40
console.log(arguments[4]); //50
// 3.callee获取当前arguments所在的函数
console.log(arguments.callee); //[Function: foo]函数自身
}
foo(10, 20, 30, 40, 50);
2、arguments(对象)转成array(自己实现)
2.1、数组的slice方法实现
// 额外补充的知识点: Array中的slice实现;
Array.prototype.hhslice = function (start, end) {
var arr = this;
start = start || 0;
end = end || arr.length;
var newArray = [];
for (var i = start; i < end; i++) {
newArray.push(arr[i]);
}
return newArray;
};
//测试:
//自己实现的slice方法
var newArray = Array.prototype.hhslice.call(["aaaa", "bbb", "cccc"]
,1, 3);
console.log(newArray); //[ 'bbb', 'cccc' ]
//系统中数组的slice方法
var names = ["aaa", "bbb", "ccc", "ddd"];
console.log(names.slice(1, 3)); //['bbb', 'ccc']
2.2、自己实现arguments转成array类型
//自己实现arguments转成array类型
function foo(num1, num2) {
// 1.自己遍历arguments中所有的元素,并将每一个值扩大十倍
// var newArr = []
// for (var i = 0; i < arguments.length; i++) {
// newArr.push(arguments[i] * 10)
// }
// console.log(newArr) //[ 100, 200, 300, 400, 500 ]
// 2.Array.prototype.slice将arguments转成array
var newArr2 = Array.prototype.slice.call(arguments)
console.log(newArr2) //[ 10, 20, 30, 40, 50 ]
//或
var newArr3 = [].slice.call(arguments)
console.log(newArr3) //[ 10, 20, 30, 40, 50 ]
// 2.3.ES6的语法
var newArr4 = Array.from(arguments)
console.log(newArr4) //[ 10, 20, 30, 40, 50 ]
//或
var newArr5 = [...arguments]
console.log(newArr5) //[ 10, 20, 30, 40, 50 ]
}
foo(10, 20, 30, 40, 50)
3、箭头函数不绑定arguments
①箭头函数是不绑定arguments的,所以我们在箭头函数中使用arguments会去上层作用域查找
②在浏览器中,全局对象中没有定义arguments,找不到会报错(arguments is not defined)
而在node环境中,全局对象有定义arguments
// 1.案例一:
var foo = () => {
console.log(arguments);
};
foo();
// 在浏览器中,全局对象中没有定义arguments,会报错
// 在node环境中,全局对象有定义arguments
// 2.案例二:
function foo() {
var bar = () => {
console.log(arguments);
};
return bar;
}
var fn = foo(123);
fn(); //[Arguments] { '0': 123 } 在上层作用域中找到Arguments