JavaScript 是一种弱类型或者动态的语言。这意味着你不用提前声明变量的的类型,在程序运行的过程中,类型会被自动确定。这也意味着你可以使用同一个变量来保存不同类型的数据。
数据类型
目前最新的 ECMAScript 标准种定义了8种数据类型:
- 7种简单数据类型(基本数据类型)
- String
- Number
- Boolean
- Undefined
- Null
- Symbol (ES6+)
- BigInt (ES10+)
- 1种复杂数据类型
- Object
Symbol
Symbol 是 ES6 新定义的一种原始类型,它具有唯一性与不可修改性,表示独一无二的值。
在 JavaScript 中,我们可以使用 Symbol 函数来生成一个 Symbol 数据。Symbol 函数可以接受一个字符串作为参数,可以表示对 Symbol 值的描述;也可以不传入参数,同样可以获得 Symbol 值,但这样可能不利于区分这些 Symbol 值。需要注意传入的参数仅仅是对当前 Symbol 值的描述,所以尽管传入同样的参数,所得到的两个 Symbol 值也是不相等的。
let sym = Symbol(); console.log(sym); // Symbol()let sym1 = Symbol("sym");let sym2 = Symbol("sym");console.log(sym1); // Symbol(sym1)console.log(sym1 === sym2); // false
需要注意的是,在 Symbol 函数前并不需要添加 new 操作符,因为生成的 Symbol 是一个原始类型的值而不是对象,添加了 new 关键字反而会运行报错。
let sym = new Symbol("sym"); // Uncaught TypeError: Symbol is not a constructor
由于 Symbol 具有唯一性,所以 Symbol 值在作为标识符或者用于对象的属性名时,可以保证不会出现重复的属性名。不过由于 Symbol 的特殊性,作为对象的属性名是在一些写法或运用上会有差异。
let sym = Symbol("sym");let obj = { [sym]: "symbol" // 需要用 [] 来包裹 Symbol 值};console.log(obj.sym); // undefined,点运算符 无法取到 Symbol 属性的值,因为 点运算符 后对应的是字符串console.log(obj[sym]); // symbol,用 [] 可以顺利获取到值
BigInt
BigInt 是 ES10 添加的一个数据类型,也是用来表示数值的一个类型,可以用来表示任意精度的争取。这区别于 Number 类型,因为 Number 类型有一个安全范围,面对大整数且要求精确度的时候,Number 类型显得心有余而力不足。这时候我们就可以使用 BigInt 来存储并操作这些大整数。
Number 类型的值可以准确表达的最大整数是 2^53,没有比这个数更大的精确数字了。
由于 JavaScript 中的 Number 是属于双精度浮点数,那么它对应可以表达的精确数值的范围是 [-(2^53-1), 2^53-1],即 ±9007199254740991,这也是 Number 类型的安全表达范围。
BigInt 通过在整数值末尾添加 n 或者是调用 BigInt(val) 的方式来创建,在使用函数创建时,同样注意不能在函数前使用 new 操作符,这一点与 Symbol 类型是一样的。
// 创建 BigInt 值let bNum1 = 9007199254740991n;let bNum2 = BigInt(2);console.log(bNum1 + bNum2); // 9007199254740993n;// 使用 Number 运算console.log(9007199254740991 + 2); // 9007199254740992
需要注意 BigInt 类型只能与同类型值进行计算,否则会报错,这点与 Number 类型也是有差异的。
console.log(1 + 1n); // Uncaught TypeError: Cannot mix BigInt and other types
JavaScript