什么是javascript及其核心语法详解【教程】

16次阅读

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

什么是 javascript 及其核心语法详解【教程】

JavaScript 是一种运行在 浏览器(或 Node.js)中的解释型、弱类型、单线程异步脚本语言,它的核心作用是驱动网页“动起来”——比如响应点击、验证表单、动态加载数据、操作页面结构。它不是 Java 的简化版,和 Java 没有血缘关系,名字只是历史营销产物。

为什么 var/let/const 不能混用?

三者本质 区别 不在“能不能改值”,而在 **作用域 规则 ** 和 ** 变量提升行为 **:

  • var 是函数作用域,会变量提升到函数顶部,且允许重复声明 —— 容易造成循环中 setTimeout 全部输出相同值(如 i=3
  • letconst 是块级作用域({} 内),存在“暂时性死区”(TDZ),即声明前访问会报 ReferenceError
  • const 不代表“内容不可变”,只代表“绑定不可重赋值”:你可以 push() 一个 const arr = [],但不能 arr = [1,2]

实操建议:默认用 const;需要重新赋值时换 letvar 仅用于兼容极老环境,新项目禁用。

原始类型 vs 引用类型,为什么 Object.assign({}, obj) 不够深?

原始类型(stringnumberbooleannullundefinedsymbolbigint)赋值是“值拷贝”,互不影响;引用类型(ObjectArrayFunction 等)赋值是“引用拷贝”,指向同一堆内存地址。

所以:

立即学习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]"

== 和 === 的区别,为什么推荐永远用 ===?

== 会触发 隐式类型转换,规则复杂且反直觉:

  • [] == falsetrue(空数组转数字为 00 == false 成立)
  • "0" == falsetrue(字符串转数字为 0
  • null == undefinedtrue,但 null === undefinedfalse

这些转换在条件判断、表单校验、状态比对中极易引入隐藏 bug。实操中:所有比较一律用 ===,除非你明确需要 == 的宽松逻辑(几乎不存在)

函数声明、函数表达式和箭头函数,this 行为怎么总不一致?

关键在 this 绑定时机:

  • 普通函数(声明或表达式):this 由 ** 调用方式 ** 决定(隐式绑定:obj.fn()this === obj;默认绑定:单独调用则 this === windowundefined(严格模式)
  • 箭头函数:没有自己的 this,它 ** 继承外层词法作用域的 this**,适合用在回调中避免 this 丢失(如事件监听、setTimeoutmap 回调)
  • 注意:箭头函数不能用作构造函数(无 prototype),也不能使用 arguments 对象(用剩余参数 ……args 替代)

容易踩的坑:给 DOM 元素加事件监听时写 btn.addEventListener('click', () => {console.log(this) }),这里的 this 是外层作用域的,不是 btn —— 如果你需要 btn,应改用普通函数或用 event.target

真正难的不是记住语法,而是理解“变量是内存引用”“作用域决定可见性”“this 是调用时绑定的”这些底层机制。一旦这些点模糊,任何看似简单的代码都可能在某个边界场景突然失效。

text=ZqhQzanResources