2017-09-24 3 views
4

나는 질문을 읽고 여기에 대답했다 :Javascript에서 숫자가 변경되지 않는 이유는 무엇입니까?

javascript numbers- immutable

을하지만, 수 (원시 형)는 불변 왜 나를 위해 충분히 분명하지 않다? 새로운 참조를 만들고 값을 덮어 쓰지 않기 때문에?

우리는 다음 루프에서 100 번 새로운 기준이겠습니까 각 assignemt에 새로운 참조

var x = 5; 
x = 1; 

을 작성하는 경우?

while (x < 101) 
{ 
    x++; 
} 

효율적입니까? 나는 내가 올바르게 보지 않을 것이라고 생각한다.

+5

숫자 5를 변경할 수 있다면 무엇을 의미할까요? – Pointy

+0

링크 된 질문의 답 읽기 : 숫자 자체는 변경 불가능합니다 (또는 상수라고 할 수 있음). 변수 x는 숫자/상수에 대한 참조입니다. 또한 모든 프로그래밍 언어에서 같다고 말합니다. 그렇지 않으면 숫자를 제거하거나 덮어 쓸 수 있으며 언어가 수행 할 수있는 전체 수학/계산을 망칠 수 있습니다. 권리? –

+0

음, 숫자가 다소 상수라면 왜 값을 다시 넣을 수 있습니까? x = 5, x = 1. – Jamo

답변

1

숫자는 불변이므로 숫자는 5입니다. 숫자 5는 숫자 5이며, 개체 자체를 수정하는 데는 의미가 없습니다.

당신이 할 때처럼 뭔가 : 당신은 객체 5 및 객체 5를 참조하는 변수 x

let x = 5; 

. 당신이 다음 x을 변경하는 경우 : 당신은 객체 5을 변경하지 않는

x = 4; 

: 당신이 변화하는 변수 x가 가리키는 것입니다. 당신의 while 예에서

다양한 수치 상수 0, 1, 2, ... 및 변수 x있다 : 각 반복에서의 x++이 수치 상수 변수 x가 가리키고있는 변경합니다.

유사 추론이 많은 언어, 자바 스크립트에뿐만 아니라 적용 할 수 있습니다 : 사실, 많은 언어 번호에 자주 문자열은 불변 객체와 유사한 규칙


편집 따르 의견에서 지적을 , 자바 스크립트 숫자는 원시 값이며 객체가 아닙니다 (심지어 클래스 Number의 객체로 래핑 될 수 있음). 따라서 객체가 포함되어 있기 때문에 실제로 x이 가리키는 참조를 변경하지는 않습니다. 즉, 프리미티브 값을 직접 업데이트하는 것입니다. 펠릭스 클링의 대답이 이것보다 더 적절합니다.

+0

좋아요, objet 5를 변경하지 않고 변수 x가 가리키고있는 것, x에 다른 값을 재 할당 한 후 객체 5는 어떻게됩니까? – Jamo

+0

@jamo : 할당 된 위치에 따라 현재 실행 컨텍스트를 떠날 때 자동으로 할당이 해제되거나 다른 실행 참조가없는 경우 가비지 수집됩니다. –

+1

5 명이 개체가 아닙니다. 그것은 원시적 인 가치입니다. x는 객체 5에 대한 참조를 보유하지 않습니다. x는 숫자 5를 x의 값으로 유지합니다. –

-1

프리미티브 값 대 참조 : 입력 부울, 정의, NULL, 숫자, 심볼, 캐릭터의 자바 스크립트 값

프리미티브이다. 변수를 변수에 할당하거나 인수로 함수에 전달하면 항상 복사됩니다. 대조적으로 객체에는 두 부분이 있습니다. 객체 (데이터)가 하나의 메모리 덩어리에 저장되고 변수에 지정하는 것은 해당 객체를 가리키는 참조입니다. 할당시 오브젝트 자체는 복사되지 않습니다.

숫자를 변수에 할당 할 때 숫자가 항상 복사되므로 숫자를 변경하고 실제로 그 변수에 새 값을 할당하지 않고 다른 변수를 통해 변경 사항을 볼 수 없습니다. 대조적으로 개체의 필드를 변경하면 해당 개체를 가리키는 모든 변수에 변경 내용이 표시됩니다.

var a = 1; 
var b = a; //This creates a new copy of value 1 
console.log(a, b); // 1 1 
a = 2; 
console.log(a, b); // 2 1 


var obj_a = {attr: 1}; 
var obj_b = obj_a; //This makes a new reference to the same object. 
console.log(obj_a, obj_b); // {'attr': 1} {'attr': 1} 
obj_b.attr = 2; 
console.log(obj_a, obj_b); // {'attr': 2} {'attr': 2} 

불변의 객체 : immutable.js 원시 타입과 객체의 속성 결합 유형을 제공

라이브러리 같은 immutable.js : immutable.js에서 유형의 행동을

