최근에이 오류가 발생했을 때 JSLint를 통해 일부 코드를 실행했습니다. 이 오류에 대해 재미 있다고 생각하는 것은 모든 ==가 ===이어야한다고 자동으로 가정한다는 것입니다.
정말 말이 되나요? 유형을 비교하고 싶지 않은 인스턴스를 많이 볼 수 있었는데, 이것이 실제로 문제를 일으킬 수 있다고 걱정됩니다.
"예상"이라는 단어는이 작업을 매번 수행해야 함을 의미합니다 ..... 그게 말이 안되는 것입니다.
최근에이 오류가 발생했을 때 JSLint를 통해 일부 코드를 실행했습니다. 이 오류에 대해 재미 있다고 생각하는 것은 모든 ==가 ===이어야한다고 자동으로 가정한다는 것입니다.
정말 말이 되나요? 유형을 비교하고 싶지 않은 인스턴스를 많이 볼 수 있었는데, 이것이 실제로 문제를 일으킬 수 있다고 걱정됩니다.
"예상"이라는 단어는이 작업을 매번 수행해야 함을 의미합니다 ..... 그게 말이 안되는 것입니다.
myVar == null
수표 를하고 있었다면 , 네, 큰 변화입니다. ; ^) Crockford의 주장은 그것이 코드의 의미를 더 정확하게 만들었고 논쟁하기 어렵습니다.
답변:
유형 변환이 작동 하는 방식===
을 이해 하지 않고 맹목적으로 IMO를 사용 하는 것은 의미가 없습니다.
Equals 연산자에 대한 주요 두려움 은 ==
비교되는 유형에 따른 비교 규칙이 연산자를 비전 이적으로 만들 수 있다는 것입니다. 예를 들면 다음과 같습니다.
A == B AND
B == C
실제로 다음을 보장하지는 않습니다.
A == C
예를 들면 :
'0' == 0; // true
0 == ''; // true
'0' == ''; // false
Strict Equals 연산자 ===
는 동일한 유형의 값을 비교할 때 실제로 필요하지 않습니다. 가장 일반적인 예입니다.
if (typeof foo == "function") {
//..
}
우리는의 결과 비교 typeof
연산자, 항상 문자열 로, 문자열 리터럴을 ...
당신이 강제 형 변환 규칙을 알고있을 때 무언가가있는 경우 또는, 예를 들어, 확인 null
또는 undefined
뭔가 :
if (foo == null) {
// foo is null or undefined
}
// Vs. the following non-sense version:
if (foo === null || typeof foo === "undefined") {
// foo is null or undefined
}
===
연산자 의 요점 은 코드 명확성입니다. ==
ID 운영자만큼 명확하고 이해할 수 없기 때문에 사용할 합리적인 상황이 없습니다 . 연산자를 이해하는지 여부가 아니라 거의 비용없이 코드를 더 쉽게 읽을 수있는 연산자를 사용하는 것입니다. ID 연산자에 반대하는 유일한 개발자는 솔로 개발자와 팀에서 일하지 않는 사람들입니다. 정의에 따르면 코드는 충분한 눈으로 검토되지 않습니다.
there is no reasonable situation
심한 오해입니다. (네이티브) Javascript 유형 Number
및 String
. 그들의 존재는 자바 스크립트 작성자가 ==
. new String('hi') === 'hi'
평가하는 false
것이 매우 명확 하다고 생각하십니까 ? 'hi'
문자열과 문자열을 모두 받아들이는 것에 대해 함수 인수를 테스트하는 코드 스 니펫을 작성하고 명확하게 알려주십시오.
JSLint는 본질적으로 Javascript 구문이 허용하는 것보다 더 방어 적입니다.
JSLint 문서에서 :
==
및!=
연산자는 비교하기 전에 강제 형 변환을한다. 이것은 사실이되기 때문에 나쁘다' \t\r\n' == 0
. 이것은 유형 오류를 가릴 수 있습니다.다음 값 중 하나와 비교할 때
===
or!==
연산자 (유형 강제 변환을 수행하지 않음)를 사용하십시오.0 '' undefined null false true
값이 진실 인지 거짓 인지에만 관심이 있다면 짧은 형식을 사용하세요. 대신에
(foo != 0)
그냥 말해
(foo)
그리고 대신
(foo == 0)
말하다
(!foo)
===
및!==
운영이 바람직하다.
==
. 이것은 ===
특별한 경우입니다 ... JSLint는 사용하는 ==
것이 어떻게 든 잘못된 것처럼 보이게하려고합니다 ... 그러나 이것을 시도하십시오 : var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}
. 프리미티브 유형에는 해당 클래스 ( Number
, String
) 를 대체하는 해당 클래스가 있으며 Javascript는 ==
연산자에 따라 이를 자연스럽게 비교할 수 있습니다.
JSLint는 좋은 JavaScript가 무엇인지에 대한 한 사람의 생각을 강요한다는 것을 명심하십시오. 제안 된 변경 사항을 구현할 때는 여전히 상식을 사용해야합니다.
일반적으로 유형과 값을 비교하면 코드가 더 안전 해집니다 (유형 변환이 예상 한대로 작동하지 않을 때 예기치 않은 동작이 발생하지 않습니다).
Triple-equal은 double-equal과 다릅니다. 두 변이 동일한 값인지 확인하는 것 외에도 triple-equal은 동일한 데이터 유형인지 확인하기 때문입니다.
그래서 ("4" == 4)
사실이지만 ("4" === 4)
거짓입니다.
Triple-equal은 또한 약간 더 빠르게 실행됩니다. JavaScript는 답을 제공하기 전에 유형 변환을 수행하는 데 시간을 낭비 할 필요가 없기 때문입니다.
JSLint는 모호한 버그를 줄이기 위해 의도적으로 JavaScript 코드를 최대한 엄격하게 만드는 것을 목표로합니다. 데이터 유형을 존중하도록 강요하는 방식으로 코드를 작성하기 위해 이러한 종류의 것을 강조합니다.
그러나 JSLint의 좋은 점은 단지 가이드 일 뿐이라는 것입니다. 그들이 사이트에서 말했듯이, 당신이 아주 좋은 자바 스크립트 프로그래머 라 할지라도 그것은 당신의 감정을 상하게 할 것입니다. 그러나 그 조언을 따를 의무가 있다고 느껴서는 안됩니다. 그것이 말하는 것을 읽고 이해했지만 코드가 깨지지 않을 것이라고 확신한다면, 아무것도 변경하지 않아도됩니다.
아무것도하지 않을 것이라는 경고를 받고 싶지 않다면 JSLint에게 검사 범주를 무시하도록 지시 할 수도 있습니다.
http://javascript.crockford.com/code.html 의 인용문 :
=== 및! == 연산자.
=== 및! == 연산자를 사용하는 것이 거의 항상 좋습니다. == 및! = 연산자는 유형 강제를 수행합니다. 특히 잘못된 값과 비교하기 위해 ==를 사용하지 마십시오.
JSLint는 매우 엄격하며 'webjslint.js'는 자체 유효성 검사도 통과하지 못합니다.
webjslint.js
유효성을 검사하지 않는 것에 대한 사실 입니다. 지금 제가 보는 대부분의 오류는 간격과 관련이 있습니다. 분명히 JSLint를 사용하여 JavaScript를 검토 할 때 상식과 합리적인 판단을 사용해야합니다.
always
자동적으로이 인용문이 지혜로 인정되지 않습니다. 똑똑한 프로그래머는 독단적이지 않습니다. 주어진 상황에서 가장 좋은 것을 사용합니다. 그리고 그들은 언어의 핵심에 내장 된 모든 도구를 환영하고 받아들 just never touch it
입니다. 결론 : 내 코드가 더 짧아서 (단지 한 =
문자 를 저장하는 것이 아니라 ) 내 사이트가 더 적은 대역폭 비용으로 더 빨리로드되므로 사용자에게 더 나은 서비스를 제공합니다.
거짓 여부를 테스트하려는 경우. JSLint는 허용하지 않습니다.
if (foo == null)
하지만 허용합니다
if (!foo)
===
JSLint가 권장하는를 사용하십시오 .
foo == null
null 또는 undefined를 확인합니다. !foo
null, undefined, 0 및 빈 문자열을 확인합니다.
이 질문을 설명하고 NetBeans (from) 7.3이이 경고를 표시하기 시작한 이유를 설명하기 위해 누군가가 이것을 버그로보고했을 때 NetBeans 버그 추적기의 응답에서 발췌 한 것입니다.
JavaScript에서 == 대신 ===를 사용하는 것이 좋습니다.
== 및! = 연산자는 비교하기 전에 유형 강제를 수행합니다. 이것은 '\ t \ r \ n'== 0이 참이되기 때문에 나쁘다. 이것은 유형 오류를 가릴 수 있습니다. JSLint는 ==가 올바르게 사용되고 있는지 확실하게 확인할 수 없으므로 == 및! =를 전혀 사용하지 않고 항상 더 안정적인 === 및! == 연산자를 사용하는 것이 가장 좋습니다.
정말 문제를 일으킬 수는 없습니다. 단지 조언을 제공하는 것뿐입니다. 가져 가든지 남겨 두든지. 즉, 그것이 얼마나 영리한지 잘 모르겠습니다. 문제로 제시하지 않는 상황이있을 수 있습니다.