[javascript] JavaScript 비교에서 어떤 equals 연산자 (== vs ===)를 사용해야합니까?

JSLint 를 사용하여 JavaScript를 사용하고 있으며 명령문 내부를 비교하는 것과 같은 일을 할 때 ==(2 개의 등호)를 ===(3 개의 등호 ) 로 대체하는 많은 제안을 반환 합니다.idSele_UNVEHtype.value.length == 0if

로 대체하면 성능 이점 =====있습니까?

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

유형 변환이 수행되지 않으면 성능이 향상 ==됩니까?



답변

엄격한 항등 연산자 ( ===) ==는 형식 변환이 수행되지 않는 것을 제외하고 추상 등호 연산자 ( )와 동일하게 작동 하며 유형이 동일하다고 간주되도록 동일해야합니다.

참조 : Javascript 학습서 : 비교 연산자

==운영자는 어떤지를 비교합니다 필요한 형식 변환을 수행 한 후 . ===운영자는 것입니다 하지 두 값이 동일하지 유형이 그렇다면, 변환을 ===간단하게 돌아갑니다 false. 둘 다 똑같이 빠릅니다.

Douglas Crockford의 뛰어난 JavaScript : The Good Parts 를 인용 하면,

: 자바 스크립트는이 개 평등 사업자의 세트를 가지고 ===!==, 그들의 사악한 쌍둥이 ==!=. 좋은 것은 당신이 기대하는 방식으로 작동합니다. 두 피연산자가 동일한 유형이고 동일한 값을 갖는 경우,를 ===생성 true하고 !==생성합니다 false. 피연산자가 같은 유형일 때 사악한 쌍둥이가 옳은 일을하지만 다른 유형일 경우 값을 강요하려고합니다. 그들이하는 규칙은 복잡하고 기억에 남습니다. 흥미로운 사례는 다음과 같습니다.

'' == '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

평등 비교표

전이성의 결여가 놀랍습니다. 내 충고는 결코 사악한 쌍둥이를 사용하지 않는 것입니다. 대신, 항상 사용 ===하고 !==. 방금 표시된 모든 비교 false===연산자로 생성 됩니다 .


최신 정보:

@Casebash 는 주석과 객체에 관한 @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생성자를 사용하여 문자열 리터럴에서 문자열 객체를 만들지 않는 것 입니다.

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


답변

==연산자 사용 ( Equality )

true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2;  //true, because "2" is converted to 2 and then compared

===연산자 사용 ( Identity )

true === 1; //false
"2" === 2;  //false

항등 연산자 ==는 coercion 유형을 사용 하기 때문에 인터프리터가 암시 적으로 값을 변환하기 전에 값을 변환하려고 시도하기 때문입니다.

한편, 항등 연산자 ===는 유형 강제 변환을 수행 하지 않으므로 비교할 때 값을 변환하지 않으므로 ( 이 JS 벤치 마크 테스트 에 따라 ) 한 단계를 건너 뛰 므로 더 빠릅니다 .


답변

사이의 평등 비교의 재미있는 그림으로 표현 ==하고 ===.

출처 : http://dorey.github.io/JavaScript-Equality-Table/


var1 === var2

===JavaScript 평등 테스트에 사용하면 모든 것이 그대로입니다. 평가하기 전에 아무것도 변환되지 않습니다.

JS에서 ===의 평등 평가


var1 == var2

==JavaScript 평등 테스트에 사용할 때 약간의 펑키 변환이 발생합니다.

JS에서 ==의 평등 평가

이야기의 교훈:

에서 발생 ===하는 전환을 완전히 이해하지 않는 한 사용하십시오 ==.


답변

여기의 답변에서 나는 동등한 의미 가 무엇인지 전혀 읽지 못했습니다 . 어떤 사람들은 그것이 동일하고 같은 유형===의미 한다고 말하지만 실제로는 그렇지 않습니다. 실제로 두 피연산자가 동일한 객체를 참조 하거나 값 유형의 경우 동일한 값을 가짐을 의미 합니다.

다음 코드를 보자.

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

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

여기 동일합니다 :

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

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

또는:

var a = { };
var b = { };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

이 동작이 항상 명백한 것은 아닙니다. 평등하고 같은 유형의 것보다 더 많은 이야기가 있습니다.

규칙은 다음과 같습니다.

: 값 형식 (숫자)의 경우
a === b true를 반환하는 경우ab같은 값이 동일한 유형입니다

참조 유형의 경우 : 정확히 동일한 객체를 참조하고
a === btrueab참조하십시오.

: 문자열이 들어
a === b 있는 경우에 true를 돌려줍니다ab동일한 문자를 모두 문자열 및 포함


문자열 : 특별한 경우 …

문자열은 값 유형이 아니지만 Javascript에서는 값 유형처럼 동작하므로 문자열의 문자가 동일하고 길이가 같은 경우 (제 3 규칙에 설명 된대로) “동일”합니다.

이제 흥미로워집니다.

var a = "12" + "3";
var b = "123";

alert(a === b); // returns true, because strings behave like value types

그러나 이것은 어떻습니까? :

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

문자열이 값 유형처럼 동작한다고 생각 했습니까? 글쎄, 그것은 당신이 묻는 사람에 달려 있습니다 …이 경우 a와 b는 같은 유형이 아닙니다. a유형 인 Object반면, b타입이다 string. String생성자를 사용하여 문자열 객체를 생성하면 대부분Object 문자열처럼 동작 하는 유형의 무언가가 생성 된다는 것을 기억하십시오 .


답변

이 권고를 추가하겠습니다 :

확실하지 않은 경우 사양을 읽으십시오 !

ECMA-262는 JavaScript가 방언 인 스크립팅 언어의 사양입니다. 물론 실제로 가장 중요한 브라우저의 작동 방식은 무언가를 어떻게 처리해야하는지에 대한 난해한 정의보다 중요합니다. 그러나 왜 new String ( “a”)! == “a” 인지 이해하는 것이 도움이됩니다 .

이 질문을 명확히하기 위해 사양을 읽는 방법을 설명하겠습니다. 나는이 아주 오래된 주제에서 아무도 그 이상한 효과에 대한 답을 얻지 못했다는 것을 알았습니다. 따라서 사양을 읽을 수 있다면 이것은 직업에 큰 도움이 될 것입니다. 습득 한 기술입니다. 계속하겠습니다.

===에 대한 PDF 파일을 검색하면 사양의 56 페이지로 이동합니다 : 11.9.4. Strict Equals Operator (===) 이며 사양을 검토 한 후 다음을 발견했습니다.

11.9.6 엄격한 평등 비교 알고리즘
x와 y가 값인 x === y 비교는 true 또는 false를 생성 합니다 . 이러한 비교는 다음과 같이 수행됩니다.
  1. Type (x)가 Type (y)와 다른 경우 false를 반환 합니다.
  2. Type (x)가 Undefined 이면 true를 반환 합니다 .
  3. Type (x)가 Null 이면 true를 반환 합니다 .
  4. Type (x)가 숫자가 아니면 11 단계로 이동하십시오.
  5. x가 NaN 이면 false를 리턴하십시오 .
  y가 NaN 인 경우 false를 반환 합니다.
  7. x가 y와 같은 숫자 값 이면 true를 반환 합니다 .
  8. x가 +0이고 y가 −0 이면 true를 반환 합니다 .
  9. x가 -0이고 y가 +0 이면 true를 반환 합니다 .
  10. false를 리턴하십시오 .
  11. Type (x)가 String 이면 x와 y가 정확히 동일한 문자 시퀀스 (해당 위치의 동일한 길이와 동일한 문자) 이면 true 를 반환 합니다 . 그렇지 않으면 false를 반환하십시오 .
  12. Type (x)가 부울 인 경우 x와 y가 모두 true 이거나 모두 false 이면 true를 반환 합니다 . 그렇지 않으면 false를 반환하십시오 .
  13. 반환
x와 y가 같은 객체를 참조하거나 서로 연결된 객체를 참조하는 경우 (13.1.2 참조) 그렇지 않으면 false를 반환하십시오 .

흥미로운 단계는 11 단계입니다. 예, 문자열은 값 유형으로 처리됩니다. 그러나 이것은 왜 새로운 String ( “a”)! == “a” 인지 설명하지 않습니다 . ECMA-262를 준수하지 않는 브라우저가 있습니까?

그렇게 빠르지 않습니다!

피연산자의 유형을 확인하십시오. typeof () 로 감싸서 직접 사용해보십시오 . 나는 그 찾아 새로운 문자열 ( “A”는) 객체이며, 1 단계는 사용됩니다 반환 거짓 종류가 다른 경우.

new String ( “a”) 이 문자열을 반환하지 않는 이유가 궁금하다면 사양을 읽는 연습은 어떻습니까? 즐기세요!


Aidiakapi는 아래의 주석에서 이것을 썼습니다 :

사양에서

11.2.2 새로운 연산자 :

Type (constructor)이 Object가 아닌 경우 TypeError 예외를 발생시킵니다.

즉, String이 Object 유형이 아니면 new 연산자와 함께 사용할 수 없습니다.

new는 항상 String 생성자에 대해서도 Object를 반환합니다 . 그리고 아아! 문자열의 값 의미 (11 단계 참조)가 손실됩니다.

그리고 이것은 마지막으로 다음을 의미합니다 : new String ( “a”)! == “a” .


답변

PHP와 JavaScript에서 엄격한 항등 연산자입니다. 즉, 유형과 값을 모두 비교합니다.


답변

다음 과 같은 코드를 사용하여 Firefox에서 Firebug로 이것을 테스트 했습니다.

console.time("testEquality");
var n = 0;
while(true) {
    n++;
    if(n==100000)
        break;
}
console.timeEnd("testEquality");

console.time("testTypeEquality");
var n = 0;
while(true) {
    n++;
    if(n===100000)
        break;
}
console.timeEnd("testTypeEquality");

내 결과 (각 5 회 테스트 및 평균) :

==: 115.2
===: 114.4

따라서 작은 차이 (100000 회 이상 반복됨)는 무시할 만하다고 말하고 싶습니다. 성능 해야 할 이유 가 아닙니다=== . 유형 안전 (자바 스크립트에서 얻을 수있는만큼 안전)과 코드 품질이 좋습니다.