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 相关文章推荐
js获取TreeView控件选中节点的Text和Value值的方法
Nov 24 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
Nov 19 Javascript
js中继承的几种用法总结(apply,call,prototype)
Dec 26 Javascript
window resize和scroll事件的基本优化思路
Apr 29 Javascript
JSON+HTML实现国家省市联动选择效果
May 18 Javascript
jQuery操作Table技巧大汇总
Jan 23 Javascript
AngularJS自动表单验证
Feb 01 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
jquery实现左右滑动式轮播图
Mar 02 Javascript
更强大的vue ssr实现预取数据的方式
Jul 19 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
Jul 20 Javascript
javascript实现简易数码时钟
Mar 30 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环境搭建最新方法
2006/09/05 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
php中autoload的用法总结
2013/11/08 PHP
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
javascript正则表达式中的replace方法详解
2015/04/20 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
Python登录并获取CSDN博客所有文章列表代码实例
2017/12/28 Python
python简单实现操作Mysql数据库
2018/01/29 Python
Django之模型层多表操作的实现
2019/01/08 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
Django权限设置及验证方式
2020/05/13 Python
贝玲妃英国官网:Benefit英国
2018/02/03 全球购物
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
监理员的岗位职责
2013/11/13 职场文书
机械专业求职信范文
2014/07/15 职场文书
七夕活动策划方案
2014/08/16 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL