var、let、const都是JS声明变量的关键字,核心区别体现在作用域、变量提升、重复声明、赋值限制上。var是函数作用域,存在变量提升,允许重复声明,未赋值时返回undefined;let和const是块级作用域({}内有效),存在暂时性死区,不能重复声明。let声明的变量可以重新赋值,const声明的是常量,必须初始化且不能重新赋值(引用类型可修改内部属性)。在现代JS开发中,推荐优先使用const,需要修改变量时用let,尽量避免使用var,防止作用域污染和意外的变量覆盖问题。
==是宽松相等运算符,===是严格相等运算符,核心区别是是否进行类型转换。==会先自动将两边的值转换为相同数据类型,再比较数值是否相等,比如'1' == 1结果为true,null == undefined也为true,容易引发隐式转换bug。===不会做任何类型转换,先比较数据类型,再比较数值,类型不同直接返回false,只有类型和值完全一致才返回true。日常开发中强烈推荐使用===,能避免类型转换带来的逻辑错误,保证代码严谨性。
变量提升是JS的解析执行机制,JS引擎在执行代码前,会先扫描所有声明,将var声明的变量、函数声明提升到当前作用域的最顶端。var变量仅提升声明,赋值操作留在原地,所以声明前访问变量会得到undefined。let和const也存在变量提升,但会进入暂时性死区,在声明前访问会直接报错,这是为了规避var的设计缺陷。函数声明的提升优先级高于变量,会整体提升,声明前调用函数也能正常执行,理解变量提升能避免很多代码逻辑错误。
模板字符串就是模板字面量,是ES6新增的字符串定义方式,用反引号``包裹,替代传统的单双引号。它支持直接换行,无需拼接换行符;通过${变量/表达式}实现插值,可直接嵌入变量、计算式、函数调用。相比传统字符串拼接,写法更简洁直观,比如姓名:${name},年龄:${age},不用大量使用+号拼接。同时还支持标签模板进阶用法,是现代JS开发中处理字符串的首选方式,大幅提升字符串拼接的效率和可读性。
Rest参数和扩展运算符都用...表示,使用场景完全相反。Rest参数用于函数形参,接收函数的剩余实参,自动组合成一个数组,解决了arguments类数组的不便,比如function fn(a,...b){},b就是剩余参数组成的数组。扩展运算符用于展开数据,可展开数组、对象、字符串,常用于数组拷贝、数组合并、函数传参、对象合并,比如const arr = [1,2,...[3,4]]。两者语法相同但作用互补,是ES6简化代码的核心语法,大幅简化了数据处理的代码。