前言
js 中的值传递和引用传递是一个很重要的概念,也是很多面试题的考察点,本文将详细介绍 js 中的值传递和引用传递的区别,以及如何在实际开发中使用这两种传递方式。这个概念很简单,但是实际开发中很多人都容易混淆。
值传递
值传递指的是重新开辟一块内存空间,将旧变量值复制到新的内存空间中,新变量和旧变量就互不影响了。在 js 中,基本数据类型(number、string、boolean、null、undefined、symbol)都是值传递。
1 2 3 4 5
| let a = 1; let b = a; b = 2; console.log(a); console.log(b);
|
引用传递
指的是新变量的内存地址指向旧变量的内存地址,它们共享同一块内存空间,修改其中一个变量的值,另一个变量的值也会发生变化。在 js 中,引用数据类型(object、array、function)都是引用传递。
1 2 3 4 5 6
| let a = { name: "张三" }; let b = a; b.name = "李四"; console.log(a, b); a.name = "王五"; console.log(a, b);
|
练习题
题目1
module.js1 2 3 4
| export let a = 1; export function increase() { a++; }
|
main.js1 2 3 4
| import { a, increase } from "./module.js"; console.log(a); increase(); console.log(a);
|
答案
具名导入的变量都是引用传递,所以 a
的值会发生变化。
结果题目2
main.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const testFunc = () => { let a = 1; let obj = { name: "pzj" }; let changeVars = () => { a++; obj.name = "codepzj"; }; return { a, obj, changeVars, }; };
const { a, obj, changeVars } = testFunc(); console.log(a, obj); changeVars(); console.log(a, obj);
|
答案
a
是基本数据类型,所以是值传递,obj
是引用数据类型,所以是引用传递。
结果1 2
| 1 { name: "pzj" } 1 { name: "codepzj" }
|
总结
基本数据类型(number、string、boolean、null、undefined、symbol)是值传递,引用数据类型(object、array、function)是引用传递。具名导入的变量都是引用传递。