JavaScript를 사용 하기 위해 JSLint 를 사용하고 있으며 if 내부에서 idSele_UNVEHtype.value.length == 0 비교하는 것과 같은 작업을 수행할 때 == (2개의 등호)를 === (3개의 등호)로 대체하라는 많은 제안을 반환 if 성명.
== 를 === 로 바꾸면 성능상의 이점이 있습니까?
비교 연산자가 많기 때문에 성능 향상은 환영합니다.
유형 변환이 발생하지 않으면 == 비해 성능이 향상됩니까?
답변자 : Bill the Lizard
완전 항등 연산자( === )는 형식 변환이 수행되지 않는다는 점을 제외하고는 추상 항등 연산자( ==
=== 및 !== , 그리고 사악한 쌍둥이 == 및 != 두 가지 등호 연산자 세트가 있습니다. 좋은 사람들은 당신이 기대하는 방식으로 작동합니다. 두 피연산자가 같은 유형이고 값이 같은 경우 === 는 true 생성하고 !==false 생성합니다. 사악한 쌍둥이는 피연산자의 유형이 같을 때 올바른 일을 하지만 유형이 다른 경우 값을 강제하려고 시도합니다. 그들이 하는 규칙은 복잡하고 기억하기 어렵습니다. 다음은 흥미로운 사례 중 일부입니다.
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 생성자를 사용하여 생성된 string 객체와 string primitive의 비교를 고려하십시오.
"abc" == new String("abc") // true "abc" === new String("abc") // false
여기서 == 연산자는 두 객체의 값을 확인하고 true 반환하지만 === 는 두 객체가 동일한 유형이 아닌 것을 확인하고 false 반환합니다. 어느 것이 맞습니까? 그것은 당신이 비교하려는 것에 달려 있습니다. 내 조언은 질문을 완전히 무시하고 String 생성자를 사용하여 문자열 리터럴에서 문자열 개체를 만들지 않는 것입니다.
=== 를 사용할 때 모든 것이 있는 그대로입니다. 평가되기 전에 아무 것도 변환되지 않습니다.
var1 == var2
== 를 사용할 때 일부 펑키 변환이 발생합니다.
결론:
=== 사용하십시오.
== 발생하는 변환을 완전히 이해하지 못하는 경우)
답변자 : Philippe Leybaert
여기 답변에서 나는 평등의 의미에 대해 아무것도 읽지 않았습니다. 어떤 사람들은 ===동등하고 같은 유형을 의미한다고 말하지만 실제로는 그렇지 않습니다. 이는 실제로 두 피연산자가 동일한 객체를 참조 하거나 값 유형의 경우 동일한 값을 가짐을 의미 합니다.
따라서 다음 코드를 사용합시다.
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 === b true를 돌려줍니다 및 ab 참조 동일한 객체
문자열의 경우: a === b true를 돌려줍니다 와 ab 모두 문자열이며 동일한 문자를 포함
문자열: 특별한 경우...
문자열은 값 유형이 아니지만 Javascript에서는 값 유형처럼 작동하므로 문자열의 문자가 동일하고 길이가 같을 때 "동일"합니다(세 번째 규칙에서 설명됨)
이제 흥미로워집니다.
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)
문자열이 값 유형처럼 작동한다고 생각했습니까? 글쎄, 그것은 당신이 묻는 사람에 달려 있습니다 ...이 경우와 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)가 정의되지 않은 경우 true를 반환합니다. 3. Type(x)가 Null 이면 true를 반환합니다. 4. Type(x)가 Number가 아니면 11단계로 이동합니다. 5. x가 NaN 이면 false를 반환합니다. 6. y가 NaN 이면 false를 반환합니다. 7. x가 y와 같은 숫자 값 이면 true를 반환합니다. 8. x가 +0이고 y가 -0 이면 true를 반환합니다. 9. x가 −0이고 y가 +0 이면 true를 반환합니다. 10. false를 반환합니다. 11. Type(x)가 문자열이면 x와 y가 정확히 동일한 문자 시퀀스(동일한 길이 및 해당 위치의 동일한 문자) 이면 true를 반환합니다. 그렇지 않으면 false를 반환합니다. 12. Type(x)가 부울이면 x와 y가 모두 true이거나 모두 false이면 true를반환하고 , 그렇지 않으면 false를 반환합니다. 그렇지 않으면 false를 반환합니다. 13. x와 y가 동일한 객체를 참조하거나 서로 결합된 객체를 참조하는 경우 true를 반환합니다(13.1.2 참조). 그렇지 않으면 false 를 반환합니다.
흥미로운 것은 11단계입니다. 예, 문자열은 값 유형으로 처리됩니다. 그러나 이것은 new String("a") !== "a" 인 이유를 설명하지 않습니다. ECMA-262를 준수하지 않는 브라우저가 있습니까?
그렇게 빠르지 않다!
피연산자의 유형을 확인합시다. typeof() 에 래핑하여 직접 사용해 보세요. 나는 new String("a") 이 객체이고 1단계가 사용된다는 것을 발견했습니다. 유형이 다르면 false를 반환합니다.
new String("a") 이 문자열을 반환하지 않는 이유가 궁금하다면 사양을 읽는 연습을 해보는 것은 어떨까요? 즐거운 시간 보내세요!
Aidiakapi는 아래 댓글에 이렇게 썼습니다.
사양에서
11.2.2 새로운 연산자 :
Type(생성자)가 Object가 아니면 TypeError 예외를 던집니다.
즉, String이 Object 유형이 아니면 new 연산자와 함께 사용할 수 없습니다.
new는 String 생성자에 대해서도 항상 Object를 반환합니다. 그리고 아아! 문자열에 대한 값 의미 체계(11단계 참조)가 손실됩니다.
그리고 이것은 마지막으로 new String("a") !== "a" 를 의미 합니다.
답변자 : Simon Scarfe
다음과 같은 코드를 사용하여 Firebug 와 함께 Firefox에서 이것을 테스트했습니다.
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번 이상 반복된다는 것을 기억하십시오)는 무시할 수 있을 정도라고 말하고 싶습니다. 성능 === 하는 이유 가 아닙니다 . 유형 안전(자바스크립트에서 얻을 수 있는 것만큼 안전함) 및 코드 품질이 보장됩니다.
답변자 : Shiki
PHP와 JavaScript에서는 엄격한 항등 연산자입니다. 즉, 유형과 값을 모두 비교합니다.
답변자 : Dimitar
JavaScript에서는 동일한 값과 유형을 의미합니다.
예를 들어,
4 == "4" // will return true
하지만
4 === "4" // will return false
답변자 : Doctor Jones
=== 연산자 이것은 연산자 ==다른가 엄격한 비교 연산자 불린다.
2개의 var와 b를 사용하겠습니다.
"a == b" 가 true로 평가되려면 a와 b가 같은 값 이어야 합니다.
"a === b"의 경우 a와 b는 동일한 값 이어야 하고 또한 동일한 유형 이어야 true로 평가됩니다.
다음 예를 들어
var a = 1; var b = "1"; if (a == b) //evaluates to true as a and b are both 1 { alert("a == b"); } if (a === b) //evaluates to false as a is not the same type as b { alert("a === b"); }
요약하자면 ; == 연산자를 사용하면 원하지 않는 상황에서 true로 평가될 수 있으므로 === 연산자를 사용하는 것이 더 안전합니다.
90% 사용 시나리오에서는 어느 것을 사용하든 상관없지만 어느 날 예기치 않은 동작이 발생할 때 차이점을 아는 것이 편리합니다.
let A = '' // empty string let B = 0 // zero let C = '0' // zero string A == B // true - ok... B == C // true - so far so good... A == C // **FALSE** - Plot twist!
다시 한 번 말씀드리겠습니다.
(A == B) && (B == C) // true (A == C) // **FALSE**
그리고 이것은 당신이 프리미티브로 얻을 수 있는 미친 것들입니다.
== 를 객체와 함께 사용할 때 완전히 새로운 차원의 미친 수준입니다.
이 시점에서 당신은 아마도 궁금해 할 것입니다 ...
왜 이런 일이 발생합니까?
글쎄, 그것은 두 값이 같은지 확인하는 "triple equals"( ===
==다른 많은 일을 합니다.
함수에 대한 특수 처리, null, 정의되지 않은 문자열에 대한 특수 처리, 이름을 지정합니다.
꽤 이상해집니다.
== 가 하는 일을 하는 함수를 작성하려고 하면 다음과 같이 보일 것입니다.
function isEqual(x, y) { // if `==` were a function if(typeof y === typeof x) return y === x; // treat null and undefined the same var xIsNothing = (y === undefined) || (y === null); var yIsNothing = (x === undefined) || (x === null); if(xIsNothing || yIsNothing) return (xIsNothing && yIsNothing); if(typeof y === "function" || typeof x === "function") { // if either value is a string // convert the function into a string and compare if(typeof x === "string") { return x === y.toString(); } else if(typeof y === "string") { return x.toString() === y; } return false; } if(typeof x === "object") x = toPrimitive(x); if(typeof y === "object") y = toPrimitive(y); if(typeof y === typeof x) return y === x; // convert x and y into numbers if they are not already use the "+" trick if(typeof x !== "number") x = +x; if(typeof y !== "number") y = +y; // actually the real `==` is even more complicated than this, especially in ES6 return x === y; } function toPrimitive(obj) { var value = obj.valueOf(); if(obj !== value) return value; return obj.toString(); }
그래서 이것은 무엇을 의미합니까?
== 가 복잡하다는 뜻입니다.
복잡하기 때문에 그것을 사용할 때 무슨 일이 일어날지 알기 어렵습니다.
즉, 버그로 끝날 수 있습니다.
그래서 이야기의 교훈은...
당신의 삶을 덜 복잡하게 만드십시오.
== 대신 === 를 사용하십시오.
끝.
답변자 : vsync
===같은 면이 type 과 value 가 동일한지 확인합니다.
예시:
'1' === 1 // will return "false" because `string` is not a `number`
일반적인 예:
0 == '' // will be "true", but it's very common to want this check to be "false"
또 다른 일반적인 예:
null == undefined // returns "true", but in most cases a distinction is necessary
undefined , null , 0 또는 "" 인지 신경쓰지 않기 때문에 형식이 지정되지 않은 검사가 편리할 때가 많습니다.
답변자 : Samar Panda
엄격한 동등성에 대한 Javascript 실행 흐름도 / 비교 '==='
비엄격 같음/비교 '=='에 대한 Javascript 실행 흐름도
답변자 : user2496033
자바스크립트 ===대== .
0==false // true 0===false // false, because they are of a different type 1=="1" // true, auto type coercion 1==="1" // false, because they are of a different type
답변자 : Pop Catalin
유형 강제 변환이 없는 평등을 의미합니다. 유형 강제 변환은 JavaScript가 다른 데이터 유형을 문자열 데이터 유형으로 자동 변환하지 않는다는 것을 의미합니다.
0==false // true,although they are different types 0===false // false,as they are different types 2=='2' //true,different types,one is string and another is integer but javaScript convert 2 to string by using == operator 2==='2' //false because by using === operator ,javaScript do not convert integer to string 2===2 //true because both have same value and same types
답변자 : Constantin
일반적인 스크립트에서는 성능 차이가 없습니다. 더 중요한 사실은 천 "==="이 천 "=="보다 1KB 더 무겁다는 사실일 수 있습니다. JavaScript 프로파일러 는 귀하의 경우에 성능 차이가 있는지 알려줄 수 있습니다.
그러나 개인적으로 나는 JSLint가 제안하는 것을 할 것입니다. 이 권장 사항은 성능 문제 때문이 아니라 형식 강제 변환이 ('\t\r\n' == 0) 이 true임을 의미하기 때문입니다.
답변자 : Community Wiki
등호 비교 연산자 ==는 혼란스럽기 때문에 피해야 합니다.
답변자 : Sean
사용량에서 두 작업 사이에 성능 차이가 없을 것 같습니다. 두 매개변수가 이미 동일한 유형이기 때문에 수행할 유형 변환이 없습니다. 두 작업 모두 유형 비교와 값 비교가 뒤따릅니다.
답변자 : Aniket Thakur
예! 상관 있지.
자바스크립트의 ===연산자는 값과 유형을 검사합니다. 여기서 == 연산자 는 값만 검사합니다(필요한 경우 유형 변환 수행) .
쉽게 테스트할 수 있습니다. HTML 파일에 다음 코드를 붙여넣고 브라우저에서 엽니다.
<script> function onPageLoad() { var x = "5"; var y = 5; alert(x === 5); }; </script> </head> <body onload='onPageLoad();'>
경고에 ' 거짓 '이 표시됩니다. onPageLoad() 메서드를 alert(x == 5); 수정합니다. 당신은 사실 을 얻을 것이다.
답변자 : Daniel
엄격한 검사입니다.
특히 0과 false 및 null 사이를 확인하는 경우에 좋습니다.
예를 들어 다음이 있는 경우:
$a = 0;
그 다음에:
$a==0; $a==NULL; $a==false;
모두 true를 반환하며 이를 원하지 않을 수 있습니다. 배열의 0번째 인덱스를 반환하거나 실패 시 false를 반환할 수 있는 함수가 있다고 가정해 보겠습니다. "==" false로 확인하면 혼란스러운 결과를 얻을 수 있습니다.
JavaScript의 유형 강제 변환은 데이터 유형을 다른 데이터 유형으로 자동 변환하는 것을 의미합니다.
예를 들어:
123 == "123" // Returns true, because JS coerces string "123" to number 123 // and then goes on to compare `123 == 123`. 123 === "123" // Returns false, because JS does not coerce values of different types here.
답변자 : ashes
JSLint는 때때로 물건을 수정해야 하는 비현실적인 이유를 제공합니다. === 는 유형이 이미 동일한 경우 == 와 정확히 동일한 성능을 갖습니다.
유형이 동일하지 않을 때만 더 빠르며, 이 경우 유형 변환을 시도하지 않고 직접 false를 반환합니다.
따라서 IMHO, JSLint는 새 코드를 작성하는 데 사용될 수 있지만 불필요한 과도한 최적화는 어떤 대가를 치르더라도 피해야 합니다.
if (a == 'test') 와 같은 검사에서 a가 문자열만 될 수 있다는 사실을 알 때 == 를 === 로 변경할 이유가 없습니다.
그런 식으로 많은 코드를 수정하면 개발자와 검토자의 시간이 낭비되고 아무 것도 얻지 못합니다.
답변자 : Vikas
간단한 예는
2 == '2' -> true, values are SAME because of type conversion. 2 === '2' -> false, values are NOT SAME because of no type conversion.
답변자 : mar10
엄지 손가락의 규칙으로서, 나는 일반적으로 사용하는 것이 === 대신 == (와 !== 대신 != ).
여기 와 ab 값이 없습니다. 반면 0, false 및 ''는 모두 값입니다. 이 모든 것들 사이에 공통적인 한 가지는 그것들이 모두 거짓 값이라는 것입니다. 즉, 모두 거짓 조건을 충족한다는 의미입니다.
따라서 0, false 및 ''는 함께 하위 그룹을 형성합니다. 반면에 null & undefined는 두 번째 하위 그룹을 형성합니다. 아래 이미지에서 비교를 확인하십시오. null과 undefined는 같습니다. 나머지 세 개는 서로 같을 것입니다. 그러나 JavaScript에서는 모두 거짓 조건으로 취급됩니다.
이는 모든 객체({}, 배열 등)와 동일하며 비어 있지 않은 문자열 및 부울 true는 모두 참 조건입니다. 그러나, 그들은 모두 평등하지 않습니다.