JS编程建议——50:正确检测数组类型

建议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]';

};

时间: 2024-09-22 03:01:14

JS编程建议——50:正确检测数组类型的相关文章

JS编程建议——19:不要使用类型构造器

建议19:不要使用类型构造器在默认状态下,JavaScript预定义了很多构造函数,如Function().Array().Date().string()等,如果去掉小括号,它们就是JavaScript内置对象.在JavaScript中,构造函数实际上就是类的一种抽象结构.利用new运算符调用构造函数,可以快速生成很多实例对象.例如: var f = new Function(p1, p2, ..., pn, body); 其中构造函数Function()的参数类型都是字符串,p1-pn表示所创

JS编程建议——51:理解数组长度的有限性和无限性

建议51:理解数组长度的有限性和无限性每个数组都有一个length属性.和大多数其他语言不同,JavaScript数组的length是没有上限的.如果用大于或等于当前length的数字作为下标来保存一个元素,那么length将增大以容纳新元素,不会发生数组边界错误.length属性的值是这个数组的最大整数属性名加上1.它不一定等于数组中属性的个数.例如,下面数组myArray最后长度为10001,但它仅包含一个元素:var myArray = [];myArray.length // 0myAr

JS编程建议——62:在循环体和异步回调中慎重使用闭包

建议62:在循环体和异步回调中慎重使用闭包闭包在开发中具有重要的应用价值,由于闭包具有持久性,生成的闭包不会立即被销毁,因此它会持续占用系统资源.如果大量使用闭包,将会造成系统资源紧张,甚至导致内存溢出等错误.另外,闭包在回调函数中会带来负面影响,因此在使用时应该慎重.下面的示例利用闭包来存储变量所有变化的值.function f( x ){ var a = []; for ( var i = 0; i < x.length; i ++ ){ var temp = x[i]; a.push( f

JS编程建议——6:正确处理JavaScript特殊值(2)

建议6:正确处理JavaScript特殊值(2)与null不同,undefined不是JavaScript的保留字,在ECMAScript v3标准中才定义undefined为全局变量,初始值为undefined.因此,在使用undefined值时就存在一个兼容问题(早期浏览器可能不支持undefined).除了直接赋值和使用typeof运算符外,其他任何运算符对undefined的操作都会引发异常.不过,可以声明undefined变量,然后查看它的值,如果它的值为undefined,则说明浏览

JS编程建议——6:正确处理JavaScript特殊值(1)

建议6:正确处理JavaScript特殊值(1)1.正确使用NaN和InfinityNaN是IEEE 754中定义的一个特殊的数量值.它不表示一个数字,尽管下面的表达式返回的是true. typeof NaN === 'number' // true 该值可能会在试图将非数字形式的字符串转换为数字时产生,例如: '0' // 0 'oops' // NaN 如果NaN是数学运算中的一个运算数,那么它与其他运算数的运算结果就会是NaN.如果有一个表达式产生出NaN的结果,那么至少其中一个运算数是N

JS编程建议——11:慎重使用伪数组

建议11:慎重使用伪数组JavaScript没有真正的数组,因此typeof运算符不能辨别数组和对象.伪数组在JavaScript中有很高的易用性,程序员不用给它设置维度,而且永远不用担心产生越界错误,但JavaScript数组的性能相比真正的数组可能更糟糕.要判断一个值是否为数组,必须使用constructor属性,例如: if(value && typeof value === 'object' && value.constructor === Array) { } a

JS编程建议——28:使用查表法提高条件检测的性能

建议28:使用查表法提高条件检测的性能当有大量离散值需要测试时,使用if和switch都比使用查表法要慢得多.在JavaScript中查表法可通过数组或普通对象实现,查表法访问数据比if和switch更快,特别是当条件体的数目很大时.与if和switch相比,查表法不仅非常快,而且当需要测试的离散值数量非常大时,也有助于保持代码的可读性.例如,在下面代码中,使用switch检测value值. switch(value) { case 0: return result0; case 1: retu

JS编程建议——64:建议通过Function扩展类型

建议64:建议通过Function扩展类型JavaScript允许为语言的基本数据类型定义方法.通过为Object.prototype添加原型方法,该方法可被所有的对象使用.这样的方式对函数.数组.字符串.数字.正则表达式和布尔值都适用.例如,通过给Function. prototype增加方法,使该方法对所有函数可用.Function.prototype.method = function(name, func) { this.prototype[name] = func; return th

JS编程建议——78:正确理解执行上下文和作用域链

建议78:正确理解执行上下文和作用域链执行上下文(execution context)是ECMAScript规范中用来描述 JavaScript 代码执行的抽象概念.所有的 JavaScript 代码都是在某个执行上下文中运行的.在当前执行上下文中调用 function会进入一个新的执行上下文.该function调用结束后会返回到原来的执行上下文中.如果function在调用过程中抛出异常,并且没有将其捕获,有可能从多个执行上下文中退出.在function调用过程中,也可能调用其他的functi