在JavaScript编程中,理解数据类型是至关重要的,因为它们是构建程序的基础。本文将探讨JavaScript的内置数据类型,以及原始类型和引用类型之间的区别。
从静态类型语言(如C#)转向JavaScript时,可能会对其动态特性感到困惑。最初,甚至在寻找类,但意识到JavaScript并没有正式支持类。这最初可能让人感到陌生,但随着时间的推移,逐渐习惯了。因此,决定创建这篇文章,以帮助学生或开发者分享学习JavaScript类型的知识和旅程。
当开始学习JavaScript时,许多优秀的开发者争论说JavaScript没有类型。特别是那些来自强类型语言(如C#、Java和C++)的开发者。当时,不知道该说什么,因为还不够了解。然而,如果遇到或将遇到这类开发者,可以指向JavaScript语言规范。将在下面提供链接和一些截图,说明JavaScript语言确实有类型。
截至目前,有“ECMAScript 2020语言规范”,可以在这里找到。最后,让看看规范对类型有什么说法。请参见下面的截图:
希望这能帮到。现在,让跳到JavaScript内置类型。
JavaScript语言有两种类型:原始类型和引用类型。原始类型(也称为值类型)存储为简单数据类型,而引用类型存储为对象,这意味着它持有内存位置的引用。
在使用JavaScript及其不同类型时,原始类型和引用类型可能看起来相同,但事实并非如此。对吗?可以在下面的评论部分回答。此外,为了使语言保持一致性,它允许将原始类型当作引用类型来对待。
以下是JavaScript内置类型的列表:
类型 | 描述 | 备注
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。
两者之间的主要区别在于原始类型直接包含它们的值。这意味着,当将一个原始值赋给一个变量时,该值被复制到该变量中。而引用类型不会将对象直接存储到分配给它的变量中。相反,它持有内存中对象存在位置的引用。