前言
随着 JavaScript 越来越流行,越来越多地开发者开始接触并使用 JavaScript。
同时我也发现,有不少开发者对于 JavaScript 最基本的原始值和包装对象都没有很清晰的理解。
那么本篇文章,就由渣皮来给大家详细介绍一下它们。
🧐 话不多说,Let’s go!
正文
原始类型 (Primitive types)
原始类型也被称为“基本类型”。
目前在 JavaScript 中有以下几种原始类型:
string
(字符串)number
(数字)boolean
(布尔)null
(空)undefined
(未定义)bigint
(大整数,ES6)symbol
(标志?ES6)
📝 如下:
typeof 'chenpipi'; // "string"
typeof 12345; // "number"
typeof true; // "boolean"
typeof null; // "object"
typeof undefined; // "undefined"
typeof 12345n; // "bigint"
typeof Symbol(); // "symbol"
💡 特别注意
typeof null
虽然返回"object"
,但是这不代表null
就是对象,这其实是 JavaScript 的一个 Bug,且从 JavaScript 诞生以来便如此。在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于
null
代表的是空指针(大多数平台下值为 0x00),因此,null
的类型标签是 0,typeof null
也因此返回"object"
。The history of “typeof null”:https://2ality.com/2013/10/typeof-null.html
原始值 (Primitive values)
原始值也就是原始类型的值(数据)。
A primitive value is data that is not an object and has no methods.
原始值是一种没有任何方法的非对象数据。
也就是说,string
、number
和 boolean
等原始类型的值本身是没有任何属性和方法的。
😨 这个时候嗅觉敏锐的小伙伴是不是已经察觉到有什么不对劲了?
是孜然!我加了孜然!(手动狗头并划掉)
🤓 这里有一个非常有意思的点,但是在讨论这个问题之前,先让我们认识下包装对象。
包装对象 (Wrapper objects)
除了 null
和 undefined
外的原始类型都有其相应的包装对象:
String
(字符串)Number
(数字)Boolean
(布尔)BigInt
(大整数,ES6)Symbol
(标志?ES6)
对象 (Object)
对象是引用类型。
首先,包装对象本身是一个对象,也是函数。
String instanceof Object; // true
String instanceof Function; // true
构造函数 (Constructor)
实例 (Instance)
其中 String
、Number
和 Boolean
均支持使用 new
运算符来创建对应的包装对象实例。
📝 例如 String
的声明(节选):
interface StringConstructor {
new(value?: any): String;
(value?: any): string;
readonly prototype: String;
}
declare var String: StringConstructor;
📝 使用 new
运算符得到的数据是对象(Object):
// 字符串
typeof 'pp'; // "string"
typeof new String('pp'); // "object"
new String() instanceof Object; // true
// 数字
typeof 123; // "number"
typeof new Number(123); // "object"
new Number() instanceof Object; // true
// 布尔
typeof true; // "boolean"
typeof new Boolean(true); // "object"
new Boolean() instanceof Object; // true
📝 我们可以调用包装对象实例的 valueOf()
函数来获取其原始值:
// 字符串
let<