Jar*_*ish 23 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']);
Run Code Online (Sandbox Code Playgroud)
我误导/错误/错误吗?关于JS文字,基元和字符串/对象/数组/等,我需要了解什么?
数组/对象是伪装的字符串吗?为什么/为什么不呢?他们以什么方式(这样/不是)?
Šim*_*das 36
数组是对象.
但是,与常规对象不同,数组具有某些特殊功能.
数组在其原型链中有一个额外的对象 - 即Array.prototype.该对象包含所谓的Array方法,可以在数组实例上调用.(方法列表在这里:http://es5.github.com/#x15.4.4)
数组有一个length属性(现场,ergo,它自动更新)(请参阅:http://es5.github.com/#x15.4.5.2)
数组有一个关于定义新属性的特殊算法(请参阅此处:http://es5.github.com/#x15.4.5.1).如果你设置一个新的属性到一个数组和属性的名称是可以强制转换为一个整数刺(如'1','2','3',等),那么特殊算法应用(它是在规范中定义第123页)
除了这三件事之外,数组就像常规对象一样.
阅读规范中的数组:http://es5.github.com/#x15.4
对象是从字符串键到值的无序映射,数组是值的有序列表(使用整数键).这是主要的区别.它们都是非原始的,因为它们由多个值组成,这也意味着JavaScript中的传递引用.
但是,数组也是一种对象,因此您可以为它们附加额外的属性,访问它们的原型等等.
在您修改过的示例中,您只是利用了一个数组实际上是一个对象的事实,即您可以在它们上设置任何属性.你不应该这样做.如果您不需要有序的值列表,请使用普通对象.
字符串可以是原始字符串,也可以是对象,具体取决于它们的声明方式.
var str = 'yes';
Run Code Online (Sandbox Code Playgroud)
给你一个原始,同时,
var str = new String('yes');
Run Code Online (Sandbox Code Playgroud)
会给你一个String对象.
所有数组都是相同的(无论它们是否使用[]或新的Array()定义),都是对象类型,并且继承自"Array"对象的原型.Javascript中没有真正的类,一切都是对象,并且有一个名为Array的系统定义对象.它有一个名为'prototype'的属性(类型为object),当你在具有prototype属性的对象上使用new关键字时,它会创建一个实例,其中包含对原型内容的引用并将其存储在变量中.因此,您在Javascript中使用过的所有数组都是Array的prototype属性的对象和实例.
在任何情况下,尽管数组确实是对象,但由于它们有用的属性和功能(例如长度,切片,推送等),它们的行为类似于数组.
另一个注意事项,虽然我说没有课程,但是当你这样做时:
console.log(Object.prototype.toString.call(your_object));
Run Code Online (Sandbox Code Playgroud)
它会以[object Object]的形式给你一个字符串.但有用的是,当你用数组调用它时,你得到的[object Array]与给出[object Function]和许多其他系统定义类型的函数相同,这有助于区分普通对象和数组(由于typeof operator始终只返回字符串'object').
试试这个
var a = Array;
Run Code Online (Sandbox Code Playgroud)
并进入萤火虫并检查a的内容,特别是它的'原型'属性.
编辑:更改了一些措辞,更正确.实际上,当您使用new关键字时,它会创建一个引用原型对象的实例.因此,在实例声明之后对原型所做的任何更改仍将影响实例.
编辑:回答你最新修改的问题(数组/对象实际上是伪装的字符串):不.他们是对象,正如我已经解释的那样.字符串可以是基本类型,也可以是对象类型(String对象的实例),它包含与其中一个属性相同的基元.
数组不是 Javascript 中的原语,它们是对象。关键的区别在于,因此,当您将数组传递给函数时,它是按引用传递的,而不是按值传递的。
所以是的!数组是 javascript 中的对象,具有完整的 Array.prototype 和所有内容(尽管不要碰它...)
混淆来自这样一个事实,即 javascripts 允许您通过两种方式访问对象属性:
myObj.attribute 或 myObj["attribute"]
真正使数组成为数组的原因与您存储数据的方式无关——任何对象都可以使用您用来存储数组的语法来存储值——使数组成为数组的原因是数组方法(例如 shift () 和 sort()) 是为 Array.prototype 定义的。