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 相关文章推荐
有效的捕获JavaScript焦点的方法小结
Oct 08 Javascript
jquery实现商品拖动选择效果代码(自写)
May 28 Javascript
给事件响应函数传参数的四种方式小结
Dec 05 Javascript
使用VS开发 Node.js指南
Jan 06 Javascript
zepto.js中tap事件阻止冒泡的实现方法
Feb 12 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
May 16 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
Oct 25 Javascript
微信小程序入门教程
Nov 18 Javascript
详解堆的javascript实现方法
Nov 29 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
Apr 28 Javascript
微信小程序自定义导航栏
Dec 31 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
May 18 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
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
微信小程序仿通讯录功能
2020/04/09 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
在Django的上下文中设置变量的方法
2015/07/20 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
python 基于opencv实现图像增强
2020/12/23 Python
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
八年级美术教学反思
2014/02/02 职场文书
学校联谊协议书
2014/09/16 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
高三语文复习计划
2015/01/19 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang
MySQL系列之十一 日志记录
2021/07/02 MySQL
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python