JavaScript 数组的常见误区与实用技巧
本文探讨 JavaScript 数组使用中常见的误区,重点解析为何使用字符串作为键值时数组长度始终为 0。文章指出数组应仅用于数值索引,键值对应使用对象。同时介绍了利用 Object.prototype.toString 进行类型判断的 Miller Device 技巧,以及数组动态调整大小的特性。
JavaScript 数组使用误区:字符串键值与长度
早年重构淘宝旺铺会员卡脚本时,偶然发现一个有趣现象。代码示例如下:
代码如下:
var associative_array = new Array();
associative_array["one"] = "1";
associative_array["two"] = "2";
associative_array["three"] = "3";
if(associative_array.length > 0)
{ // to do}此时 associative_array.length 始终为 0,起初令人困惑,这类似误以为 IE 支持 CSS display:inline-block,实为巧合与误解。
实际上(引自《JavaScript “Associative Arrays” Considered Harmful》):
JavaScript arrays (which are meant to be numeric) are often used to hold key/value pairs. This is bad practice. Object should be used instead.
//大意:数组仅支持数字索引,键值对应使用对象。
There is no way to specify string keys in an array constructor. //在数组构造函数中无法定义字符串键值
There is no way to specify string keys in an array literal. //在数组字面量中无法定义字符串键值
Array.length does not count them as items. // Array.length 不会计算字符串键值
数组特性:动态大小与类型判断技巧
进一步探究数组特性:
1、数组可根据赋值自动调整大小
代码如下:
var ar = [];
ar[2] = 1;
alert(ar.length)结果数组长度为 3,如同已初始化。未赋值的数组元素被定义为 undefined 。
扩展阅读:
- 《Javascript Array Fun》
2、可使用 “The Miller Device” 方法判断是否为数组
代码如下:
function isArray(o) { return Object.prototype.toString.call(o) === '[object Array]';}“The Miller Device” 的妙用不仅限于判断数组:
代码如下:
var is = {
types : ["Array","RegExp","Date","Number","String","Object"]
};
for(var i=0,c;c=is.types[i++];){
is[c] = (function(type){
return function(obj){
return Object.prototype.toString.call(obj) == “[object "+type+"]“;
}
})(c);
}扩展阅读:
- 《The Miller Device》
- 《isArray: Why is it so bloody hard to get right?》
ES6模块化中js文件怎么用import和export交互
2026-11-05 17:00:48
JS读取本地文件时报错或无响应的常见原因
2026-11-05 16:32:31
let、const与var的区别:JavaScript变量声明最佳实践
2026-11-05 14:16:38
JS中直接定义静态二维数组的字面量写法
2026-11-05 14:16:08
JS 怎么查找字符串中所有匹配项的位置
2026-11-05 14:15:53
