JavaScript有8种数据类型:7种原始类型(string、number、boolean、null、undefined、symbol、bigint)和1种对象类型object;判断真实类型应使用Object.prototype.toString.call(),它能准确区分各类内置对象。

JavaScript 有哪几种原始类型和对象类型
JavaScript 共有 8 种数据类型:7 种原始类型(string、number、boolean、null、undefined、symbol、bigint),加上 1 种引用类型 object(包含 Array、Function、Date、RegExp、Map、Set 等所有非原始值)。
注意:typeof null 返回 "object" 是历史遗留 bug,不是设计意图;function 的 typeof 返回 "function",但它仍是 object 的子类型(instanceof Object === true)。
怎么判断一个值的真实类型(避免 typeof 和 instanceof 的坑)
用 Object.prototype.toString.call() 最可靠,它能区分内置对象类型:
Object.prototype.toString.call(123) // "[object Number]" Object.prototype.toString.call([]) // "[object Array]" Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call(undefined) // "[object Undefined]" Object.prototype.toString.call(new Date()) // "[object Date]" Object.prototype.toString.call(/a/g) // "[object RegExp]"
不推荐仅靠 typeof 判断数组或正则——typeof [] 是 "object",typeof /a/ 在某些旧环境是 "object";也不建议只用 instanceof,它在跨 iframe 场景会失效(不同全局环境的 Array 构造函数不等价)。
立即学习“Java免费学习笔记(深入)”;
显式类型转换常用方式及陷阱
常见转换操作要清楚它们的规则和副作用:
-
String(value):安全,基本等价于value + "",但对null→"null",undefined→"undefined" -
Number(value):空字符串""→0," \t\n "→0,"123abc"→NaN;undefined→NaN,null→0 -
Boolean(value):只有falsy值(false、0、-0、0n、""、null、undefined、NaN)转为false,其余为true -
parseInt(str, radix)和parseFloat(str):只处理开头有效数字部分,parseInt("12px")→12,但parseInt("08")在非严格模式下可能被当八进制(ES5+ 默认为十进制,但显式传10更稳妥)
隐式转换发生在哪些场景?为什么应该尽量避免
隐式转换常出现在 ==、+、!、if 条件、while、?? 右侧(不触发转换)等位置。例如:
console.log([] == false); // true([] → "" → 0,false → 0)
console.log({} == false); // false({} → "[object Object]" → NaN,NaN == 0 → false)
console.log([1] + [2]); // "12"(两个数组先转字符串再拼接)
console.log([1] + ""); // "1"
这些行为依赖抽象操作(如 ToPrimitive、ToNumber),逻辑嵌套深、可读性差、容易出错。生产代码中应优先使用 ===,显式转换后再比较;字符串拼接前确保是 string 类型;布尔判断前用 Boolean() 或双重非 !! 明确意图。
最易被忽略的是 BigInt 与 Number 混用:它们不能隐式转换,1n == 1 为 false,1n + 1 直接报 TypeError —— 这类边界必须手动处理。










