对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

猜你喜欢

转载自blog.csdn.net/weixin_53737663/article/details/127173310