Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

후레임의 프로그래밍

JavaScript 비교에서 ==와 ===의 차이는 무엇일까요? 본문

스택오버플로우(Stack Overflow)

JavaScript 비교에서 ==와 ===의 차이는 무엇일까요?

후레임 2020. 10. 26. 13:47
질문

JSLint  사용하여 JavaScript를 통과 하고 있으며  내부에서 비교하는 것과 같은 작업을 수행 할 때 ( ==등호 2 개)를 ===(등호 3 개 ) 로 대체하라는 많은 제안을 반환 합니다.

만약

idSele_UNVEHtype.value.length == if

 

여기서=====로 바꾸면 성능상의 이점이 있습니까?

많은 비교 연산자가 존재하므로 성능 향상을 환영합니다.

유형 변환이 발생하지 않으면 ==보다 성능이 향상됩니까?



답변

strict 등호 연산자(===)는 유형 변환이 수행되지 않는 점을 제외하고는 추상 항등 연산자 (==)와 동일하게 작동하며 유형은 동일하다고 간주됩니다.

참조 : 자바 스크립트 자습서 : 비교 연산자

==연산자는 필요한 유형 변환을 수행 한 후같은지 비교합니다. ===연산자는 변환을 수행하지 않습니다. 따라서 두 값이 동일한 유형이 아닌 경우 ===는 단순히 를 반환합니다. 거짓. 둘 다 똑같이 빠릅니다.

Douglas Crockford의 뛰어난 자바 스크립트 : 좋은 부분을 인용하려면</p >

자바 스크립트에는 ===! ==, 그리고 악의적인 쌍둥이 ==의 두 가지 동등 연산자 세트가 있습니다. ! =. 좋은 것들은 예상대로 작동합니다. 두 피연산자의 유형이 같고 값이 같으면 ===true를 생성하고 ! ==를 생성합니다. 거짓. 사악한 쌍둥이는 피연산자가 같은 유형일 때 옳은 일을 하지만, 유형이 다른 경우 값을 강요하려고합니다. 그들이하는 규칙은 복잡하고 기억에 남지 않습니다. 다음은 몇 가지 흥미로운 사례입니다.

'' == '0'           // false
  0 == ''             // true
  0 == '0'            // true
  
  false == 'false'    // false
  false == '0'        // true
  
  false == undefined  // false
  false == null       // false
  null == undefined   // true
  
  ' \t\r\n ' == 0     // true
  

Equality Comparison Table

전이성의 부족은 놀랍습니다. 나의 충고는 결코 사악한 쌍둥이를 사용하지 말라는 것입니다. 대신 항상 ===! ==를 사용하세요. 방금 표시된 모든 비교는 ===연산자를 사용하여 false를 생성합니다.


업데이트 :

댓글 및 @Casebash가 좋은 지적을했습니다. stackoverflow.com/users/113570/philippe-leybaert">@Phillipe Laybaert의답변. 개체의 경우 =====가 서로 일관되게 작동합니다 (특별한 경우 제외).

var a = [1,2,3];
var b = [1,2,3];

var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };

var e = "text";
var f = "te" + "xt";

a == b            // false
a === b           // false

c == d            // false
c === d           // false

e == f            // true
e === f           // true

특별한 경우는 toString또는 valueOf메소드로 인해 기본 요소를 동일한 기본 요소로 평가되는 객체와 비교할 때입니다. 예를 들어, 문자열 프리미티브와 String생성자를 사용하여 생성 된 문자열 객체를 비교해보십시오.

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

여기에서 ==연산자는 두 개체의 값을 확인하고 true를 반환하지만 ===는 두 개체의 값을 동일한 유형이 아니며 false를 반환합니다. 어느 것이 맞습니까? 그것은 당신이 비교하려는 것에 달려 있습니다. 내 조언은 질문을 완전히 우회하고 String생성자를 사용하여 문자열 리터럴에서 문자열 객체를 만들지 않는 것입니다.

 

Reference
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3



출처 : https://stackoverflow.com/questions/359494