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 面试题随笔
Mar 31 Javascript
文件编码导致jquery失效的解决方法
Jun 26 Javascript
javascript中的正则表达式使用指南
Mar 01 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
Jun 14 Javascript
javascript 中的console.log和弹出窗口alert
Aug 30 Javascript
jQuery EasyUI封装简化操作
Sep 18 Javascript
JS判断时间段的实现代码
Jun 14 Javascript
Vue单文件组件基础模板小结
Aug 10 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
Aug 23 Javascript
详解JS函数stack size计算方法
Jun 18 Javascript
js的对象与函数详解
Jan 21 Javascript
JS Object构造函数之Object.freeze
Apr 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
风格模板初级不完全修改教程
2006/10/09 PHP
php MsSql server时遇到的中文编码问题
2009/06/11 PHP
php 获取本地IP代码
2013/06/23 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
Javascript学习笔记2 函数
2010/01/11 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
python基础教程之字典操作详解
2014/03/25 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
python解决字符串倒序输出的问题
2018/06/25 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
DataList 能否分页,请问如何实现?
2015/05/03 面试题
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
员工手册董事长致辞
2015/07/29 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
小学班主任心得体会
2016/01/07 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
P站美图推荐——变身女主角特辑
2022/03/20 日漫
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis