这是Javascript中的数组还是对象?

时间:2013-01-16 16:48:19

标签: javascript

有人可以向我解释这段代码以及'arr'的类型。 我知道数组是一个对象但是

  1. 为什么 [[Class]] 会显示为Array,如果它的行为类似于Object
  2. arr.length返回3.如何?

    var arr = [0, 1, 3];
    arr.name = "asdf";
    
    console.log(arr[1] + " " + arr.name + " " + arr.length); 
    // Returns-> 1 asdf 3
    
    Object.prototype.toString.call(arr); 
    // Returns-> "[object Array]"
    
  3. 这里的交易是什么?


    这篇SO帖子已经详细解答了这个问题

    Are Javascript arrays primitives? Strings? Objects?

4 个答案:

答案 0 :(得分:0)

var arr = [0, 1, 3]只是var arr = Array.new(0, 1, 3)的语法糖。它是一回事,因此arrArrayArray的实例是对象:

var arr = [0, 1, 3];
typeof arr;  // returns "object"
arr instanceof Array;  // returns true

Array会覆盖lenght()函数,仅计算数组中元素的数量;当您设置arr. name = "asdf"时,您正在为此特定对象设置属性,但length()函数不计算该属性。

答案 1 :(得分:0)

JavaScript数组是专用对象,因此它们都是数组和对象。因此,您可以像任何其他对象一样向它们添加属性。 length属性仅考虑数字属性,因此添加name等任意属性不会影响它。

答案 2 :(得分:0)

所有javascript变量都是对象。像这样的一些对象也是数组。

因此,您可以设置属性(因为它是一个对象),还可以查看特定于数组的属性(因为它是一个数组)。

答案 3 :(得分:0)

对于1,请参见15.4.5“数组实例的属性”部分:

  

数组实例从Array原型对象继承属性,其[[Class]]内部属性值为“Array”。数组实例还具有以下属性。

对于2,请参阅15.4.5.2“length”

部分
  

此Array对象的length属性是一个data属性,其值始终在数值上大于名称为数组索引的每个deletable属性的名称。