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

时间: 2024-07-30 02:26:02

JS编程建议——55:不要拘泥于数字下标的相关文章

JS编程建议——3:减少全局变量污染

建议3:减少全局变量污染定义全局变量有3种方式:在任何函数外面直接执行var语句. var f = 'value'; 直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中,全局对象名为window. window.f = 'value'; 直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量. f = 'value'; 为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象.JavaScript的策略是让

JS编程建议——8:谨慎使用运算符(1)

建议8:谨慎使用运算符(1)1.用===,而不用==JavaScript有两组相等运算符:===和!==.==和!=.===和!==这一组运算符会按照期望的方式工作.如果两个运算数类型一致且拥有相同的值,那么===返回true,而!==返回false.==和!=只有在两个运算数类型一致时才会做出正确的判断,如果两个运算数是不同的类型,会试图强制转换运算数的类型.转换的规则复杂且难以记忆,具体规则如下: '' == '0' // false 0 == '' // true 0 == '0' //

JS编程建议——50:正确检测数组类型

建议50:正确检测数组类型由于数组和对象的数据同源性,导致在JavaScript编程中经常会出现:在必须使用数组时使用了对象,或者在必须使用对象时使用了数组.选用数组或对象的规则很简单:当属性名是小而连续的整数时,应该使用数组,或者当对属性的位置和排列顺序有要求时,应该使用数组.否则,使用对象.JavaScript语言对数组和对象的区别是混乱的.typeof运算符检测数组的类型是"object",这没有什么意义,因此在正确检测数组和对象方面JavaScript没有提供很多的机制.这时可

JS编程建议——66:使用函数实现历史记录

建议66:使用函数实现历史记录函数可以利用对象去记住先前操作的结果,从而能避免无谓的运算,这种优化称为记忆.JavaScript的对象和数组要实现这种优化是非常方便的.例如,使用递归函数计算fibonacci数列.一个fibonacci数字是之前两个fibonacci数字之和.最前面的两个数字是0和1.var fibonacci = function(n) { return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2); };for(var i

JS编程建议——4:注意JavaScript数据类型的特殊性(1)

建议4:注意JavaScript数据类型的特殊性(1)1.防止浮点数溢出二进制的浮点数不能正确地处理十进制的小数,因此0.1+0.2不等于0.3. num = 0.1+0.2; //0.30000000000000004 这是JavaScript中最经常报告的Bug,并且这是遵循二进制浮点数算术标准(IEEE 754)而导致的结果.这个标准适合很多应用,但它违背了数字基本常识.幸运的是,浮点数中的整数运算是精确的,所以小数表现出来的问题可以通过指定精度来避免.例如,针对上面的相加可以这样进行处理

JS编程建议——6:正确处理JavaScript特殊值(1)

建议6:正确处理JavaScript特殊值(1)1.正确使用NaN和InfinityNaN是IEEE 754中定义的一个特殊的数量值.它不表示一个数字,尽管下面的表达式返回的是true. typeof NaN === 'number' // true 该值可能会在试图将非数字形式的字符串转换为数字时产生,例如: '0' // 0 'oops' // NaN 如果NaN是数学运算中的一个运算数,那么它与其他运算数的运算结果就会是NaN.如果有一个表达式产生出NaN的结果,那么至少其中一个运算数是N

JS编程建议——29:准确使用循环体(1)

建议29:准确使用循环体(1)1.选择正确的循环体在大多数编程语言中,代码执行时间多数消耗在循环的执行上.在一系列编程模式中,循环是最常用的模式之一,因此也是提高性能必须关注的地方之一.理解JavaScript 中循环对性能的影响至关重要,因为死循环或长时间运行的循环会严重影响用户体验.JavaScript定义了4种类型的循环:第一种循环是标准的for循环,与C语言使用同样的语法: for (var i=0; i < 10; i++){ //循环体 } for循环是最常用的循环结构,它由4部分组

JS编程建议——29:准确使用循环体(3)

建议29:准确使用循环体(3)如果for循环的循环条件比较复杂,不是简单的数值迭代,这时for语句就必须考虑如何把循环条件和循环语句联系起来才可以正确地执行整个for循环.因此,根据for结构的运算顺序,for语句首先计算第一个和第二个表达式,然后执行循环体语句,最后返回执行for语句的第三个表达式,如此循环执行.例如: for(var a = true, b = 1; a; b ++ ){ if(b > 9) // 在循环体内间接计算迭代的步长 a = false; alert(b); } 在

JS编程建议——37:推荐使用replace(2)

建议37:推荐使用replace(2)在上面的示例代码中,函数f()的参数为特殊字符"$1",它表示正则表达式/(bw+b)/中小括号每次匹配的文本.然后在函数体内对这个匹配文本进行处理,截取其首字母并转换为大写形式,之后返回新处理的字符串.replace方法能够在原文本中使用这个返回的新字符串替换每次匹配的子字符串.对于上面的示例,可以使用小括号来获取更多匹配文本的信息.例如,直接利用小括号传递单词的首字母,然后进行大小写转换处理: var s = 'script language