JSLint 를 사용하여 JavaScript를 사용하고 있으며 명령문 내부를 비교하는 것과 같은 일을 할 때 ==
(2 개의 등호)를 ===
(3 개의 등호 ) 로 대체하는 많은 제안을 반환 합니다.idSele_UNVEHtype.value.length == 0
if
로 대체하면 성능 이점 ==
이 ===
있습니까?
많은 비교 연산자가 존재하므로 성능 향상을 환영합니다.
유형 변환이 수행되지 않으면 성능이 향상 ==
됩니까?
답변
엄격한 항등 연산자 ( ===
) ==
는 형식 변환이 수행되지 않는 것을 제외하고 추상 등호 연산자 ( )와 동일하게 작동 하며 유형이 동일하다고 간주되도록 동일해야합니다.
==
운영자는 어떤지를 비교합니다 필요한 형식 변환을 수행 한 후 . ===
운영자는 것입니다 하지 두 값이 동일하지 유형이 그렇다면, 변환을 ===
간단하게 돌아갑니다 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 평등 테스트에 사용하면 모든 것이 그대로입니다. 평가하기 전에 아무것도 변환되지 않습니다.
var1 == var2
==
JavaScript 평등 테스트에 사용할 때 약간의 펑키 변환이 발생합니다.
이야기의 교훈:
에서 발생
===
하는 전환을 완전히 이해하지 않는 한 사용하십시오==
.
답변
여기의 답변에서 나는 동등한 의미 가 무엇인지 전혀 읽지 못했습니다 . 어떤 사람들은 그것이 동일하고 같은 유형 을 ===
의미 한다고 말하지만 실제로는 그렇지 않습니다. 실제로 두 피연산자가 동일한 객체를 참조 하거나 값 유형의 경우 동일한 값을 가짐을 의미 합니다.
다음 코드를 보자.
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를 반환하는 경우a
와b
같은 값이 동일한 유형입니다
참조 유형의 경우 : 정확히 동일한 객체를 참조하고
a === b
truea
를b
참조하십시오.
: 문자열이 들어
a === b
있는 경우에 true를 돌려줍니다a
와b
동일한 문자를 모두 문자열 및 포함
문자열 : 특별한 경우 …
문자열은 값 유형이 아니지만 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 회 이상 반복됨)는 무시할 만하다고 말하고 싶습니다. 성능 은 해야 할 이유 가 아닙니다===
. 유형 안전 (자바 스크립트에서 얻을 수있는만큼 안전)과 코드 품질이 좋습니다.