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解决iframe高度自适应代码
Dec 20 Javascript
js对象的比较
Feb 26 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
Mar 21 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
Jun 30 Javascript
JavaScript学习笔记之内置对象
Jan 22 Javascript
利用Node.JS实现邮件发送功能
Oct 21 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
Aug 18 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
Dec 18 Javascript
js简单遍历获取对象中的属性值的方法示例
Jun 19 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 jQuery
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
Apr 26 Javascript
JS前后端实现身份证号验证代码解析
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 模拟POST|GET操作实现代码
2010/07/20 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
一段实用的php验证码函数
2016/05/19 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
python中日期和时间格式化输出的方法小结
2015/03/19 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
python 如何将office文件转换为PDF
2020/09/22 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
大学活动策划书范文
2014/01/10 职场文书
家长会邀请书
2014/01/25 职场文书
创业计划书的写作技巧及要点
2014/01/31 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
离职告别感言
2015/08/04 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
Python利用FlashText算法实现替换字符串
2022/03/31 Python
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript