类数组
- 类数组必须有length属性
- 类数组继承于Object.prototype。而数组继承于Array.prototype
//《javascript权威指南》上判断是否是类数组的方法
function isArrayLike(o) {
if (o && // o 不能为null、undefined、 etc.
typeof o === 'object' && // o 是 object
isFinite(o.length) && // o.length 是一个有限数
o.length >= 0 && // o.length 是一个正数
o.length===Math.floor(o.length) && // o.length 是一个整数
o.length < 4294967296) // o.length < 2^32
return true; // 满足条件就是类数组
else
return false; // 否则就不是类数组
}
示例
var arrLike = {
'0' : 'a',
'1' : 'b',
'2' : 'c',
'3' : 'd',
'4' : 'e',
length : 5
}
console.log(arrLike);
arguments
- 是function的一个属性
- 是函数内部的参数值的实参列表,是一个类数组对象,内置的局部变量
- 非箭头函数有arguments属性
- 形参和实参有对应关系
function test (a){
console.log(a);
//当arguments改变时,a值也跟着改变。两者时对应关系
arguments[0] = 100;
console.log(a,arguments[0])
console.log(Object.prototype.toString.call(arguments))
}
test(10);
//10
//100 100
//[object Arguments]
arguments共享关系的解除
//在严格模式下,形参和arguments之间的共享解除了
function test(a){
'use strict';
console.log(a,arguments[0]);
a = 100;
console.log(a,arguments[0]);
}
test(10);
//打印值:
//10 10
//100 10
//当参数有默认值的时候,形参和arguments之间的对应关系解除了
function test(a = 1){
console.log(a);
arguments[0] = 100;
console.log(a,arguments[0]);
}
test(10);
//打印值
// 10
// 10 100
//使用扩展运算符传入参数的时候,形参和arguments之间的对应关系解除
function test(...args){
console.log(args,arguments);
arguments[0] = 100;
arguments[1] = 200;
console.log(args,arguments);
}
test(1, 2);
//打印值
// [1, 2] Arguments(2) [1, 2, callee: (...), Symbol(Symbol.iterator): ƒ]
// [1, 2] Arguments(2) [100, 200, callee: (...), Symbol(Symbol.iterator): ƒ]
//使用结构赋值的时候,形参和arguments之间的对应关系也会被解除
function test({a,b}){
console.log(a);
console.log(b);
console.log(arguments)
arguments[0] = 100;
arguments[1] = 200;
console.log(a);
console.log(b);
console.log(arguments);
}
test({a:1,b:2});
//打印值
// 1
// 2
// Arguments [{…}, callee: (...), Symbol(Symbol.iterator): ƒ]
// 1
// 2
// Arguments [100, 1: 200, callee: (...), Symbol(Symbol.iterator): ƒ]