博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS编程建议——55:不要拘泥于数字下标
阅读量:5752 次
发布时间:2019-06-18

本文共 1828 字,大约阅读时间需要 6 分钟。

建议55:不要拘泥于数字下标

数组下标默认为大于或等于0的整数,不过JavaScript允许数组下标可以为任意表达式,甚至为任意类型数据。
(1)文本下标
为数组下标指定负值:
var a = []; // 定义空数组直接量
a[-1] = 1; // 为下标为-1的元素赋值
很显然,上面的用法是非法的,因为这不符合语法规范。使用length属性检测,返回值为0,说明数组并没有增加长度,这是正确的,也很正常。但是,使用下面的方法可以读取该元素的值:
alert(a.length); // 0,说明数组长度没有增加
alert(a[-1]); // 1
alert(a["-1"]); // 1,说明这个值以对象属性的形式被存储
不仅如此,还可以为数组指定字符串下标,或者布尔值下标,例如:
var a = [];
a[true] = 1;
a[false] = 0;
alert(a.length); //0,说明数组长度没有增加
alert(a[true]); //1
alert(a[false]); //0
alert(a[0]); //undefined
alert(a[1]); //undefined
虽然true和false可以被转换为1和0,但是JavaScript并没有执行转换,而是把它们视为对象属性来看待。如果文本是数字,可以直接使用数字下标来访问,这时JavaScript又能够自动转换它们的类型。例如:
a["1"] = 1;
alert(a[1]); //1
这种数据存储格式称为哈希表。哈希表的数据检索速度要快于数组迭代检索,因此,对于下面的操作:
var a = [["张三",1],["李四",2],["王五",3]]; // 二维数组
for(var i in a){ // 遍历二维数组

if(a[i][0] == "李四") alert(a[i][1]) ;  // 检索指定元素

}

将数组下标改为文本下标会更为高效。
var a = []; // 定义空数组
a["张三"] = 1; // 以文本下标来存储元素的值
a["李四"] = 2;
a["王五"] = 3;
alert(a["李四"] ); // 快速定位检索
(2)二维数组下标
JavaScript不支持定义二维数组的语法,但我们可以模仿其他语言中二维数组的形式来定义数组。例如,下面的写法虽然不符合语法上的规定,但是JavaScript不会提示编译错误:
var a = [];
a[0,0] = 1;
a[0,1] = 2;
a[1,0] = 3;
a[1,1] = 4;
如果调用length属性,返回值为2,则说明仅有两个元素,分别读取元素的值,代码如下:
alert(a.length); //2,说明仅有两个元素有效
alert(a[0]); //3
alert(a[1]); //3
JavaScript把二维数组下标视为一个逗号表达式,其运算的返回值是最后一个值。前面两行代码赋值就被后面两行代码赋值覆盖了。因此,如果经过计算之后才确定下标值,之后再进行存取操作,则可以按如下方式进行设计:
var a = [], i = 1; // 初始化变量
while( i < 10 ){ // 指定循环次数

a[i *= 2 , i] = i;  // 指定下标为2的指数时才进行赋值

}

alert( a.length ); //17
alert( a ); //[,,2,, 4,,,, 8,,,,,,,, 16]
(3)对象下标
对象也可以作为数组下标。JavaScript会试图把对象转换为数值,如果不行,则把它转换为字符串,然后以文本下标的形式进行操作。例如:
var a = []; // 数组直接量
var b = function(){ // 函数直接量

return 2;

}

a[b] = 1; // 把对象作为数组下标
alert( a.length ); //长度为0
alert( a[b] ); //1
可以这样读取元素值:
var s =b.toString(); // 获取对象的字符串
alert( a[s] ); // 利用文本下标读取元素的值
还可以这样设计下标:
a[b()] = 1; // 在下标处调用函数,则返回值为2
alert( a[2] ); // 因此可以使用2来读取该元素值

转载地址:http://gmukx.baihongyu.com/

你可能感兴趣的文章
c# 汉字转拼音
查看>>
Win7输入法消失和不能切换的办法了
查看>>
[转]通过继承ConfigurationSection,在web.config中增加自定义配置
查看>>
使用UIImagePickerController时3DTouch引起Crash
查看>>
实时 Django 终于来了 —— Django Channels 入门指南
查看>>
硬链接和软链接的区别
查看>>
XPage的使用示范例子
查看>>
【转】【MySQL】Mysql模糊查询like提速优化
查看>>
(原創) 微軟開發技術的大變革:WPF(Windows Presentation Foundation) (初級) (.NET)
查看>>
一步一步学Silverlight 2系列(19):如何在Silverlight中与HTML DOM交互(上)
查看>>
检测网页是否是伪静态
查看>>
c常用字符实战操作
查看>>
android开发_Button控件
查看>>
27个jQuery网页拖放操作的插件
查看>>
extjs 验证消息不显示
查看>>
Scanner方法 转
查看>>
查看.NET FRAMEWORK版本的方法
查看>>
自定义事件
查看>>
extjs 鼠标滑过grid时产生提示grid列中的值
查看>>
Android之PopupWindow
查看>>