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 的addEventListener()及attachEvent()区别分析
May 21 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
Dec 07 Javascript
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
Jul 13 Javascript
javascript中局部变量和全局变量的区别详解
Feb 27 Javascript
ECMAScript6快速入手攻略
Jul 18 Javascript
Select2.js下拉框使用小结
Oct 24 Javascript
Bootstrap select实现下拉框多选效果
Dec 23 Javascript
JavaScript实现前端实时搜索功能
Mar 26 Javascript
webpack-dev-server远程访问配置方法
Feb 22 Javascript
p5.js入门教程之图片加载
Mar 20 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
Aug 05 Javascript
微信小程序换肤功能实现代码(思路详解)
Aug 25 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
js自定义回调函数
2015/12/13 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
实例讲解Python中函数的调用与定义
2016/03/14 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
Html5 webRTC简单实现视频调用的示例代码
2020/09/23 HTML / CSS
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
数据库基础的一些面试题
2012/02/25 面试题
历史专业大学生职业生涯规划书
2014/03/13 职场文书
党课培训主持词
2014/04/01 职场文书
毕业生评语大全
2015/01/04 职场文书
安全生产感想
2015/08/07 职场文书