首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议50:正确检测数组类型

关灯直达底部

由于数据和对象的数据同源性,导致在JavaScript编程中经常会出现:在必须使用数组时使用了对象,或者在必须使用对象时使用了数组。

选用数组或对象的规则很简单:当属性名是小而连续的整数时,应该使用数组,或者当对属性的位置和排列顺序有要求时,应该使用数组。否则,使用对象。

JavaScript语言对数组和对象的区别是混乱的。typeof运算符检测数组的类型是“object”,这没有什么意义,因此在正确检测数组和对象方面JavaScript没有提供很多的机制。这时可以通过自定义is_array函数来弥补这个缺陷。


var is_array=function(value){

return value&&typeof value==='object'&&value.constructor===Array;

};


不过,上面函数在识别从不同的窗口(window)或帧(frame)中构造的数组时会失败,要想准确地检测外部数组类型,还需要更进一步地完善该函数。


var is_array=function(value){

return value&&

typeof value==='object'&&

value.constructor===Array&&

typeof value.length==='number'&&

typeof value.splice==='function'&&

!(value.propertyIsEnumerable('length'));

};


在完善后的函数中,首先要判断这个值是否为真,函数不接受null和其他值为假的值。其次,判断对这个值的typeof运算的结果是否是object。对于对象、数组和null来说,得到的都将是true。接着,判断这个值是否有一个值为数字的length属性,对于数组将总是得到true,而对于对象来说并非如此。接下来,判断这个值是否包含一个splice方法。对于所有数组来说,这又将得到true。最后,判断length属性是否是可枚举的,对于所有数组来说,将得到false,这是对数组最可靠的测试。

不过,使用下面的方法也能够很好地检测数组类型,并且这种方法显得更加简洁。


var is_array=function(value){

return Object.prototype.toString.apply(value)==='[object Array]';

};