Skip to content

JavaScript 变量类型深度解析

原始类型(Primitive Types)

JavaScript 中原始类型数据直接存储在栈内存中,具有不可变性。

7种原始类型

  1. Undefined:声明未赋值的变量

    let a; // typeof a => 'undefined'
  2. Null:空值引用

    let b = null; // typeof b => 'object'(历史遗留问题)
  3. Boolean:逻辑值

    let c = true; // typeof c => 'boolean'
  4. Number:双精度浮点数

    let d = 42; // typeof d => 'number'
  5. String:UTF-16 字符串

    let e = "hello"; // typeof e => 'string'
  6. Symbol(ES6):唯一值标识符

    let f = Symbol('id'); // typeof f => 'symbol'
  7. BigInt(ES2020):大整数

    let g = 9007199254740991n; // typeof g => 'bigint'

引用类型(Reference Types)

存储在堆内存中,变量保存的是内存地址引用。

常见引用类型

  • Object{}
  • Array[]
  • Functionfunction() {}
  • Date
  • RegExp
  • 自定义对象

特性示例

let obj1 = { name: 'John' };
let obj2 = obj1; // 复制引用地址
obj2.name = 'Alice';
console.log(obj1.name); // 'Alice'(联动修改)
console.log({} === {}); // false(比较的是内存地址)

类型转换

隐式转换

// 转换为 Boolean
if (0) { /* 不会执行 */ } // 0 → false
// 转换为 String
console.log(1 + '2'); // '12'
// 转换为 Number
console.log('3' * 2); // 6

显式转换

String(123); // '123'
Number('42'); // 42
Boolean('hello'); // true
parseInt('10px'); // 10

转换规则表

原始值转 Boolean转 Number转 String
""false0""
"0”true0”0"
"42”true42”42”
nullfalse0”null”
undefinedfalseNaN”undefined”
trueNaN”[object Object]“

类型判断

1. typeof 操作符

typeof undefined; // 'undefined'
typeof 42; // 'number'
typeof Symbol(); // 'symbol'
typeof function(){}// 'function'
typeof null; // 'object'(需要注意)

2. instanceof

检测原型链:

[] instanceof Array; // true
new Date() instanceof Date; // true

3. Object.prototype.toString

最准确的类型判断:

Object.prototype.toString.call([]);
// "[object Array]"
Object.prototype.toString.call(null);
// "[object Null]"

类型判断最佳实践

function getType(target) {
return Object.prototype.toString.call(target)
.slice(8, -1)
.toLowerCase();
}
getType([]); // 'array'
getType(null); // 'null'

注意事项

  1. 浮点数精度0.1 + 0.2 !== 0.3
  2. 类型转换陷阱== 会进行隐式转换,建议使用 ===
  3. 深拷贝问题:引用类型需要递归拷贝
  4. 包装对象:临时对象机制
    let s = 'hello';
    s.name = 'str'; // 临时创建包装对象,随后销毁
    console.log(s.name); // undefined