Javscript Array 探讨

虽然 Javscript Array 是对象,typeof [] == 'object',但作为系统内置的对象类型并不同于我们自己建造的对象。

 

如下代码:

 

Array.prototype.custom=function(){
	alert('custom');
};
var f=[1];
f.custom();

for(var i in f) {
    alert(i +' - '+f[i]);
}

f['0']=2;
alert(f[0]);

f['a']=1;

//只打印用户设置属性
for(var i in f) {
    alert(i +' - '+f[i]);
}

alert(f.length);


那么看一下 我们自己模拟的 Array :

 

function EmulateArray() {
   this.length=0;
}

EmulateArray.prototype.substring=function(){alert(1);};

var x=new EmulateArray();

//把属性和方法都打出来了
for(var i in x) {
    alert(i +'-'+x[i]);
}

 

 

那么总结一下,系统原生对象(特别Array) 和我们平常自己构造的对象的差异吧:

 


1.数组实际上是下标为属性,对应下标值为该属性值的对象,且属性能转成数字会自动转成下标数字 。(注意:平常对象属性值数字和数字字符串也不区分的,相当于数字作为属性时会转化成数字字符串)

2.for in 循环数组属性时,并不会列出数组的方法以及length属性,只会列出数组的所有用户设置属性(包括在Array类中的属性,方法),包括数字和非数字属性 ,方法

3.length 实际上等于数组对象最大的数字属性值+1

4.当访问 f[x] 时,实际上就是访问 f对象的x属性,


5.同理,对于new String(),new Date(),new Number .... 对于 for in 更不会有任何输出

 

 

ps:关于Array  类型的判断:

 

1.直接判断构造函数

 

x && x.constructor === Array


缺点:在判断来自不同window,frame的数组对象时失效

 

2.鸭子判断 (duck judge)


x && typeof x.length === 'number' && typeof x.splice === 'function' &&

!x.propertyIsEnumerable('length')


缺点:不能100%判断

 

3.简洁的平台相关判断


x && Object.prototype.toString.call(x) === '[object Array]'


缺点:无标准规定

 


PS: 关于 object 属性方法的枚举


javascript 中 object 的 toString() ,toLocalString(),valueOf(),hasOwnProperty(),isPrototypeOf(),

propertyIsEnumerable() 都是不能枚举的内置方法。在 for in 语句中不能遍历到这些方法属性。


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值