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 相关文章推荐
Mootools 1.2教程 类(一)
Sep 15 Javascript
浅谈javascript的原型继承
Jul 25 Javascript
js获取本机的外网/广域网ip地址完整源码
Aug 12 Javascript
js使用DOM设置单选按钮、复选框及下拉菜单的方法
Jan 20 Javascript
javascript文本模板用法实例
Jul 31 Javascript
Jquery promise实现一张一张加载图片
Nov 13 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
Nov 24 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
Apr 19 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
Jun 19 Javascript
layui导出所有数据的例子
Sep 10 Javascript
微信小程序实现横向滚动导航栏效果
Dec 12 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
Sep 04 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执行速度全攻略(下)
2006/10/09 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
百度判断手机终端并自动跳转js代码及使用实例
2014/06/11 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
Python模拟登录12306的方法
2014/12/30 Python
Python数据类型学习笔记
2016/01/13 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
Python实现图片添加文字
2019/11/26 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
公司部门司机岗位职责
2014/01/03 职场文书
英语简历自我评价
2014/01/26 职场文书
简单租房协议书
2014/04/09 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
2014年转正工作总结
2014/11/08 职场文书
Feign调用全局异常处理解决方案
2021/06/24 Java/Android
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技