javascript在使用数字索引分配数组值时是否调用. tostring ?
Does javascript call .toString on numeric indices when using them to assign array values?
我有一个长度为0的数组,出于某种原因,我决定给它添加属性。我可以给数组分配属性,使用括号表示法,像这样:
array['name'] = 'keith';
属性'name' : keith
将被添加到数组的属性列表中。同样,就像对对象使用尖括号表示法一样,尖括号内的表达式首先被字符串化。所以如果我说array[undefined] = '42'(当然,没有人会这么做),undefined被转换成一个字符串,我现在有了另一个属性'undefined' : 42
。数组中。长度仍然是0,因为非整数键(又名索引)不计入长度。
现在,这是我有点困惑的地方。在"正常"对象上,如果我这样做:myObject[10] = 10
,那么我将拥有一个具有属性'10' : 10
的对象,属性名称10已被字符串化。根据我们刚才所做的,array['2'] = 'foo';
应该将属性'2' : 'foo'
添加到数组中,array[3] = 'bar';
应该做同样的事情:成为数组的属性,而不计入长度。但是,当然,这两个语句只是将它们的值赋给数组中各自的索引。我不是在抱怨,因为这种行为更直观,我只是想知道我的逻辑把我引入了歧途。我今天读到array[0] = 'cat';
被有效地评估为array[ (0).toString() ] = 'cat';
后才知道这一切
来自Mozilla Developer资源:
也可以引用JavaScript数组索引(例如,years["2"]而不是years[2]),尽管这不是必要的。年中的2[2]被JavaScript引擎通过隐式toString转换强制转换为字符串。由于这个原因,"2"answers"02"将指向years对象上的两个不同的槽位,下面的示例可能为真:
console.log(years["2"] != years["02"]);
基本上,如果你传递的是一个字符串(或int,因为它将被转换为字符串),可以是一个整数(如'0'),它将引用该整数的索引。如果不是,它将添加一个属性到您正在创建的Array对象,并且不计算长度。
注意,手动增加数组的length
将不会创建新的空元素,尽管减少length
实际上将从数组末尾删除相应的元素。
对于非常特殊的应用程序,您可能需要密集数组(固定长度),请查看类型化数组。
看看这个例子(jsFiddle):
var test = new Array();
test[undefined] = 'undefined';
console.log(test);
console.log(test.length);
// This adds a property to the object 'test'
// Returns:
// [undefined: "undefined"]
// 0
test['string'] = 'string';
console.log(test);
console.log(test.length);
// This adds another property to the object 'test'
// Returns:
// [undefined: "undefined", string: "string"]
// 0
test['00'] = 'zero 00';
console.log(test);
console.log(test.length);
// This adds yet another property to the object 'test',
// since 00 is not explicitly an int.
// Returns:
// [undefined: "undefined", string: "string", 00: "zero 00"]
// 0
test['0'] = 'zero 0';
console.log(test);
console.log(test.length);
// This adds an element to the array 'test'
// Returns:
// ["zero 0", undefined: "undefined", string: "string", 00: "zero 00"]
// 1
test[0] = 'zero 0 int';
console.log(test);
console.log(test.length);
// This overrides the element at index 0 in the array 'test'
// Returns:
// ["zero 0 int", undefined: "undefined", string: "string", 00: "zero 00"]
// 1
答案是肯定的。
数组也是对象,数组的索引也是对象属性。
从文档:
属性名称
属性名必须是字符串。这意味着非字符串对象不能用作对象中的键。通过toString方法将任何非字符串对象(包括数字)类型转换为字符串。 根据ECMAScript - 15.4,一个特定的值p被认为是一个数组索引当且仅当: 在您的示例中,您提到的两个键被视为数组索引,因此计入数组的长度,它比最高索引高一个。(p >>> 0 === p) && (p >>> 0 !== Math.pow(2, 32) - 1)
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 是否可以在使用headerphp函数后自动调用JS函数
- JavaScript尾部调用中的函数是否经过优化
- 是否可以在不更改上下文的情况下调用函数.apply
- console.log是否调用对象的toString方法
- 如果表单无效,是否调用提交
- 使用 Sinon.js 测试一个函数是否调用 ES6 模块中的另一个函数
- 如何测试函数是否调用了特定的方法/函数
- 是否可以确定服务器是否调用了Meteor方法
- 是否调用去抖动方法的角度条件监视不起作用
- 检查是否调用了包装函数
- Howto:常规测试,看看小部件是否调用this.herited成功
- 确定.trigger()是否调用了事件
- 如何检查方法是否调用了茉莉花单元测试
- 如何检查在单元测试中是否调用了jQuery链函数?
- AngularJS,Jasmine:测试是否调用了作用域上的方法
- 是否调用$find是一个相对昂贵的操作
- Jasmine:如何测试在GET请求中是否调用了正确的URL
- 如何使用javascript检查是否调用服务器
- javascript在使用数字索引分配数组值时是否调用. tostring ?