← 返回目录

第 11 卷

第 11 / 19 卷日期:

• let:允许重新赋值。与 var 一致,声明后的变量可以多次修改值,唯一区别是作用域和提升特

性。

Code block

1let b = 20;

2b = 40;

3b = 60;

4console.log(b); // 60(重新赋值成功)

• const:不允许重新赋值。 const 声明的是“常量”,一旦赋值,变量指向的内存地址不可修改

(注意:对于引用类型,仅禁止修改变量的引用,允许修改对象/数组的内部属性/元素)。

Code block

1const c = 30;

2c = 60; // 报错:TypeError: Assignment to constant variable.(禁止重新赋值)

3

4//引用类型:允许修改内部属性,禁止修改变量引用
5const obj = { name: "张三" };
6obj.name = "李四";//成功:{ name: '李四' }(修改内部属性)
7obj = { name: "王五" };//报错:TypeError: Assignment to constant variable.(修

改引用)

  1. 重新声明差异

• var:允许在同一作用域内重复声明同一个变量,后续声明会覆盖前面的声明(仅变量声明覆盖,

赋值不影响)。

Code block

1var a = 10;

2var a = 20; // 重复声明,允许 3var a; // 仅声明,不赋值

4console.log(a); // 20(后续声明覆盖前面的)

  • let/const:不允许在同一作用域内重复声明同一个变量,即使混合使用 let / const 也会报错。

4const c = 30;

5const c = 60; // 报错:SyntaxError: Identifier 'c' has already been declared 6

7let b = 20;

8const b = 40; // 报错:SyntaxError: Identifier 'b' has already been declared

  1. 额外差异:全局变量挂载

• var:在全局作用域声明的变量会挂载到全局对象(浏览器 window、Node.js global)上,可

通过全局对象访问。

Code block

1var a = 10;

2console.log(window.a); // 10(浏览器环境,挂载到window)

• let/const:在全局作用域声明的变量不会挂载到全局对象上,仅在全局作用域可见,不污染全局对

象。

Code block

1let b = 20;

2const c = 30;

3console.log(window.b); // undefined(未挂载到window)

4console.log(window.c); // undefined(未挂载到window)

(3)使用场景建议

  1. 优先使用const:当变量的值无需修改(如常量、对象/数组的引用无需变更)时,优先使用

const,提升代码可读性和安全性。

  1. 其次使用let:当变量的值需要修改(如循环变量、临时变量)时,使用 let,利用块级作用域避

免变量污染。

  1. 避免使用var: var 存在无块级作用域、变量提升导致的逻辑错误、允许重复声明等问题,现代

JavaScript开发中应尽量避免使用。

20. 解释JavaScript中的Proxy对象是什么以及它是如何工作的。它通常用

于哪些场景?

为逻辑。

Proxy 无法直接修改目标对象,所有操作都是通过代理对象间接作用于目标对象,且代理对象与目标对象是相互独立的。

(2)Proxy的工作原理

Proxy 的工作核心是**“拦截”**,通过指定拦截器(handler),对目标对象的各种操作进行拦截和自定义处理,具体工作流程如下:

  1. 创建Proxy实例

使用 new Proxy(target, handler) 创建代理对象,接收两个必传参数:

◦ target:目标对象(可以是任意类型的对象,如普通对象、数组、函数等),是代理的最终

操作对象;

◦ handler:拦截器对象,包含多个拦截方法(也叫“陷阱函数”),每个拦截方法对应一种

对目标对象的操作,当执行该操作时,会自动触发对应的拦截方法。

  1. 触发拦截操作

当对代理对象执行某种操作(如访问属性、赋值属性、删除属性等)时,不会直接作用于目标对象,而是先触发 handler 中对应的拦截方法:

  • 拦截方法可以自定义处理逻辑(如校验、修改值、日志记录等);

◦ 若需要将操作传递给目标对象,可以通过 Reflect API(ES6内置,用于执行对象的默认操

作)或直接操作 target;

  • 拦截方法的返回值会作为代理对象操作的结果返回。
  1. 核心拦截方法(常用)
拦截方法对应操作作用说明
get(target, prop,访问属性:proxy.prop /拦截属性读取操作,可自定义
receiver)proxy[prop]返回值
set(target, prop,赋值属性:proxy.prop =拦截属性赋值操作,可校验
value, receiver)value值、阻止赋值等
has(target, prop)prop in proxy拦截in运算符,返回布尔值
deleteProperty(target,delete proxy.prop拦截delete操作,返回布
全站分卷索引 · 19 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