javascript有7种原始类型:string、number、bigint、boolean、undefined、null、symbol,均不可变;typeof null返回'object'是历史bug;==触发隐式转换,===先判类型再判值;原始值调用方法时自动装箱为包装对象,操作后即销毁。

JavaScript 原始类型(Primitive Types)是 JS 最基础的数据单元,掌握它们的操作逻辑,能帮你避开大量隐式转换陷阱、写出更可预测的代码。重点不是死记类型列表,而是理解“何时被当作什么处理”以及“操作背后发生了什么”。
搞清 7 种原始类型及其不可变性
JS 有 7 种原始类型:string、number、bigint、boolean、undefined、null、symbol(ES2015+)、以及新增的 void 0 不是类型,但 typeof null === 'object' 是历史遗留 bug,需单独记住。关键点是:所有原始类型值都是不可变的(immutable)——你无法修改字符串某个字符,也无法给数字添加属性;看似“修改”的操作(如 str.toUpperCase())实际返回新值,原值不变。
掌握 typeof 与 == / === 的行为差异
原始类型的判断和比较极易出错,必须动手验证:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
-
typeof 对大多数原始类型准确(
typeof 42 → 'number'),但typeof null返回'object'(必须硬记);typeof undefined和typeof void 0都是'undefined' -
==(抽象相等) 触发隐式类型转换:例如
0 == false→ true,'' == 0→ true,null == undefined→ true(但不等于其他任何值) -
===(严格相等) 先判类型再判值,推荐日常使用;注意
0 === -0为 true,但Object.is(0, -0)为 false
理解包装对象(Wrapper Objects)的自动装箱/拆箱机制
原始值本身没有方法,但 JS 在调用方法时会临时创建对应包装对象(如 String、Number、Boolean),执行完立刻销毁。这就是为什么 'abc'.length 可以工作,但 let s = 'abc'; s.foo = 1; console.log(s.foo) 输出 undefined —— 属性写在临时对象上,下一刻就消失了。
建议练习:
– 写 let n = 123; n.toFixed(2),思考中间发生了什么
– 尝试 let b = true; b.valueOf() 和 b.toString(),观察结果
– 对比 new Boolean(false) 与 false 在 if 判断中的表现(前者为 true!)
关注特殊值的行为边界
NaN、-0、Infinity、空字符串、空数组(虽非原始但常混淆)这些值在原始类型上下文中高频出现:
-
NaN !== NaN,唯一不等于自身的值,必须用Number.isNaN()判断(不用全局isNaN(),它会强制转数字) -
-0 === 0为 true,但1 / -0是-Infinity,Object.is(-0, 0)为 false -
''、0、false、null、undefined、NaN在布尔上下文中都为 falsy,但只有它们自己是原始类型;[]和{}是 truthy,尽管“看起来空”










