全面总结 JavaScript 类型相关知识点

全面总结 JavaScript 类型相关知识点

💡 原文中文,约22800字,阅读约需55分钟。
📝

内容提要

JavaScript 类型分为基本类型和对象类型。基本类型包括 string、number、boolean、undefined、null、symbol、bigInt,其余均为对象类型。文章介绍了模板字符串、NaN 判断、取整技巧、相等性判断及 typeof、instanceof、Object.prototype.toString 等类型判断方法,并强调应优先使用严格相等。

🔎

延伸解读

模板字符串的实用技巧与注意事项

模板字符串(反引号)不仅支持多行和表达式插值,还能避免引号转义。但需注意:反引号内所有字符(包括空格和换行)都计入长度;直接插入对象会调用其 toString 方法,得到 [object Object],需先用 JSON.stringify 转换。带标签的模板字符串本质是函数调用,可用于自定义模板引擎,如 hyperx。

NaN 与相等性判断的陷阱

NaN 是 number 类型,但 NaN === NaN 返回 false,因此判断 NaN 应使用 Number.isNaN(仅当值就是 NaN 时返回 true),而非全局 isNaN(会先转换为数字)。相等性判断推荐使用严格相等 ===,避免 == 的隐式类型转换。Object.is 与 === 的区别在于:Object.is(0, -0) 为 false,Object.is(NaN, NaN) 为 true。

类型判断方法的选择与局限

typeof 适合判断基本类型(除 null)和函数,但 typeof null 返回 'object',且无法区分数组和对象。instanceof 用于判断实例,但不能用于基本类型。Object.prototype.toString.call() 可精确获取内部 [[Class]],但需注意 Symbol.toStringTag 可自定义。实际开发中可组合使用,如 lodash 的 isNumber 同时用 typeof 和 toString 判断。

BigInt 与精度问题的应对

JavaScript 的 number 遵循 IEEE 754 双精度浮点标准,存在精度丢失问题,如 0.1 + 0.2 !== 0.3。对于大整数运算(超过 Number.MAX_SAFE_INTEGER),可使用 BigInt 避免精度丢失,例如在 LeetCode 的加一问题中,用 BigInt 转换后运算再转回字符串。但 BigInt 不能与 number 直接混合运算,且不支持 new 构造。

❓

Q&A

JavaScript 中有哪些基本类型?

JavaScript 的基本类型有七种:string、number、boolean、undefined、null、symbol 和 bigInt。其中 symbol 和 bigInt 是 ES6 新增的。

如何判断一个值是不是 NaN?

可以使用 isNaN() 或 Number.isNaN()。isNaN() 会先将参数转换为数字再判断,所以 isNaN('aaa') 返回 true;而 Number.isNaN() 只在参数本身就是 NaN 时返回 true,不会进行转换。

JavaScript 中如何取整?

可以使用 Math.floor() 向下取整、Math.ceil() 向上取整、Math.round() 四舍五入、Math.trunc() 直接去掉小数部分。此外,位运算如 ~~、| 0 等也可以取整,但可读性较差,不建议使用。

JavaScript 中 == 和 === 有什么区别?

== 是宽松相等,比较时会进行类型转换;=== 是严格相等,不会进行类型转换,只有类型和值都相同才返回 true。建议优先使用 ===,因为结果更直观、更符合预期。

typeof 和 instanceof 在类型判断上有什么不同?

typeof 用于判断基本类型(除 null 外)和函数类型,返回类型字符串,且对未声明变量安全;instanceof 用于判断对象是否为某个构造函数的实例,不能用于基本类型。

Object.prototype.toString 在类型判断中有什么作用?

Object.prototype.toString.call(value) 可以返回一个表示对象类型的字符串,如 '[object Number]'、'[object Null]' 等,常用于精确判断类型,尤其适合判断内置对象类型。

🏷️

标签

➡️

继续阅读