javascript类型识别应优先使用object.prototype.tostring.call()而非typeof,类型转换需区分隐式与显式,避免==和+等操作符的隐式转换陷阱,推荐显式转换和严格相等。

类型识别和类型转换在 JavaScript 中是一体两面的事:识别是前提,转换是动作;不先搞清“它是什么”,就无法安全、合理地把它变成“想要的什么”。二者共同构成 JS 动态类型系统的核心逻辑,也是日常 bug 的高发区。
类型识别:别信 typeof,多用 toString.call
typeof 最快但最不准——它把 null 说成 object,把数组、正则、日期全归为 object,对基本类型也仅限于 string/number/boolean/undefined/function 这几类。真正可靠的是 Object.prototype.toString.call(),它返回形如 "[object Array]" 或 "[object Null]" 的字符串,能精确区分所有内置类型。
- 判断数组:Object.prototype.toString.call([]) === "[object Array]"
- 判断 null:Object.prototype.toString.call(null) === "[object Null]"
- 判断 undefined:Object.prototype.toString.call(undefined) === "[object Undefined]"
- 判断 Symbol 或 BigInt:同样有唯一对应的标识字符串
类型转换:分清隐式 vs 显式,警惕 == 的陷阱
隐式转换发生在运算或比较时(如 1 + '2' → '12',[] == false → true),规则复杂且易出错;显式转换由开发者主动触发,更可控。关键要记住:== 会触发隐式转换,=== 不会。
- Number('123') → 123,Number('abc') → NaN,Number('') → 0,Number(null) → 0,Number(undefined) → NaN
- String(123) → '123',String(true) → 'true',String(null) → 'null',String(undefined) → 'undefined'
- Boolean(0)、Boolean('')、Boolean(NaN)、Boolean(null)、Boolean(undefined) 都为 false;其余真值转为 true
常见坑点:null/undefined、对象转原始值
null 和 undefined 在类型识别中极易混淆:typeof null 是 'object',但 Object.prototype.toString.call(null) 是 '[object Null]';两者在 Number() 转换中表现不同(null→0,undefined→NaN),在 Boolean() 中却都为 false。
- 对象转字符串:默认调用 toString(),{} → '[object Object]',[] → '',new Date() → 时间字符串
- 对象转数字:先调 valueOf(),再 fallback 到 toString(),{} → NaN,[1,2] → NaN,['1'] → 1
- 数组转布尔永远为 true(哪怕空数组 []),但 [] == false 为 true——这是隐式转换叠加宽松相等的结果
实践建议:优先使用显式转换,避免依赖隐式行为
写代码时尽量避开 +、==、! 等可能触发隐式转换的操作符。需要数值就用 Number() 或 parseInt(),需要字符串就用 String() 或模板字面量,需要布尔就用 !! 或 Boolean()。对关键变量做类型校验(如 if (Array.isArray(data)))比事后修复更高效。
- 替代 a == b:用 a === b 或 Object.is(a, b)
- 替代 a + '':用 String(a) 或 `${a}`
- 替代 +a:用 Number(a),尤其当 a 可能为 null/undefined 时需提前 guard











