认识arguments
-
arguments 是一个 对应于 传递给函数的参数 的 类数组(array-like) 对象
-
array-like意味着它不是一个数组类型,而是一个对象类型:
- 但是它却拥有数组的一些特性,比如说length,比如可以通过index索引来访问;
- 但是它却没有数组的一些方法,比如forEach、map等;
function foo(num1, num2, num3) {
// 类数组对象中(长的像是一个数组, 本质上是一个对象): arguments
// console.log(arguments)
// 常见的对arguments的操作是三个
// 1.获取参数的长度
console.log(arguments.length)
// 2.根据索引值获取某一个参数
console.log(arguments[2])
// 3.callee获取当前arguments所在的函数
console.log(arguments.callee)
// arguments.callee() // 递归
}
foo(10, 20, 30, 40, 50)
arguments转成array
function foo(num1, num2) {
// 1.自己遍历
// var newArr = []
// for (var i = 0; i < arguments.length; i++) {
// newArr.push(arguments[i] * 10)
// }
// console.log(newArr)
// 2.arguments转成array类型
// 2.1.自己遍历arguments中所有的元素
// 2.2.Array.prototype.slice将arguments转成array
var newArr2 = Array.prototype.slice.call(arguments)
console.log(newArr2)
var newArr3 = [].slice.call(arguments)
console.log(newArr3)
// 2.3.ES6的语法
var newArr4 = Array.from(arguments)
console.log(newArr4)
var newArr5 = [...arguments]
console.log(newArr5)
}
foo(10, 20, 30, 40, 50)
// 额外补充的知识点: Array中的slice实现
// Array.prototype.hyslice = 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
// }
// .call 的目的是 让this指向传入的对象
// var newArray = Array.prototype.hyslice.call(["aaaa", "bbb", "cccc"], 1, 3)
// console.log(newArray)
// var names = ["aaa", "bbb", "ccc", "ddd"]
// names.slice(1, 3)
箭头函数不绑定arguments
箭头函数不绑定arguments,会从上层作用域找
浏览器全局不含arguments
node全局含arguments
// 1.案例一:
// var foo = () => {
// console.log(arguments) //浏览器中会报错
// }
// foo()
// 2.案例二:
// function foo() {
// var bar = () => {
// console.log(arguments)
// }
// return bar
// }
// var fn = foo(123)
// fn() // **从上层作用域找** {123}
// 3.案例三:
var foo = (num1, num2, ...args) => {
console.log(args)
}
foo(10, 20, 30, 40, 50) // [30, 40, 50]