-1

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

  1. 如果[[Class]]的行为类似于对象,为什么它会显示为 Array
  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]"
    

这里有什么交易?


这已在此 SO 帖子中详细回答

Javascript 数组是原语吗?字符串?对象?

4

4 回答 4

0

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

于 2013-01-16T16:50:50.950 回答
0

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

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

于 2013-01-16T16:51:51.620 回答
0

对于 1,请参阅第15.4.5节“数组实例的属性”:

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

对于 2,请参阅第15.4.5.2节“长度”

此 Array 对象的长度属性是一个数据属性,其值始终在数值上大于名称为数组索引的每个可删除属性的名称。

于 2013-01-16T16:54:55.597 回答
0

var arr = [0, 1, 3]只是 . 的语法糖var arr = Array.new(0, 1, 3)。这是同一件事,因此arr是一个Array,并且一个实例Array是一个对象:

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

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

于 2013-01-16T16:50:28.517 回答