JavaScript是解释型弱类型单线程异步脚本语言,核心是驱动网页交互;var/let/const区别在于作用域与提升行为;原始类型值拷贝、引用类型引用拷贝;深拷贝优先用structuredClone;比较一律用===;this绑定取决于调用方式或词法作用域。

JavaScript 是一种运行在浏览器(或 Node.js)中的解释型、弱类型、单线程异步脚本语言,它的核心作用是驱动网页“动起来”——比如响应点击、验证表单、动态加载数据、操作页面结构。它不是 Java 的简化版,和 Java 没有血缘关系,名字只是历史营销产物。
为什么 var/let/const 不能混用?
三者本质区别不在“能不能改值”,而在**作用域规则**和**变量提升行为**:
-
var是函数作用域,会变量提升到函数顶部,且允许重复声明 —— 容易造成循环中setTimeout全部输出相同值(如i=3) -
let和const是块级作用域({}内),存在“暂时性死区”(TDZ),即声明前访问会报ReferenceError -
const不代表“内容不可变”,只代表“绑定不可重赋值”:你可以push()一个const arr = [],但不能arr = [1,2]
实操建议:默认用 const;需要重新赋值时换 let;var 仅用于兼容极老环境,新项目禁用。
原始类型 vs 引用类型,为什么 Object.assign({}, obj) 不够深?
原始类型(string、number、boolean、null、undefined、symbol、bigint)赋值是“值拷贝”,互不影响;引用类型(Object、Array、Function 等)赋值是“引用拷贝”,指向同一堆内存地址。
所以:
立即学习“Java免费学习笔记(深入)”;
-
Object.assign({}, obj)只做第一层浅拷贝 —— 若obj.user.name被修改,拷贝后的对象也会变 - 需要深拷贝时,优先用
structuredClone(obj)(现代浏览器支持);降级可用JSON.parse(JSON.stringify(obj))(注意丢失函数、undefined、Date 等) - 判断类型别只用
typeof:它对null返回"object",对数组也返回"object";准确检测用Object.prototype.toString.call(arr) === "[object Array]"
== 和 === 的区别,为什么推荐永远用 ===?
== 会触发隐式类型转换,规则复杂且反直觉:
-
[] == false→true(空数组转数字为0,0 == false成立) -
"0" == false→true(字符串转数字为0) -
null == undefined→true,但null === undefined→false
这些转换在条件判断、表单校验、状态比对中极易引入隐藏 bug。实操中:所有比较一律用 ===,除非你明确需要 == 的宽松逻辑(几乎不存在)。
函数声明、函数表达式和箭头函数,this 行为怎么总不一致?
关键在 this 绑定时机:
- 普通函数(声明或表达式):
this由**调用方式**决定(隐式绑定:obj.fn()中this === obj;默认绑定:单独调用则this === window或undefined(严格模式)) - 箭头函数:没有自己的
this,它**继承外层词法作用域的this**,适合用在回调中避免this丢失(如事件监听、setTimeout、map回调) - 注意:箭头函数不能用作构造函数(无
prototype),也不能使用arguments对象(用剩余参数...args替代)
容易踩的坑:给 DOM 元素加事件监听时写 btn.addEventListener('click', () => { console.log(this) }),这里的 this 是外层作用域的,不是 btn —— 如果你需要 btn,应改用普通函数或用 event.target。











