JavaScript数据类型详解

在JavaScript编程中,理解数据类型是至关重要的,因为它们是构建程序的基础。本文将探讨JavaScript的内置数据类型,以及原始类型和引用类型之间的区别。

从静态类型语言(如C#)转向JavaScript时,可能会对其动态特性感到困惑。最初,甚至在寻找类,但意识到JavaScript并没有正式支持类。这最初可能让人感到陌生,但随着时间的推移,逐渐习惯了。因此,决定创建这篇文章,以帮助学生或开发者分享学习JavaScript类型的知识和旅程。

当开始学习JavaScript时,许多优秀的开发者争论说JavaScript没有类型。特别是那些来自强类型语言(如C#、Java和C++)的开发者。当时,不知道该说什么,因为还不够了解。然而,如果遇到或将遇到这类开发者,可以指向JavaScript语言规范。将在下面提供链接和一些截图,说明JavaScript语言确实有类型。

截至目前,有“ECMAScript 2020语言规范”,可以在这里找到。最后,让看看规范对类型有什么说法。请参见下面的截图:

希望这能帮到。现在,让跳到JavaScript内置类型。

JavaScript数据类型

JavaScript语言有两种类型:原始类型和引用类型。原始类型(也称为值类型)存储为简单数据类型,而引用类型存储为对象,这意味着它持有内存位置的引用。

在使用JavaScript及其不同类型时,原始类型和引用类型可能看起来相同,但事实并非如此。对吗?可以在下面的评论部分回答。此外,为了使语言保持一致性,它允许将原始类型当作引用类型来对待。

以下是JavaScript内置类型的列表:

  • boolean
  • number
  • bigint
  • string
  • null
  • undefined
  • symbol
  • object

类型 | 描述 | 备注

Boolean | true或false | 1或0

Number | 任何整数或浮点数值。任何双精度IEEE 754数字。

BigInt | 大整数,甚至超出Number的安全整数限制。BigInt是通过在整数末尾添加n创建的。可以在这里检查它是否支持浏览器。

String | UTF-16字符串。由单引号或双引号分隔的字符序列。

Null | 只有一个值的特殊原始类型,null。称它为特殊,因为它是,稍后将讨论(为什么null返回对象?)。

Undefined | 只有一个值的原始类型,undefined。undefined关键字是分配给未初始化的变量的值。

Symbol | 一个唯一且不可变的值。有关Symbol的更多信息,可以在这里阅读更多。

让看一些原始类型的例子:

var iLoveJavaScript = true; // boolean var yearsOfCoding = 10; // number var bigIntSample = 1234567890987654321n; // bigint var programmerName = "Jin Vincent Necesario"; // string var doesntPointToAny = null; // null var badCompany; // undefined

原始类型总是被赋值,值被复制。

为了实际看到这种行为,让看下面的例子:

var name1 = "Jin"; var name2 = name1; console.log(name1); // Jin console.log(name2); // Jin name2 = "Vincent"; console.log(name1); // Jin console.log(name2); // Vincent

正如看到的,变量name1和name2是完全分开的,可以改变name2的值而不会影响name1,反之亦然。

typeof语法

typeof operand // 或者 typeof(operand)

typeof操作符是识别原始类型的最佳方式,它以字符串格式返回类型。操作数是表示原始或引用类型的表达式。

让看一些例子:

console.log(typeof true); // boolean console.log(typeof 10); // number console.log(typeof bigIntSample); // bigint console.log(typeof "Jin Vincent Necesario"); // string console.log(typeof null); // object -> 稍后更多关于这个的信息 console.log(typeof undefined); // undefined

可能已经运行了上面的代码示例,想知道为什么null数据类型返回object。这是语言的棘手部分,甚至一开始也感到困惑,但不用担心,会在这里回答。

事实是,这是一个bug,已经被TC39(维护JavaScript语言的委员会)确认。这个bug没有被修复的一个原因是,提出的修复方案破坏了许多现有网站。因此,错误仍然存在。有关更多信息,可以在这里阅读更多。

现在已经知道为什么它的行为方式。确定一个值是否为null的最佳方式是直接将其与null的值进行比较。看下面的例子:

var myObject1 = null; console.log(myObject1 === null); // true

引用类型

如果来自像C#、Java或C++这样的其他语言,引用类型是最接近类的东西。引用值是引用类型的实例。此外,引用类型不会将对象直接存储到分配给它的变量中。因此,它持有内存中对象存在位置的引用。

在JavaScript中有多种创建对象的方式。这些是:使用new操作符、对象字面量和构造函数。

让看一个例子:

var myObject2 = new Object(); // 使用new操作符 console.log(typeof myObject2); // object var myObject3 = {}; // 使用对象字面量 {} console.log(typeof myObject3); // object function MyUnknownObject(property1, property2) { this.property1 = property1; this.property2 = property2; } var myObject4 = new MyUnknownObject("JavaSript", 23); // 使用构造函数 console.log(typeof myObject4); // object

让看一个例子:

var _object1 = new Object(); _object1.favoriteLanguage = "JavaScript"; var _object2 = _object1; console.log(_object1); // 输出: {favoriteLanguage: "JavaScript"} console.log(_object2); // 输出: {favoriteLanguage: "JavaScript"} _object1.favoriteLanguage = "C#"; console.log(_object1); // 输出: {favoriteLanguage: "C#"} console.log(_object2); // 输出: {favoriteLanguage: "C#"}

正如看到的,使用变量_object1声明了一个新的对象,并将其赋值给_object2。结果,它们都引用了同一个对象。这就是为什么对它们中的任何一个的更改都会产生相同的效果。

垃圾回收 - 当对象不再使用时,释放对象(垃圾回收)。JavaScript就是这样一种内置此功能的语言。因此,当使用引用类型时,不需要担心手动内存分配。

此外,可能有一个错误的印象,认为不需要取消引用不再需要的对象。因此,最好取消引用不再需要的对象。以便垃圾收集器释放该内存空间。为了做到这一点,将对象变量设置为null。

原始类型和引用类型之间的区别

两者之间的主要区别在于原始类型直接包含它们的值。这意味着,当将一个原始值赋给一个变量时,该值被复制到该变量中。而引用类型不会将对象直接存储到分配给它的变量中。相反,它持有内存中对象存在位置的引用。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485