는 이제 몇 가지 예를 보자 당신이 그들을 바꾸지 않는 한 평범한 물건으로. 변경할 수없는 개체의 속성을 변경하면 새 개체가 만들어지고 변경 내용은 해당 새 개체를 통해서만 볼 수 있습니다. 이점은 메모리 공간을 절약하고 참조를 비교하여 객체의 평등을 빠르게 확인할 수 있다는 것입니다. 정수처럼 작동하는 유형 세트를 얻지 만 더 복잡한 구조를 저장할 수 있습니다.

+1

참조로 전달하고 객체에 대한 참조를 사용하는 것은 ** 동일하지 않습니다 **. 자바 스크립트는 값으로 전달되며 객체의 경우 값은 참조입니다. 변수 **와 매개 변수의 평가 방법 ** 값 **을 나타내는 방법을 혼란스럽게합니다. 그것들은 두 가지 다른 것들입니다. –

+0

문자열이 항상 값에 의해 전달되어 복사된다는 것은 사실이 아닙니다. 문자열은 항상 참조에 의해 전달됩니다. –

+0

@MarcinMalinowski : 나의 이전 코멘트를보십시오. 자바 스크립트는 값으로 전달되며 그 값은 참조 일 수 있습니다. 변경할 수없는 값에 대한 좋은 점은 복사 할 수 있거나 참조 할 수 있다는 것입니다. 구현은 원하는대로 할 수 있습니다. –

0

숫자의 변경 (원시 타입)은 순수 상태 개체 인 반면 변경은 상태 변경입니다. 그러한 "객체"상태에 대한 어떤 돌연변이도 실제로는 새로운 수입니다. 숫자 자체는 컴퓨터 메모리 셀의 비트 변형에 대한 식별자와 같습니다.

따라서 숫자는 변경할 수 없습니다. 색상이나 문자와 동일합니다.

새로운 변수가 주어진 변수에 대해 이전과 동일한 메모리 셀을 차지할 수도 있습니다. 사실은 이전 것을 대체합니다. 따라서 어떠한 종류의 성능 저하도 없습니다.

+0

"순수한 상태 객체"란 무엇을 의미합니까? – Jamo

+0

프리미티브 값을 개체로 설명하려고하면 해당 개체에는 메서드가 없으며 개체 자체는 식에서 사용될 때 단일 값으로 평가됩니다. –

3

나는 당신이 혼란스러워하는 것을 이해하지 못하기 때문에 어떤 종류의 대답을 기대하는지 정말로 모르겠다. 그러나 여기에 우리가 간다 :

우리는 다음 루프에서 100 번 새로운 참조를 가지겠습니까?

변수는 값의 컨테이너 일뿐입니다. 낮은 수준에서 변수는 기본적으로 메모리 주소 나 레지스터의 레이블입니다. 예 : 변수 xR1 레지스터를 가리킬 수 있습니다.

x++은 단순히 해당 레지스터에 저장된 숫자를 1만큼 증가시킵니다. 가정 수 있습니다 우리의 레지스터는 다음과 같이 보았다 :

R1: 5 

그것을 증가 후, 하나의 작업을 할 수있는 등 ADD R1 1, 우리가 얻을 것

R1: 6 

즉, 우리는 이전 값을 새로운 값으로 겹쳐 씁니다. 그리고 우리는 여러 번 그렇게합니다.


는 것을는 효율적인가요? 나는 내가 올바르게 보지 않을 것이라고 생각한다.

숫자를 1 씩 증가시키는 것은 얻을 수있는 것처럼 간단합니다.

확실히 높은 수준에서 변경 가능한 숫자를 구현할 수는 있지만 분명히 효율적이거나 단순하지는 않습니다.

"단일 값"값의 변경은 기본적으로 "자리 표시"에서 다른 값으로 바꾸는 것을 의미하기 때문에 변경 가능성은 의미가 없습니다.

목록 및 사전과 같은 다른 값으로 구성된 값이 변경되면 부분이 변경되고 다른 부분은 그대로 유지됩니다.

또한 언어가 참조 유형 데이터 유형 인 경우에만 변경 가능성이 적절합니다. 이를 통해 여러 변수가 데이터 유형의 동일한 값에 대한 참조를 보유 할 수 있음을 의미합니다. 원시 값에 데이터 유형이 참조 형이 아닌 경우

var a = {foo: 42}; 
 
var b = a; 
 
b.foo = 21; 
 
console.log(a);

, 값 타입이라, (: ​​객체는이 작업을 수행 할 수 있도록 자바 스크립트를 참조 형이다 JavaScript)를 사용하면 가변성은 중요하지 않습니다. 왜냐하면 변경이 불변과 구별 될 수 있기 때문입니다. 변경 가능한 가치 형 번호로 다음의 가설적인 시나리오를 고려한다 :이 시나리오에서

var a = MutableNumber(42); 
var b = a; // creates a copy of MutableNumber(42) because it's a value type 
a.add(1); 
console.log(a, b); // would log 43, 42 

두 변수가 동일한 가변 개수의 값을 참조하는 것이 불가능 a.add(1)a에 새로운 값을 할당 구별 할 (즉, a = a + 1).

+0

그건 좋은 대답 –

+0

그래서, 각 변수 (컨테이너)가 다른 참조를 가지고 있기 때문에 숫자가 불변이라고 말할 수 있습니까? 번호는 참조로 수정할 수 없습니다. – Jamo