javascript 有趣而诡异的数组


Posted in Javascript onApril 06, 2009

年前在重写淘宝旺铺里的会员卡脚本的时候,无意中发现了一个有趣的事情。代码类似:

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?》
Javascript 相关文章推荐
一个js写的日历(代码部分网摘)
Sep 20 Javascript
JS实现自动定时切换的简洁网页选项卡效果
Oct 13 Javascript
JS字符串的切分用法实例
Feb 22 Javascript
全面了解JavaScript的数据类型转换
Jul 01 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
Dec 14 Javascript
微信小程序 实现动态显示和隐藏某个控件
Apr 27 Javascript
微信小程序视图容器(swiper)组件创建轮播图
Jun 19 Javascript
JavaScript循环遍历你会用哪些之小结篇
Sep 28 Javascript
手把手教你写一个微信小程序(推荐)
Oct 17 Javascript
vue实现扫码功能
Jan 17 Javascript
js实现表格单列按字母排序
Aug 12 Javascript
React Native项目框架搭建的一些心得体会
May 28 Javascript
在JavaScript中,为什么要尽可能使用局部变量?
Apr 06 #Javascript
JavaScript 在各个浏览器中执行的耐性
Apr 06 #Javascript
javascript 获取图片颜色
Apr 05 #Javascript
Mozilla 表达式 __noSuchMethod__
Apr 05 #Javascript
关于javascript document.createDocumentFragment()
Apr 04 #Javascript
HTML 自动伸缩的表格Table js实现
Apr 01 #Javascript
Javascript 原型和继承(Prototypes and Inheritance)
Apr 01 #Javascript
You might like
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
php5.5新数组函数array_column使用
2013/07/08 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
微信小程序 slider 详解及实例代码
2017/01/10 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
在 Node.js 中使用 async 函数的方法
2017/11/17 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
javascriptvoid(0)含义以及与"#"的区别讲解
2019/01/19 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
vant时间控件使用方法详解
2020/12/24 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
Python采用raw_input读取输入值的方法
2014/08/18 Python
Python素数检测实例分析
2015/06/15 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
tornado+celery的简单使用详解
2019/12/21 Python
详解python datetime模块
2020/08/17 Python
通过代码实例了解Python异常本质
2020/09/16 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
公务员总结性个人自我评价
2013/12/05 职场文书
2014大学班主任工作总结
2014/11/08 职场文书
妈妈别哭观后感
2015/06/08 职场文书
广播体操比赛主持词
2015/06/29 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis