Javascript数组是原语吗?串?物体?

Javascript数组是原语吗?串?物体?,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,数组仅仅是伪装的对象吗?为什么?他们是以什么方式(这样/不这样)的 我一直认为JS中的数组和对象本质上是相同的,主要是因为访问它们是相同的 var obj = {'I': 'me'}; var arr = new Array(); arr['you'] = 'them'; console.log(obj.I); console.log(arr.you); console.log(obj['I']); console.log(arr['you']); 我是不是被误导了/弄错了/错了?关于JS文

数组仅仅是伪装的对象吗?为什么?他们是以什么方式(这样/不这样)的

我一直认为JS中的数组和对象本质上是相同的,主要是因为访问它们是相同的

var obj = {'I': 'me'};
var arr = new Array();
arr['you'] = 'them';

console.log(obj.I);
console.log(arr.you);
console.log(obj['I']);
console.log(arr['you']);
我是不是被误导了/弄错了/错了?关于JS文本、原语和字符串/对象/数组等,我需要了解什么


数组/对象仅仅是伪装的字符串吗?为什么?数组在Javascript中不是原语,而是对象。关键区别在于,当您将数组传递给函数时,它是通过引用传递的,而不是通过值传递的

是的!数组是javascript中的对象,具有完整的Array.prototype和所有内容(不过不要碰它…)

混淆的原因是javascripts允许您通过两种方式访问对象属性:

myObj.attribute 或 myObj[“属性”]


实际上,使数组成为数组的原因与存储数据的方式无关——任何对象都可以使用存储数组的语法存储值——使数组成为数组的原因是数组方法(例如shift()和sort())是为array.prototype定义的。

对象是从字符串键到值的无序映射,数组是一个有序的值列表(带有整数键)。这是主要的区别。它们都是非原语的,因为它们由多个值组成,这也意味着在JavaScript中通过引用传递

不过,数组也是一种对象,因此您可以为其附加额外属性,访问其原型等等


在修改后的示例中,您只利用了一个事实,即数组实际上是一个对象,即您可以对其设置任何属性。你不应该那样做。如果您不需要一个有序的值列表,请使用普通对象。

尽量简短地介绍我认为最重要的内容:数组有许多对象不需要的方法。包括:

  • 长度
  • 流行音乐
声明为
var x={foo:bar}
的对象无法访问.length()方法。它们都是对象,但数组是一种超集,方法如上所述

我不觉得这在解释上甚至接近于Crockford的标准,但我尽量简洁

如果您想快速获得一些结果,请打开Firebug或javascript控制台,并尝试使用Array.prototype和Object.prototype查看一些详细信息

更新:在您的示例中,您声明了一个数组,然后执行以下操作:

foo['bar'] = 'unexpectedbehaviour';
将产生意外结果,并且在以下简单循环中不可用:

var foo=[0,1];
foo['bar'] = 2;

for(var i=0;i<foo.length;i++){
    console.log(foo[i]);
}

//outputs: 
//0
//1
var foo=[0,1];
foo['bar']=2;

for(var i=0;i字符串可以是基元或对象,具体取决于它们的声明方式

var str = 'yes';
给你一个原始的

var str = new String('yes');
将给您一个字符串对象



所有数组都是相同的(无论它们是否是用[]或new Array()定义的),都是对象类型,并从“Array”对象的原型继承而来。Javascript中没有真正的类,一切都是一个对象,还有一个系统定义的对象称为Array。它有一个名为“prototype”(对象类型)的属性,当您在具有prototype属性的对象上使用new关键字时,它会创建一个引用prototype内容的实例,并将其存储在变量中。因此,您在Javascript中使用过的所有数组都是数组prototype属性的对象和实例

在任何情况下,尽管数组实际上是对象,但由于其有用的属性和功能(如长度、切片、推送等),它们的行为类似于数组

另一个注意事项是,尽管我说过没有课程,但当您这样做时:

console.log(Object.prototype.toString.call(your_object));
它将以[object object]的形式为您提供一个字符串。但有用的是,当您使用数组调用它时,您可以使用提供[object Function]的函数和许多其他系统定义的类型获得[object array],这有助于区分普通对象和数组(因为typeof操作符总是只返回字符串“object”)

试试这个

var a = Array;
进入firebug并检查a的内容,尤其是它的“原型”属性

Edit:为了更准确,对措辞做了一点修改。事实上,当您使用new关键字时,它会创建一个引用原型对象的实例。因此,在实例声明后对原型所做的任何更改都会影响实例

编辑:回答您最新修订的问题(数组/对象实际上是伪装的字符串):不。正如我所解释的,它们是对象。字符串要么是基元类型,要么是对象类型(字符串对象的实例),其中包含基元等价物作为其属性之一。

数组是对象

但是,与常规对象不同,数组具有某些特殊功能

  • 数组在其原型链中还有一个额外的对象,即
    Array.prototype
    。此对象包含可以在数组实例上调用的所谓数组方法。(方法列表如下:)

  • 数组有一个
    length
    属性(它是活动的,因此,它会自动更新)(阅读这里:)

  • 数组有一个关于定义新属性的特殊算法(请阅读此处:)。如果您为数组设置了一个新属性,并且该属性的名称是一个可以强制为整数的sting(如
    '1'
    '2'
    '3'
    ,等等),则特殊算法适用(在规范第123页中定义)


  • 除了这三件事,数组就像普通对象一样


    阅读规范中的数组:

    数组是对象,但具有特殊性质。对象是由键索引的值的集合(在Javascript表示法中,
    {'key':'value'}
    ),而数组是其键为