JS基础数据类型
- String
- Number
- Boolean
- Null
- Undefined
Symbol(ES6+)BigInt
基础数据类型,无指针,存储在 栈内存 (Stack) 中,当一个变量被赋值为基本类型时,它直接持有该值,
主要说新增的ES6+的两个常用基本类型Symbol 和 BigInt
- Symbol(符号、标识): 用来创建唯一、不可复制的标识符,解决命名冲突问题,
- BigInt: 用来表示超大整数, 解决js普通数字精度丢失问题
| 特性 | Symbol | BigInt |
|---|---|---|
| 作用 | 创建唯一标识符 | 表示任意精度的大整数 |
| 值特点 | 永远唯一,即使描述相同也不相等 | 可以是极大 / 极小的整数,无精度限制 |
| 相等性 | Symbol('a') !== Symbol('a') | 10n === 10n |
| 运算 | 不能做数学运算 | 支持加减乘除等整数运算 |
| 类型 | typeof Symbol() → "symbol" | typeof 10n → "bigint" |
| 转换 | 不能转数字 / 不能运算 | 可转数字(小值) |
| 典型场景 | 对象私有属性、避免属性名冲突 | 超大数值、ID、金额、时间戳 |
如下实际code说明:
// Symbol 类型
// Symbol 是 JavaScript 中的一种基本数据类型,表示独一无二的值。每个 Symbol 都是唯一的,即使它们具有相同的描述。Symbol 通常用于对象属性的键,以避免属性名冲突。
// 创建 Symbol
const sym1 = Symbol('description');
const sym2 = Symbol('description');
console.log(sym1 === sym2); // false
// 用作对象唯一属性
const obj = {
[sym1]: 'value1',
[sym2]: 'value2',
};
console.log(obj[sym1]); // 'value1'
console.log(obj[sym2]); // 'value2'
// 特点
// 1. Symbol 类型的值是唯一的,即使它们具有相同的描述。
// 2. Symbol 类型的值不能转换为字符串,也不能用于对象的键。访问需要使用方括号语法。如obj[sym1],而不能使用点语法obj.sym1。
// 3. Symbol 类型的值可以通过 Symbol.for() 方法创建,这些值是全局共享的,可以通过相同的键访问到同一个 Symbol。
const globalSym1 = Symbol.for('global');
const globalSym2 = Symbol.for('global');
console.log(globalSym1 === globalSym2); // true
// 类型
console.log(typeof sym1); // 'symbol'
console.log('--------BigInt')
// BigInt 类型
// BigInt 是 JavaScript 中的一种基本数据类型,用于表示任意精度的整数。它可以表示比 Number 类型更大的整数,适用于需要处理大整数的场景。
// 创建 BigInt
const bigInt1 = 123n;
console.log(bigInt1); // 123n
console.log(typeof bigInt1); // 'bigint'
console.log(bigInt1 + 1n); // 124n
console.log(bigInt1 * 2n); // 246n
// 特点
// 1. BigInt 类型的值以 n 结尾,表示这是一个 BigInt 字面量。
// 2. BigInt 类型的值可以通过 BigInt() 函数创建,也可以直接使用字面量语法。
// 3. BigInt 类型的值不能与 Number 类型的值进行混合运算,需要显式转换。
// 4. BigInt 类型的值可以表示任意精度的整数,但不能表示小数或浮点数。
console.log(10n === 10n); // true
小结:
typeof 基础数据类型检测,都是对应的基础数据类型,如Number、String、Boolean、Undefined、Symbol、BigInt。 但是 typeof null 的类型为object
理解为什么typeof null的类型为 object, 可以参考原型链最顶层 Object.prototype.__proto__ === null