Arguments(Array-Like Objects)
arguments
对象是所有(非箭头)函数中都可用的局部变量
拥有四个属性(按照规范来说只有三个了----caller)
- arguments.callee---指向当前执行的函数
- agruments.caller----指向调用当前函数的函数 (已移除)
- arguments.length---指向传递给当前函数的参数数量
- arguments.arguments--- 返回一个新的Array迭代器对象,该对象包含参数中每个索引的值
arguments
对象可以与剩余参数、默认参数和解构赋值参数结合使用
function func(...args){ return args } func(1,2,3) // [1,2,3] /* --------------------------------------------------------- */ function func(a) { arguments[0] = 99; // 更新了arguments[0] 同样更新了a console.log(a); } func(10); // 99 "use strict" func(10); // 10 /* --------------------------------------------------------- */ function func(a) { a = 99; // 更新了a 同样更新了arguments[0] console.log(arguments[0]); } func(10); // 99 "use strict" func(10); // 10 /* --------------------------------------------------------- */ function func(a = 55) { arguments[0] = 99; // 更新了arguments[0]不会更新a console.log(a); } func(10); // 10 /* --------------------------------------------------------- */ function func(a = 55) { a = 99; // 更新了a不会更新arguments[0] console.log(arguments[0]); } func(10); // 10 总结: 不在严格模式下,arguments[0]改变,会使相对应的形参也发生改变, 修改形参,arguments[0]也会相应被修改 而在严格模式则不会被修改
数组
拥有三个属性,3个方法,N个实例方法(原谅我不数了)
数组是一种类列表对象,它的原型中提供了遍历和修改元素的相关操作
数组与Arguments的区别
数组是构造函数 typeof Array ( function)
Arguments是所有(非箭头)函数中都可用的局部变量 使用方式只能在函数中
将Arguments转为Array的方法(摘自hanzichi老师)
function fn() { // Uncaught TypeError: arguments.push is not a function // arguments.push(4); var arr = []; for (var i = 0, len = arguments.length; i < len; i++) arr[i] = arguments[i]; arr.push(4); // [1, 2, 3, 4] } fn(1, 2, 3); /* ------------------------------------------ */ function fn() { var arr = Array.prototype.slice.call(arguments); arr.push(4); // arr -> [1, 2, 3, 4] } fn(1, 2, 3); 或者可以用 [] 代替 Array.prototype 节省几个字节。 function fn() { var arr = [].slice.call(arguments); arr.push(4); // arr -> [1, 2, 3, 4] } fn(1, 2, 3); /* ------------------------------------------ */ // es6语法 var str = "helloworld"; var arr = Array.from(str); // ["h", "e", "l", "l", "o", "w", "o", "r", "l", "d"] /* ------------------------------------------ */ // 兼容ie方法 function nodeListToArray(nodes){ var arr, length; try { // works in every browser except IE arr = [].slice.call(nodes); return arr; } catch(err){ // slower, but works in IE arr = []; length = nodes.length; for(var i = 0; i < length; i++){ arr.push(nodes[i]); } return arr; } }