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中关于break,continue的特殊用法与介绍
May 24 Javascript
jquery索引在使用中的一些困惑
Oct 24 Javascript
Uploadify上传文件方法
Mar 16 Javascript
JavaScript学习笔记之取数组中最大值和最小值
Mar 23 Javascript
jquery分隔Url的param方法(推荐)
May 25 Javascript
详解Vue.js动态绑定class
Dec 20 Javascript
非常实用的vue导航钩子
Mar 20 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
May 09 Javascript
Element Input组件分析小结
Oct 11 Javascript
JS栈stack类的实现与使用方法示例
Jan 31 Javascript
node中IO以及定时器优先级详解
May 10 Javascript
vue 地区选择器v-distpicker的常用功能
Jul 23 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下几种删除目录的方法总结
2007/08/19 PHP
五款PHP代码重构工具推荐
2014/10/14 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
js css后面所带参数含义介绍
2013/08/18 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
基于javascript实现的搜索时自动提示功能
2014/12/26 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
javascript实现简单页面倒计时
2021/03/02 Javascript
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
python实现数通设备端口监控示例
2014/04/02 Python
寻找网站后台地址的python脚本
2014/09/01 Python
python 换位密码算法的实例详解
2017/07/19 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
python颜色随机生成器的实例代码
2020/01/10 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
班组长岗位职责范本
2014/01/05 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python
Python中time与datetime模块使用方法详解
2022/03/31 Python
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers