当前位置: 首页 > news >正文

JavaScript 相关知识点整理

1. nullundefined 的区别是什么?

  • 答案
    • undefined:表示变量已声明但未赋值。例如:let a; console.log(a) 输出 undefined
    • null:表示变量被显式赋值为“空值”。例如:let b = null
    • 关键区别undefined 是 JavaScript 引擎自动赋予的,而 null 是开发者主动设置的。

2. 什么是变量提升(Hoisting)?

  • 答案
    • JavaScript 在代码执行前会将变量和函数的声明提升到作用域顶部。但变量仅声明提升,赋值不会提升。
    • 示例
      console.log(a); // 输出 undefined
      var a = 10;
      
      等价于:
      var a;
      console.log(a); // undefined
      a = 10;
      
    • 注意letconst 存在暂时性死区,不会完全提升。

3. 闭包是什么?它有什么作用?

  • 答案
    • 闭包:函数嵌套函数时,内部函数可以访问外部函数的变量,即使外部函数已执行完毕。
    • 作用
      • 数据隐藏:封装私有变量(如计数器)。
      • 模块化开发:隔离作用域,避免全局污染。
    • 示例
      function createCounter() {let count = 0;return { increment: () => ++count,getCount: () => count};
      }
      const counter = createCounter();
      counter.increment(); // count = 1
      
    • 缺点:滥用闭包可能导致内存泄漏。

4. 同步代码和异步代码的区别?

  • 答案
    • 同步代码:按顺序执行,阻塞后续代码。
      console.log("Start");
      console.log("End"); // 按顺序输出
      
    • 异步代码:代码放入任务队列,主线程空闲时执行。
      console.log("Start");
      setTimeout(() => console.log("Middle"), 0);
      console.log("End"); // 输出顺序:Start → End → Middle
      
    • 常见异步操作setTimeoutfetch、Promise。

5. letconstvar 的区别?

  • 答案
    • 作用域
      • var:函数作用域。
      • let/const:块级作用域(如 {} 内)。
    • 变量提升
      • var 会提升并初始化为 undefined
      • let/const 提升但未初始化,使用前会报错。
    • 重新赋值
      • const 声明后不能重新赋值(但对象属性可修改)。

6. ===== 的区别?

  • 答案
    • ==(宽松相等):会进行类型转换后比较值。
      console.log(1 == "1"); // true(字符串转为数字)
      
    • ===(严格相等):值和类型都相同才返回 true
      console.log(1 === "1"); // false
      
    • 建议:优先使用 === 避免隐式转换错误。

7. Promise 是什么?它的状态有哪些?

  • 答案
    • Promise:表示异步操作的最终结果,解决回调地狱问题。
    • 三种状态
      • Pending:初始状态,未完成或拒绝。
      • Fulfilled:操作成功完成。
      • Rejected:操作失败。
    • 示例
      const promise = new Promise((resolve, reject) => {setTimeout(() => resolve("成功"), 1000);
      });
      promise.then(result => console.log(result)); // 1秒后输出“成功”
      
    • 链式调用.then().catch() 处理结果和错误。

8. 事件冒泡和事件捕获是什么?

  • 答案
    • 事件冒泡:事件从触发元素向父元素逐层传播(默认)。
    • 事件捕获:事件从根元素向触发元素逐层传播。
    • 示例
      <div id="parent"><div id="child">点击</div>
      </div>
      
      parent.addEventListener("click", () => console.log("父元素被点击"));
      child.addEventListener("click", () => console.log("子元素被点击"));
      // 点击子元素时输出:子元素 → 父元素(冒泡阶段)
      
    • 阻止冒泡event.stopPropagation()

9. 箭头函数和普通函数的区别?

  • 答案
    • this 指向
      • 普通函数:根据调用方式动态绑定 this
      • 箭头函数:继承父作用域的 this,无法通过 call/apply 修改。
    • 示例
      const obj = {name: "Alice",sayName: function() { console.log(this.name) }, // 输出 AlicesayNameArrow: () => console.log(this.name) // 输出 undefined(this指向全局)
      };
      
    • 其他区别:箭头函数没有 arguments 对象,不能作为构造函数。

10. 什么是原型链?

  • 答案
    • 原型链:对象通过 __proto__ 属性向上查找属性和方法的链式结构。
    • 示例
      function Person(name) { this.name = name; }
      Person.prototype.sayName = function() { console.log(this.name) };
      const alice = new Person("Alice");
      alice.sayName(); // 输出 Alice(通过原型链找到方法)
      
    • 继承机制:子类通过 prototype 指向父类实例实现继承。

更多高频问题:

  • 跨域解决方案:CORS、JSONP、代理服务器。
  • 深拷贝实现JSON.parse(JSON.stringify(obj))(局限性:无法处理函数和循环引用)。
  • 防抖和节流:优化高频事件(如滚动、输入)的性能。

相关文章:

  • C++ 红黑树
  • 【Vagrant+VirtualBox创建自动化虚拟环境】Ansible测试Playbook
  • git fetch和git pull的区别
  • ​【空间数据分析】缓冲区分析--泰森多边形(Voronoi Diagram)-arcgis操作
  • Vue使用Sortablejs拖拽排序 视图显示与数据不一致、拖拽结束后回跳问题
  • excel如何做相关系数分析
  • 【网络原理】TCP异常处理(二):连接异常
  • 脑机接口:重塑人类未来的神经增强革命
  • HarmonyOS NEXT 诗词元服务项目开发上架全流程实战(二、元服务与应用APP签名打包步骤详解)
  • 什么是 MCP?AI 应用的“USB-C”标准接口详解
  • CentOS环境下搭建seata(二进制、MySQL)
  • [计算机网络]物理层
  • Nginx核心功能与LNMP部署
  • 主流微前端框架比较
  • pytest-前后置及fixture运用
  • Mybatis-plus代码生成器的创建使用与详细解释
  • Nginx部署与源码编译构建LAMP
  • SVMSPro平台获取Websocket视频流规则
  • ComfyUI 学习笔记,案例1:2_pass_txt2img
  • CMD与PowerShell:Windows命令行工具的对比与使用指南
  • 海口市政协党组成员、秘书长、机关党组书记汪娟被查
  • 不准打小孩:童年逆境经历视角下的生育友好社会
  • 西藏阿里地区日土县连发两次地震,分别为4.8级和3.8级
  • 论法的精神︱张玉敏:知识产权保护要为社会经济文化发展服务
  • 利物浦提前四轮英超夺冠,顶级联赛冠军数追平曼联
  • 申花四连胜领跑中超,下轮榜首大战对蓉城将是硬仗考验