이 기사에서는 JavaScript에서 값 전달과 참조 전달의 차이점을 자세히 이해할 수 있습니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
JavaScript에서는 값과 참조로 전달할 수 있습니다. 둘 사이의 주요 차이점은 기본 유형을 할당할 때 값에 의한 전달이 발생하는 반면 객체를 할당할 때 참조에 의한 전달이 발생한다는 것입니다. 아래에서 자세히 살펴보세요.
JavaScript는 기본 유형 및 객체라는 두 가지 데이터 유형을 제공합니다.
기본 유형에는 숫자
, 부울
, 문자열
, 기호
, null
, 정의되지 않음
. number
, boolean
, string
, symbol
,null
,undefined
。
// 基本类型 const number = 10; const bool = false; const str = 'Hello!'; const missingObject = null; const nothing = undefined;
第二类是对象,普通对象、数组、函数等等都是对象。
// Objects const plainObject = { prop: 'Value' }; const array = [1, 5, 6]; const functionObject = (n1, n2) => { return n1 + n2; };
换句话说,任何不是基本类型的值都是对象。
按值传递的简单规则是 JS 中的所有基本类型都按值传递,就这么简单。
按值传递意味着每次将值赋给变量时,都会创建该值的副本,每一次哦。
举个例子来看看,假设我们有两个变量 a
和 b
:
let a = 1; let b = a; b = b + 2; console.log(a); // 1 console.log(b); // 3
第一条语句,声明一个变量 a
,并赋值为 1
。
第二条语句,声明一个变量 b
,并把 a
的值赋值给它。
最后,b = b + 2
增加2并变为3
。b
变量发生变化,并且该变化不会影响a
的值。
通过引用传递的方式与值传递相比会有所不同。
当创建一个对象时,就获取一个对该对象的引用。如果两个变量持有相同的引用,那么改变对象会反映在两个变量中。
请看下面代码:
let y = x; y.push(2); console.log(x); // [1, 2] console.log(y); // [1, 2]
第一个语句let x =[1]
创建一个数组,定义一个变量x
,并使用对创建的数组的引用来初始化变量。
然后let y = x
定义一个变量y
,并使用存储在x
变量中的引用来初始化y
,这是一个引用传递。
y
通过y.push(2)
通来改变数组。因为x
和y
变量引用相同的数组,所以这种变化会反映在两个变量中。
注意:为简单起见,我说变量包含对对象的引用。 但是严格说来,JavaScript中的变量包含的值是对对象的引用。
【推荐学习:javascript高级教程】
在比较对象时,理解值和引用之间的区别非常重要。
当使用严格比较运算符===
时,如果两个变量的值相同,则它们相等。 以下所有比较均相等
const one = 1; const oneCopy = 1; console.log(one === oneCopy); // true console.log(one === 1); // true console.log(one === one); // true
one
和oneCopy
具有相同的值1
。当两个操作数都为1
时,操作符===
的计算结果都为true
。
但是比较运算符===
在比较引用时的工作方式有所不同。 2个引用只有在引用完全相同的对象时才相等。
ar1
和ar2
保存对不同数组实例的引用:
const ar1 = [1]; const ar2 = [1]; console.log(ar1 === ar2); // false console.log(ar1 === [1]); // false const ar11 = ar1; console.log(ar1 === ar11); // true console.log(ar1 === ar1); // true
ar1
和ar2
引用结构相同的数组,但是ar1 === ar2
的计算结果为false
,因为ar1
和ar2
引用了不同的数组对象。
仅当比较指向相同对象的引用时,比较运算符才返回true
:ar1 === ar11
或ar1 === ar1
rrreee
2. 값으로 전달
값으로 전달의 간단한 규칙은 JS의 모든 기본 유형이 값으로 전달된다는 것입니다. 그만큼 간단합니다. 값으로 전달한다는 것은 값이 변수에 할당될 때마다 해당 값의 복사본이 생성된다는 의미입니다.
두 개의 변수
rrreeea
와b
가 있다고 가정해 보겠습니다.Article 1 문, a를 선언하세요. 변수
🎜두 번째 문은a
를 선택하고 값을1
에 할당합니다.b
변수를 선언하고 해당 변수에a
값을 할당합니다. 🎜🎜마지막으로b = b + 2
는 2씩 증가하여3
이 됩니다.b
변수가 변경되며 변경 사항은a
값에 영향을 주지 않습니다. 🎜🎜🎜3. 참조로 전달🎜🎜🎜값으로 전달하는 방법과 참조로 전달하는 방법이 다릅니다. 🎜🎜객체가 생성되면 객체에 대한 참조를 얻습니다. 두 변수가 동일한 참조를 보유하는 경우 개체에 대한 변경 사항이 두 변수 모두에 반영됩니다. 🎜🎜🎜🎜다음 코드를 살펴보세요: 🎜rrreee🎜첫 번째 문let x =[1]
은 배열을 생성하고 변수x를 정의합니다. 생성된 배열에 대한 참조를 사용하여 변수를 초기화합니다. 🎜🎜그런 다음 <code>let y = x
는y
변수를 정의하고x
변수에 저장된 참조를 사용하여y
를 초기화합니다. code>, 이는 참조로 전달됩니다. 🎜🎜y
는y.push(2)
를 통해 배열을 변경합니다.x
및y
변수는 동일한 배열을 참조하므로 이 변경 사항은 두 변수 모두에 반영됩니다. 🎜🎜참고: 단순화를 위해 변수에는 개체에 대한 참조가 포함되어 있다고 말했습니다. 그러나 엄밀히 말하면 JavaScript의 변수에 포함된 값은 개체에 대한 참조입니다. 🎜🎜【추천 학습: javascript 고급 튜토리얼]🎜🎜🎜4. 참조 전달에 의한 비교🎜🎜🎜객체를 비교할 때는 값과 참조의 차이를 이해하는 것이 중요합니다. 🎜🎜엄격 비교 연산자===
를 사용할 때 두 변수의 값이 동일하면 두 변수는 동일합니다. 아래의 모든 비교는 동일🎜rrreee🎜one
이고oneCopy
의 값은1
입니다. 두 피연산자가 모두1
이면 연산자===
는true
로 평가됩니다. 🎜🎜그러나 참조 연산자===
는 참조를 비교할 때 다르게 작동합니다. 2개의 참조는 정확히 동일한 객체를 참조하는 경우에만 동일합니다. 🎜🎜ar1
및ar2
는 서로 다른 배열 인스턴스에 대한 참조를 저장합니다. 🎜rrreee🎜ar1
및ar2
는 동일한 참조를 가집니다. 구조체 배열이지만ar1
과ar2
는 다른 배열 객체를 참조하므로ar1 === ar2
는false
로 평가됩니다. 🎜🎜비교 연산자는 동일한 객체를 가리키는 참조를 비교할 때만true
를 반환합니다:ar1 === ar11
또는ar1 === ar1
> . 🎜🎜🎜 5. 요약 🎜🎜🎜 JavaScript에서는 기본 유형이 값으로 전달됩니다. 즉, 값이 할당될 때마다 해당 값의 복사본이 생성됩니다. 🎜🎜반면에 객체(일반 객체, 배열, 함수, 클래스 인스턴스 포함)는 참조입니다. 객체가 수정되면 이를 참조하는 모든 변수에 변경 사항이 표시됩니다. 🎜🎜비교 연산자는 비교 값과 참조를 구별합니다. 참조를 보유하는 2개의 변수는 정확히 동일한 객체를 참조하는 경우에만 동일합니다. 그러나 값을 보유하는 2개의 변수는 변수가 동일한 2개의 값(변수, 리터럴 등에서)을 갖는 한 동일합니다. 값이 어디서 나오든 관계없이 변수는 동일합니다. 🎜🎜🎜원본 주소: https://dmitripavlutin.com/value-vs-reference-javascript/🎜🎜저자: Ahmad Shaded🎜🎜번역 주소: https://segmentfault.com/a/1190000039761445🎜
더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 교육을 방문하세요! !
위 내용은 JS에서 값 전달과 참조 전달의 차이점에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!