为什么在添加命名属性时数组会以这种方式运行?

时间:2013-11-28 15:56:53

标签: javascript arrays

我在浏览器控制台中进行了以下实验

  1. 我创建了一个新的Array
  2. "foo"添加到Array作为命名索引"name"
  3. 使用"bar"方法将Array添加到push
  4. 4& 5是对Array

    的测试
    1. var myArray = [];            // undefined
    2. myArray["name"] = "foo";     // "foo"
    3. myArray.push("bar");         // 1
    
    4. myArray.join(", ");          // "bar"
    5. myArray["name"];             // "foo"
    

    我的问题(我不明白)

    • .push()返回1这是Array的长度,但必须为2,因为Array有两个值“foo”& “酒吧”

    • 测试4显示Array只有一个值"bar",但测试5反对它,表明它还有一个值"foo"

    • 为什么Array方法(pushjoin等)不适用于键/值对?

    • 那么关联Array如何运作以及我们如何处理它(方法,属性等)。

5 个答案:

答案 0 :(得分:4)

  

.push()返回1,这是Array的长度,但它必须是数组所具有的2   两个值“foo”& “酒吧”

不,因为JavaScript中的数组不是关联数据结构(即使可以将任意属性附加到它们)。唯一计为“数组内容”的项是属性名称满足certain conditions的那些项目。

您还应该知道,如果数组有“漏洞”,length也可能会报告一个大于您预期的数字。例如:

var a = [1, 2, 3];
console.log(a.join(" "), a.length); // "1 2 3", 3
delete a[1];
console.log(a.join(" "), a.length); // "1  3", still 3!
  

测试4显示数组只有一个值“bar”,但测试5反对它,表明它也有一个值“bar”。

那是无关紧要的。该数组还有许多其他属性,但join只会触及前面提到的那些属性。

  

为什么数组方法(推送,连接等)不能用于键/值对?

因为这就是规范所说的。

  

那么关联数组如何工作以及我们如何处理它(方法,属性等)。

如果需要字符串键,请使用普通对象而不是数组。

答案 1 :(得分:3)

JavaScript实际上没有关联数组。能够做myArray["foo"] = "bar"是数组的副作用,只是对象和具有属性的对象。

只有数字属性才算作数组的元素。如果您myArray["foo"] = "bar" 向元素添加元素,则只需向对象添加属性即可。这与执行 添加元素的myArray[0] = "bar"不同,因此会更新数组对象的length属性。

答案 2 :(得分:0)

在JavaScript中,您不能使用字符串来处理数组元素,只能使用整数。所以,

1. var myArray = [];            // undefined
2. myArray["name"] = "foo";     // "foo"
3. myArray.push("bar");

myArray只会包含“bar”,因为它会忽略myArray["name"] = "foo";,这就是为什么你得到长度为1。

答案 3 :(得分:0)

就像函数一样,数组也是对象。但是有许多Array原型函数故意不访问对象的属性。除了对象和数组之外,JavaScript中没有“关联数组”,具体取决于函数或代码的行为或利用与使用关联数组相同的方式。在迭代对象键/对与数组值时,您将在for循环中遇到同样的混淆。总的来说,尽管它们非常有效,但有一本名为Java Script的好书是很好的部分。然后,这也突出了要避免或危险的功能或“坏部分”。在Javascript中搜索对象和数组的尖锐边缘会产生一些好的读数。它们并不复杂,但您必须了解Java与JavaScript不同的更微妙的方式。

答案 4 :(得分:0)

Javascript中的数组并不意味着关联 - 当您通过键添加属性时,实际上是将其添加到数组对象,而不是数组本身。

如果您想要一个键:值对,use an Object