定义
1.具有索引属性(数字)
2.有length属性
3.最好加上push属性
运用
arguments是常见的类数组
类数组不具备数组原型的方法,使用其方法会报错
function test() {
console.log(Array.isArray(arguments))//false
arguments.push(5)
console.log(arguments)//报错 不具备数组的push的方法
}
test(1, 2, 3, 4)
可以通过改造让类数组变成真正的数组,并拥有相关的push、slice灯相关方法
把类数组变成真正的数组,call继承Array中slice方法
function test() {
console.log(Array.prototype.slice.call(arguments))
}
test(1, 2, 3, 4)
用对象构造一个类数组
var obj = {
'0': 1,
'1': 2,
'2': 3,
'3': 4,
'length': 4,
'splice': Array.prototype.splice
}
console.log(obj)//Object(4) [1, 2, 3, 4, splice: ƒ]
给类数组增加push方法
// 方法一 推荐使用 将方法直接写在属性上
var obj = {
'0': 1,
'1': 2,
'2': 3,
'3': 4,
'length': 4,
'push': Array.prototype.push,//增加push方法
'splice': Array.prototype.splice
}
obj.push(5)
console.log(obj)//Object(4) [1, 2, 3, 4,5, splice: ƒ]
// 方法二 不推荐使用 因为所有的Object中都加了相关的方法
var obj = {
'0': 1,
'1': 2,
'2': 3,
'3': 4,
'length': 4,
}
Object.prototype.push = Array.prototype.push
Object.prototype.splice = Array.prototype.splice
obj.push(5)
console.log(obj)
类数组中push方法的实现逻辑
var obj = {
'2': 3,
'3': 4,
'length': 2,
'push': Array.prototype.push,//增加push方法
'splice': Array.prototype.splice
}
obj.push(1)
obj.push(2)
console.log(obj)//Object(4) [empty × 2, 1, 2, push: ƒ, splice: ƒ]
// 实现逻辑 把每次传的参数加在数组末尾 长度加1
// var arr = [1, 2]
// Array.prototype.push = function (item) {
// this[this.length] = item
// this.length++
// }
拓展:怎么判断一个变量是数组
1、Array.isArray判断,返回true,说明是数组
2、instanceof Array判断,返回true。说明是数组
3、使用Object.prototype.toString.call判断,如果值是[object Array],说明是数组
4、通过constructor来判断,如果是数组,那么arr.constructor === Array(不准确,因为我们可以指定obj.constructor = Array)
function fn() {
console.log(Array.isArray(arguments)); //false; 因为arguments是类数组,但不是数组
console.log(Array.isArray([1, 2, 3, 4])); //true
console.log(arguments instanceof Array); //fasle
console.log([1, 2, 3, 4] instanceof Array); //true
console.log(Object.prototype.toString.call(arguments)); //[object Arguments]
console.log(Object.prototype.toString.call([1, 2, 3, 4])); //[object Array]
console.log(arguments.constructor === Array); //false
arguments.constructor = Array;
console.log(arguments.constructor === Array); //true
console.log(Array.isArray(arguments)); //false
}
fn(1, 2, 3, 4);
网友评论