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对select标签的控制(option选项/select)
Jan 31 Javascript
推荐5 个常用的JavaScript调试技巧
Jan 08 Javascript
JavaScript使用replace函数替换字符串的方法
Apr 06 Javascript
jQuery模拟黑客帝国矩阵效果实例
Jun 28 Javascript
JavaScript实现对下拉列表值进行排序的方法
Jul 15 Javascript
jquery+正则实现统一的表单验证
Sep 20 Javascript
浅析jQuery中使用$所引发的问题
May 29 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
Oct 21 Javascript
通俗解释JavaScript正则表达式快速记忆
Aug 23 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
Jan 18 Javascript
react 中父组件与子组件双向绑定问题
May 20 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
Jun 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
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
php Smarty初体验二 获取配置信息
2011/08/08 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
js树插件zTree获取所有选中节点数据的方法
2015/01/28 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
Python聊天室实例程序分享
2016/01/05 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
matplotlib中legend位置调整解析
2017/12/19 Python
python实现大转盘抽奖效果
2019/01/22 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
德国帽子专家:Hutshopping
2019/11/03 全球购物
教师一岗双责责任书
2014/04/16 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
伊琍体标语
2014/06/25 职场文书
辞职信的写法
2015/02/27 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
小组组名及励志口号
2015/12/24 职场文书
《三国志》赏析
2019/08/27 职场文书
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL