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实时监听文本框状态的方法
Apr 26 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
Jun 27 Javascript
JavaScript面向对象程序设计三 原型模式(上)
Dec 21 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
Aug 21 Javascript
jquery访问ashx文件示例代码
Aug 11 Javascript
手机端页面rem宽度自适应脚本
May 20 Javascript
JS异步文件上传(兼容IE8+)
Apr 02 Javascript
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
微信小程序实现全国机场索引列表
Jan 31 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
Sep 01 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
Sep 04 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
Sep 02 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中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
python使用递归解决全排列数字示例
2014/02/11 Python
Python 中的lambda函数介绍
2018/10/10 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
存储过程和函数的区别
2013/05/28 面试题
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
出纳试用期自我评价
2015/03/10 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js
Python jiaba库的使用详解
2021/11/23 Python
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android