37

다음 문은 JavaScript에서 왜 false를 반환합니까?새로운 String ('hello') === 새로운 String ('hello')이 False로 평가되는 이유는 무엇입니까?

new String('hello') === new String('hello') 
+2

아마도 실제 문자열이 아닌 문자열의 위치를 ​​비교했을 것입니다. 문자열을 변수에 저장 한 다음 변수를 비교하면 true를 반환해야합니다. – aashnisshah

+14

같은 이유로'[] === []'는'false'입니다. –

+4

참조 용 : http://stackoverflow.com/a/3586788/899126. 기본적으로 두 문자열간에 비교가 수행되지 않기 때문에 두 개의 객체가 있습니다. 문자열 객체에'.valueOf()'를 호출하면 비교 결과가 true를 반환합니다. –

답변

51

두 문자열 객체는 항상 서로 동일하지 않은 것입니다. JavaScript에는 프리미티브 문자열과 래퍼 객체를 만드는 String 생성자가 있습니다. 모든 객체 평등 비교 (특히 ===)는 참조 동등성에 대한 테스트로 수행됩니다. 두 개의 서로 다른 대상에 대한 언급은 물론 결코 서로 동일하지 않습니다.

따라서 "hello" === "hello"은 문자열 프리미티브이기 때문에 true이됩니다.

+3

피연산자가 같은 타입이라면'=='와'==='이 동일하므로'new String ('hello') == 새로운 String ('hello')'도'false'입니다. –

+0

고맙지 만 여전히 = a} 및 b = {} 인 경우 a === b 및 a == b는 false를 반환합니다. –

+16

@santoshkore : ** 서로 다른 두 개의 ** 개체를 비교하기 때문에. 자동차 제조업체는 동일한 모델의 두 대의 자동차를 생산하지만 자동차는 * 유사 *하지만 동일하지는 않습니다 * 객체를 비교할 때 유사성이 아닌 * 동일성을 테스트합니다 –

10

두 개의 서로 다른 개체를 비교하기 때문에 false로 평가됩니다. 새 개체는 새 개체를 만듭니다. 그 (광범위한) 답에 대해 설명 What is the 'new' keyword in JavaScript? :

관련 포스트

그것은 [신제품] 4 가지입니다 :

  1. 그것은 새로운 객체를 생성합니다. 이 개체의 유형은 단순히 개체입니다.
  2. 이는 생성자 함수의 외부 접근 프로토 오브젝트 (모든 함수 객체 자동 프로토 속성을 갖는다)로 새로운 오브젝트의 내부 액세스, [원형] 속성을 설정한다.
  3. this이 언급 될 때마다 새로 생성 된 개체를 사용하여 생성자 함수를 실행합니다.
  4. 생성자 함수가 비 프리미티브 값을 반환하지 않는 한 새로 생성 된 객체를 반환합니다. 이 경우 비 기본 값이 반환됩니다.
+4

이 링크가 질문에 대답 할 수 있지만 여기에 답변의 핵심 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. –

+1

이것은 사실이지만, 일단 그들이 URL 생성을 변경했다면 자체 링크 인 stackoverflow를 처리하는 것으로 의심됩니다. 그 질문은 다른 사람들에 의해 신속하게 응답되었으므로 나는 더 이상 설명하지 않았다. – BeyelerStudios

+1

당신은 여전히 ​​단지 링크 일뿐입니다. –

13

당신은 실제로 객체의 메모리 주소를 비교하는 문자열 비교 ('hello' === 'hello'를)처럼되지 않습니다 객체 인스턴스, 자바 스크립트에 비교 객체를 비교하는 메모리 주소가 각 개체에 대해 다르기 때문에 항상 false를 돌려줍니다 . 거짓하지

new String('hello') === new String('hello') 

엄밀히 두 개의 문자열을 비교 같은 객체 - - jsFiddle

(String('hello') === String('hello')) // returns true due to comparing strings 

엄밀히 두 개체를 비교 -

은 문자열 값 대신 개체 인스턴스를 비교 진실 , 동일한 반환 값 및 반환 된 동일한 유형

String('hello') === String('hello') 
+1

차이점은 무엇입니까? 당신은 OP의 질문에 직접 대답하지 않기 때문에 그것에 대해 자세히 설명해야합니다. –

+0

'new hello ("hello") === 새로운 String ("hello") == 새 문자열 ("hello") == 새 문자열 "hello")'이 의미하는 바를 값 대신 객체를 비교하고 있습니까? 나는 항상 == 단지 값을 비교하는 것을 생각하고 있었다. 제발 좀 더 구체화하십시오 –

+0

조금 더 명확하게 내 대답이 업데이트 –

4

또한 {0} {} {{hello : 1} = {console.log } 콘솔.로그는 결코 발생하지 않습니다.

두 개의 리터럴 객체 (첫 번째 예제)를 비교하여 이러한 객체에 대한 루프를 만들 수 있습니다. 차이점을 발견하면 결과를 알 수 있습니다. 인스턴스화 된 객체에서이 트릭을 수행하는 것이 더 어렵습니다. 두 가지 기능을 비교해보십시오.

JavaScript가 사용자에게 도움이되지 않는다면 매우 무겁기 때문에 각 속성의 각 유형을 검사하여 함수 등일 경우 문자열로 나타낼 수 있습니다. 물론 분명히 유용하지 않습니다.

typeof가 "객체"를 반환하기 때문에 "origins"객체 2 개를 확인하려는 경우 instanceof를 사용할 수 있습니다. 그리고 2 개의 "new String"객체를 테스트하기 위해서는 toString을 사용해야합니다. new String ("hello") .toString() == new String ("hello") .toString() 또는 애트리뷰트 테스트 new String ("hello") instanceof 문자열 & & new String ("hello") instanceof 문자열

이 참입니다.

BeyelerStudios가 제공하는 링크는 새로운 것이 무엇인지 완벽하게 설명합니다. 도움이되기를 바랍니다.

5
typeof(new String()) === 'object'; 
==> true 

(new Object()) === (new Object()); 
==> false 

"Heap"의 모든 "개체"구조는 고유합니다.

Heap vs. Stack

6

당신은 변수의 서로 다른 두 인스턴스가 아닌 변수 안에 살고있는 문자열 값을 비교하기 위해 자바 스크립트를 요구하고있다.

예를 들어 "Hello World"라는 단어가 쓰여 있고 (Paper1) 동생이 다른 종이에 "Hello World"라는 단어가 쓰여 있다고 가정 해 보겠습니다 (Paper2).

당신이 말하는 것은 Paper1 === Paper2입니다. 종이에 쓰여진 단어가 같더라도 허위로 받아 들여지지는 않습니다. 정확히 똑같은 종이가 아닙니다.

Paper1.toString() === Paper2 .toString()을 사용하면 사실을 알 수 있습니다. 실제 종이가 아니라 종이에 쓰여진 단어를 비교합니다.

+1

* "javascript에 변수의 두 인스턴스를 비교하도록 요청합니다."* 매우 혼란 스럽습니다. 변수는 값의 컨테이너 일 뿐이므로 변수의 "인스턴스"를 만들 수 없습니다. –

+1

나는 비유를 좋아한다. +1 –

4

코드는 본질적으로 "종이 한 장을 가져 가면됩니다."라고 쓰고 다른 종이 한 장을 가져 가면 같은 종이입니까?