数组不是数据而是容器,但是为什么它具有数据类型?

时间:2019-06-17 03:14:36

标签: javascript arrays types

我对数据类型的理解如下。如果我们考虑使用像碾米机这样的机器,可以容纳大米,大麦,玉米,芸豆,鹰嘴豆,黑豆等。那么我将碾米机理解为处理诸如大米,大麦等数据的程序。是大米,大麦,豆类,但类型不同。大米与大麦等的类型不同。

在javascript中,我注意到数据类型下提到了对象。

https://javascript.info/types#objects-and-symbols

有意义的是23是数字类型的数据,“ cat”是字符串类型的数据,true是“ boolean”类型的数据,但对象似乎更像是数据容器而不是数据类型。例如,typeof([])表示它是一个对象。现在,数组似乎是一个数据容器,而不是数据容器,而数据容器的类型没有任何意义。对我而言,数据可以具有类型是有意义的,但是我们将具有类型的数据放入其中的容器令人困惑。

因此,我很感谢有人能启发我。数组似乎是一个容器,而不是数据,并且不能具有类型。

我感谢任何指导。谢谢!

3 个答案:

答案 0 :(得分:2)

在一般的理论水平上,对象由描述对象的数据以及对该对象执行的行为组成。在面向对象编程之前,数据是数据,代码是代码。如果您需要加载一些数据并将其绘制在屏幕上,则这两段代码很可能位于代码库的不同位置。 OOP将数据和行为结合在一起,以进行更好的概念组织。它还允许某些对象通过将它们分类到类中来共享行为(例如,“吠叫”不是需要为每只狗单独编码的东西),或者通过创建对象原型(相同的思想,不同的方法)。此外,它允许不同的对象指定执行相同行为的不同方式(例如,猫和狼都知道狩猎,尽管他们的狩猎方式有所不同)。

在机械JavaScript特定级别上,“对象”是一种数据结构,可以在字符串键下存储各种值。因此,它在表面上类似于数组,后者再次存储值,但使用整数键。

但是,JavaScript中的“值”还包含函数,这是JS对象达到第一个目标的方式(成为控制其行为的相关数据和代码的存储库)。第二个目标是通过原型继承来实现的:

let Mammal = function() {
}
let typicalMammal = new Mammal();
typicalMammal.legs = 4;
Mammal.prototype = typicalMammal;

let Dog = function() {
};
let typicalDog = new Mammal();
typicalDog.sound = function() { console.log("woof") };
Dog.prototype = typicalDog;

let fido = new Dog();
fido.colour = "yellow";
console.log("Fido:", fido);
fido.sound();

第三个目标也实现了:如果我们有一只猫,我们可以告诉happy.sound(),它就会发出“喵”的叫声。我们不需要知道什么东西是狗还是猫,只要他们知道如何发出声音,剩下的事情就会由动态调度完成。

还需要注意的是,当您在带有这样的点符号的对象中调用函数时,该函数将被解释为“方法”,即通过设置特殊变量{来了解其作用于哪个对象的函数{1}}。在这种情况下,在方法this中,sound的值将与this相同。

特别是对于数组,它们是一种对象,它知道如何包含由整数索引指示的多个值,如何被索引,如何知道其长度,如何在其元素上进行迭代等。

但是,请注意,“变量”完全不同。可以将变量概念化为具有名称和值的数据结构。但是您通常无法访问变量的名称。变量本身不是值。您不能将变量放入数据结构中,只需将其值复制到其中即可。它更多的是一种语言工件,而不是数据类型。

答案 1 :(得分:0)

ECMAScript标准定义了八种数据类型,七种基本类型和对象。

在JavaScript中,对象是属性的集合,属性值可以是任何类型的值,例如,对象的属性类型为“数字”。

foot = (input ("what is the square footage of your house:  "))
price = float(foot) * .075
print (price)

您可以测试

let obj = { num: 3 }

将返回“数字”,但

typeof obj.num 
我认为

将返回“对象”,因为原型对象的继承 JavaScript中的所有对象都是Object的后代,所有对象都继承Object.prototype的方法和属性。

在您的数组示例中。在javascript中,数组变量具有Array的原型,但这是一个具有Object原型的对象。

typeof obj 

我认为这就是为什么要给您“对象”。

以下是有关数据结构的链接:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object

答案 2 :(得分:0)

JavaScript的容器只有一种数据类型,称为“对象”。

数组是容器,因此它们的数据类型是“对象”。像数组一样,还有其他种类的专家对象类,例如“函数”(它们包含代码并且可以调用),例如setsweak sets

重要的是,JavaScript typeof操作符并不总是返回其操作数的数据类型。这是由于操作员的早期实现细节现在无法更改-程序已根据实际实现进行了长期调整:

  • typeof null返回“对象”。 null的数据类型为“空”。
  • typeof function返回“功能”。函数的数据类型为“对象”。
  

...变量是一个容器,不是数据

变量不是容器,而是值存储位置的标识符。 JavaScript中的变量类型较弱,这意味着值的数据类型不是由已为其分配值的变量(或对象属性)确定的,而是由用于保存该值的内部存储器构造确定的。也就是说,类型是从存储的值而不是用于访问它的变量中获得的。

对象值

存储在JavaScript变量中的对象值是指向数据结构的某种类型的内存,该数据结构的位置和实现细节是私有的,并且仅JavaScript引擎知道。

出于同样的原因,在JavaScript中将对象值称为数据类型也很有意义,原因在于C中的指针取决于其指向的对象具有数据类型。它还说明了为什么如果将相同的“对象值”分配给两个变量,那么它们都将指向存储在内存中某个未知位置的相同对象数据集。

JavaScript对象值的主要区别在于,您无法对其执行指针算术运算,而必须依靠对象属性符号object.propertyNameobject["propertyName"]直接访问对象的属性。

数组对象

JavaScript数组是使用正整数值(转换为字符串)来访问作为数组对象的字符串属性保存的数组条目的对象。

与类型化数组不同,用于访问Array对象的条目的索引值没有上限,也不必是连续的-内存未分配给未设置的条目。

TLDR;

JavaScript数组被实现为关联查找表。它们的数据类型是“对象”,并且它们从Array.prototypeObject.prototype继承属性和方法。

在ECMAScript标准中它们被称为“奇异”对象,因为它们监视访问以查看所使用的属性名称是否表示非负整数,并维护数组对象的length属性。

早期的JavaScript文档全都采用了不提及指针的方式,以免引起BASIC程序员的困惑。文档使用“对象”表示数据结构,对象值存储为指针,并且为C语言系列中的指针访问选择的速记属性访问运算符为.而不是->运算符