
文章目录一、 变量声明从 var 到 let 与 const 的进化核心要点解析1、块级作用域2、暂时性死区TDZ3、const 的“不变”误区二、 数据类型两大阵营原始类型 vs 引用类型1. 原始类型栈内存存储按值访问2. 引用类型堆内存存储按引用访问三、 类型检测三把“照妖镜”四、 类型转换显式与隐式双刃剑显式转换手动控制推荐隐式转换自动发生容易踩坑五、 知识图谱速查表面试/实战高频 给你的“避坑”与进阶建议一、 变量声明从 var 到 let 与 const 的进化声明变量是第一步。JS主要提供了三种关键字它们在作用域和提升Hoisting 行为上有本质区别。核心要点解析1、块级作用域let 和 const 的出现解决了 var 污染全局和循环变量泄露的问题。if(true){var a1;letb2;}console.log(a);// 输出1var 逃逸出了块级 console.log(b);// 报错b is not definedlet 被锁在块内2、暂时性死区TDZ虽然 let 和 const 也会提升但在声明之前访问它们会报 ReferenceError这个声明到赋值之间的区域就是 TDZ。这强制你必须先声明后使用代码更健壮。3、const 的“不变”误区const 保证的是变量指向的内存地址不变。如果指向的是对象对象的属性值是可以修改的。const obj{name:JS};obj.nameJavaScript;// ✅ 允许因为 obj 的引用没变 // obj{};// ❌ 报错试图更改引用二、 数据类型两大阵营原始类型 vs 引用类型JS 的数据类型分为原始类型Primitive 和引用类型Object。它们的存储方式和赋值机制完全不同。1. 原始类型栈内存存储按值访问目前有 7 种原始类型。它们保存在栈内存中赋值时是“复制一份值”。number双精度 64 位浮点数。包含整数和小数以及特殊值 Infinity、-Infinity 和 NaNNot a Number。注意NaN 是唯一的 typeof NaN ‘number’ 且 NaN ! NaN 的值需用 Number.isNaN() 判断。bigintES2020用于表示大于 2^53 - 1 或小于 -(2^53 - 1) 的整数。写法const big 9007199254740991n;。stringUTF-16 编码的字符序列。不可变任何字符串操作都会返回一个新字符串。booleantrue 和 false。undefined声明了变量但未赋值时的默认值。null表示“空”或“不存在”的对象指针这也是著名的 typeof null “object” 的历史遗留 Bug。symbolES6保证唯一性的标识符常用于定义对象的私有属性名或常量值。2. 引用类型堆内存存储按引用访问Object对象一切复杂结构的基类。包括普通对象 {}、数组 []、函数 function、日期 Date、正则 RegExp 等。存储机制变量名存储在栈中指向堆内存中实际存储数据的内存地址。赋值时只是复制了这个地址引用新旧变量指向同一个数据。赋值对比关键区别// 原始类型独立副本leta10;letba;b20;console.log(a);//10互不影响 // 引用类型共享引用letobj1{value:10};letobj2obj1;obj2.value20;console.log(obj1.value);//20因为指向同一片内存三、 类型检测三把“照妖镜”由于动态类型我们经常需要确认变量的类型。实战最推荐Array.isArray() 专门检测数组判断空值用 null 或 undefined。四、 类型转换显式与隐式双刃剑JS 的灵活性也体现在“自动类型转换”上即隐式转换。显式转换手动控制推荐转字符串String(123) 或 (123).toString()转数字Number(‘456’)、parseInt(‘123px’)解析、 一元运算符转布尔Boolean(0) 返回 false隐式转换自动发生容易踩坑当使用 、、 或 if 判断时引擎会偷偷帮我们转换类型。console.log(12);//12(数字隐式转为字符串)console.log(6-2);//4(字符串隐式转为数字)console.log(0false);//true(布尔转为数字)console.log(0false);//false(严格相等不转换类型推荐使用)最佳实践除了比较 null 或 undefined 外永远使用 全等 和 !避免隐式转换带来的预料之外的结果。五、 知识图谱速查表面试/实战高频 给你的“避坑”与进阶建议1、拥抱 let 和 const在现代开发中彻底放弃 var这是公认的最佳实践。2、操作不可变性操作引用类型对象/数组时若不想影响原数据请使用展开运算符 … 或 Object.assign() 创建浅拷贝深拷贝需使用 structuredClone() 或 lodash.cloneDeep。3、注意浮点数精度0.1 0.2 ! 0.3涉及金额计算请使用整数分或 BigInt。4、内存泄露引用类型因为“按引用访问”若全局变量持有了大对象的引用且忘记释放会导致内存泄露。记得在不需要时赋值为 null 来解除引用。