JS编程建议——55:不要拘泥于数字下标

简介: 55:不要拘泥于数字下标

建议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来读取该元素值

相关文章
|
28天前
|
存储 JavaScript 前端开发
JavaScript编程实现tab选项卡切换的效果+1
JavaScript编程实现tab选项卡切换的效果+1
|
2月前
|
JavaScript 前端开发 编译器
解锁JavaScript模块化编程新纪元:从CommonJS的基石到ES Modules的飞跃,探索代码组织的艺术与科学
【8月更文挑战第27天】随着Web应用复杂度的提升,JavaScript模块化编程变得至关重要,它能有效降低代码耦合度并提高项目可维护性及扩展性。从CommonJS到ES Modules,模块化标准经历了显著的发展。CommonJS最初专为服务器端设计,通过`require()`同步加载模块。而ES Modules作为官方标准,支持异步加载,更适合浏览器环境,并且能够进行静态分析以优化性能。这两种标准各有特色,但ES Modules凭借其更广泛的跨平台兼容性和现代语法逐渐成为主流。这一演进不仅标志着JavaScript模块化的成熟,也反映了整个JavaScript生态系统的不断完善。
46 3
|
11天前
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
30 4
|
28天前
|
JavaScript 前端开发
JavaScript编程实现tab选项卡切换的效果
JavaScript编程实现tab选项卡切换的效果
|
28天前
|
JavaScript 前端开发
用JavaScript编程控制网页上checkbox选择状态:全选、全部取消、反选
用JavaScript编程控制网页上checkbox选择状态:全选、全部取消、反选
|
29天前
|
JavaScript 前端开发 安全
JavaScript编程实现字符和字符串翻转
JavaScript编程实现字符和字符串翻转
|
1月前
|
JavaScript 前端开发
用JavaScript编程定义二维数组并初始化,然后输出元素值
用JavaScript编程定义二维数组并初始化,然后输出元素值
|
2月前
|
JavaScript 前端开发 安全
揭秘TypeScript的魔力:它是如何华丽变身为JavaScript的超能英雄,让您的代码飞入全新的编程维度!
【8月更文挑战第22天】在Web开发领域,JavaScript是最主流的编程语言之一。但随着应用规模的增长,其类型安全和模块化的不足逐渐显现。为解决这些问题,微软推出了TypeScript,这是JavaScript的一个超集,通过添加静态类型检查来提升开发效率。TypeScript兼容所有JavaScript代码,并引入类型注解功能。
35 2
|
2月前
|
JavaScript 前端开发 Oracle
|
2月前
|
JavaScript 前端开发 开发者
震撼揭秘!JS模块化进化史:从混沌到秩序,一场代码世界的华丽蜕变,你怎能错过这场编程盛宴?
【8月更文挑战第23天】在 Web 前端开发领域,JavaScript 模块化已成为处理日益复杂的 Web 应用程序的关键技术。通过将代码分解成独立且可重用的模块,开发者能够更有效地组织和管理代码,避免命名冲突和依赖混乱。从最早的全局函数模式到 IIFE,再到 CommonJS 和 AMD,最终进化到了 ES6 的原生模块支持以及 UMD 的跨环境兼容性。本文通过具体示例介绍了这些模块化规范的发展历程及其在实际开发中的应用。
41 0