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 相关文章推荐
基于jquery的滚动鼠标放大缩小图片效果
Oct 27 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
Nov 30 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
Mar 20 Javascript
js setTimeout()函数介绍及应用以倒计时为例
Dec 12 Javascript
JavaScript匿名函数用法分析
Feb 13 Javascript
基于jquery实现省市区三级联动效果
Dec 25 Javascript
解析微信JS-SDK配置授权,实现分享接口
Dec 09 Javascript
用node和express连接mysql实现登录注册的实现代码
Jul 05 Javascript
vue登录注册及token验证实现代码
Dec 14 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
Jan 03 Javascript
基于vue实现一个禅道主页拖拽效果
May 27 Javascript
微信小程序通过一个json实现分享朋友圈图片
Sep 03 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
10个php函数实用却不常见
2015/10/13 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
JavaScript使用cookie
2007/02/02 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python科学画图代码分享
2017/11/29 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
Python 实现大整数乘法算法的示例代码
2019/09/17 Python
详解python中eval函数的作用
2019/10/22 Python
pytorch进行上采样的种类实例
2020/02/18 Python
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
夏季奶茶店创业计划书
2014/01/16 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
解除施工合同协议书
2014/10/17 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
JavaScript异步操作中串行和并行
2021/11/20 Javascript
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis