때마다 사람에 대해 테스트를 언급 undefined
, 그것의 뾰족한 밖으로undefined
있도록 키워드 아닌 이 설정 될 수"hello"
있도록, 당신이 사용해야하는 typeof x == "undefined"
대신. 이것은 나에게 우스꽝스러운 것 같습니다. 아무도 그렇게하지 않을 것이고, 만약 그렇게했다면 그들이 작성한 코드를 절대 사용하지 않을 충분한 이유가 될 것입니다. 맞죠?
내가 발견 한 예를 실수로 설정 사람의 undefined
에를 null
,이는 그 가정 피하기위한 이유로 주어진 undefined
덮어 쓰지 않습니다. 그러나 그들이 그렇게했다면 버그가 발견되지 않았을 것이고, 그것이 얼마나 더 나은지 알 수 없습니다.
C ++에서 모든 사람은라고 말하는 것이 합법적이라는 것을 잘 알고 #define true false
있지만 아무도 피하고 대신 true
사용 하도록 조언 0 == 0
하지 않습니다. 당신은 그 누구도 그렇게 할만큼 큰 멍청이가되지 않을 것이라고 가정하고 그들이 그렇게한다면 그들의 코드를 다시는 신뢰하지 마십시오.
이것이 다른 누군가가 undefined
(의도적으로) 할당 된 누군가를 물려서 당신의 코드를 깨뜨린 적이 있습니까? 아니면 이것은 가상의 위협에 가깝습니까? 나는 내 코드를 조금 더 읽기 쉽게 만들 수있는 기회를 갖고 싶다. 정말 나쁜 생각인가요?
다시 말해, 정의되지 않은 재 할당으로부터 보호하는 방법을 묻는 것이 아닙니다 . 나는 그 트릭이 이미 100 번 쓰여진 것을 보았다. 그 속임수를 사용하지 않는 것이 얼마나 위험한지 묻고 있습니다.
답변
아뇨. 이것은 주로 ECMAScript 5와 호환되는 최신 브라우저에서 개발하기 때문입니다. ES5 표준 undefined
은 현재 읽기 전용 임을 나타냅니다 . 엄격 모드를 사용하는 경우 (필요한 경우) 실수로 수정하려고하면 오류가 발생합니다.
undefined = 5;
alert(undefined); // still undefined
'use strict';
undefined = 5; // throws TypeError
당신이해야합니까 하지 IS 자신 범위의를 생성 할, 변경할 수 undefined
:
(function (undefined) {
// don't do this, because now `undefined` can be changed
undefined = 5;
})();
상수는 괜찮습니다. 여전히 불필요하지만 괜찮습니다.
(function () {
const undefined = void 0;
})();
답변
적절한 코드는 그런 일을 할 수 없습니다. 하지만 똑똑한 개발자 나 사용중인 플러그인 / 라이브러리 / 스크립트가 무엇을했는지 결코 알 수 없습니다. 반면에 최신 브라우저는 덮어 쓰기 undefined
를 전혀 허용하지 않으므로 개발을 위해 이러한 브라우저를 사용하는 경우 코드를 덮어 쓰려는 경우 신속하게 알 수 있습니다.
그리고 비록 당신이 그것을 요구하지 않았음에도 불구하고-많은 사람들은 아마도 더 일반적인 “재정의 된 보호 방법 undefined
“문제를 찾을 때이 질문을 발견 할 것입니다 . 그래서 어쨌든 대답하겠습니다 :
브라우저의 수명에 undefined
관계없이 진정으로 정의되지 않은 상태 를 얻을 수있는 아주 좋은 방법 이 있습니다.
(function(undefined) {
// your code where undefined is undefined
})();
지정되지 않은 인수는 항상이므로 작동합니다 undefined
. 예를 들어 jQuery를 사용할 때 이와 같이 실제 인수를 받아들이는 함수를 사용하여 수행 할 수도 있습니다. 일반적으로 다음과 같은 방식으로 정상적인 환경을 유지하는 것이 좋습니다.
(function($, window, undefined) {
// your code where undefined is undefined
})(jQuery, this);
그런 다음 익명 함수 내부에서 다음 사항이 참인지 확인할 수 있습니다.
$ === jQuery
window === [the global object]
undefined === [undefined]
.
그러나 참고 때로는 typeof x === 'undefined'
실제로 필요 : 변수는 경우 x
값 (인 반대에 설정되지 않았어요 세트 로를 undefined
읽기) x
과 같은 다른 방법으로 if(x === undefined)
오류가 발생합니다. 그러나 이것은 객체 속성에는 적용되지 않으므로 그것이 y
항상 객체 라는 것을 알고 있다면 if(y.x === undefined)
완벽하게 안전합니다.
답변
그것에 대한 간단한 해결책이 있습니다 : void 0
항상 정의되지 않은 것과 비교하십시오 .
==
값을 강제 할 수 있으므로 피해야 합니다. 대신 ===
(및 !==
)을 사용하십시오 .
즉, 정의되지 않은 변수는 무언가를 비교할 때 =
대신 누군가가 쓰는 경우 오류로 설정 될 수 있습니다 .==
undefined
답변
어떤 코드를 사용하는지, 따라서 얼마나 위험한지 아는 사람 만 있습니다. 이 질문에 대한 답변은 귀하가 원하는 방식으로 답변 할 수 없습니다.
1) 팀 정책을 만들고 정의되지 않은 재정의를 허용하지 않고 더 많이 사용하도록 예약합니다. 정의되지 않은 왼쪽 할당에 대해 기존 코드를 스캔하십시오.
2) 모든 시나리오를 제어하지 않고 코드가 사용자 또는 정책이 제어하는 상황 외부에서 사용되는 경우 분명히 대답이 다릅니다. 스크립트를 사용하는 코드를 스캔하십시오. 원하는 경우 정의되지 않은 왼쪽 할당에 대한 통계를 웹에서 검색하지만 대신 여기에서 # 1 또는 # 3 답을 추구하는 것이 더 쉽기 때문에 이것이 당신을 위해 이루어진 것 같지 않습니다.
3) 그리고 그 대답이 충분하지 않다면 아마도 다른 대답이 필요하기 때문일 것입니다. 회사 방화벽 내에서 사용될 인기있는 라이브러리를 작성하고 있으며 호출 코드에 액세스 할 수 없습니다. 그런 다음 여기에 다른 훌륭한 답변 중 하나를 사용하십시오. 인기있는 jQuery 라이브러리는 사운드 캡슐화를 실행하고 시작합니다.
(function( window, undefined ) {
당신이 찾고있는 특정 방식으로 당신의 질문에 답할 수 있습니다. 더 할 말은 무엇입니까?
편집 : 추신 당신이 정말로 내 의견을 원한다면, 나는 그것이 전혀 위험하지 않다고 말할 것입니다. 결함을 유발할 가능성이 매우 높은 모든 것 (예 : 정의되지 않은 것에 할당하는 것은 명백히 잘 문서화 된 위험한 행동) 그 자체가 결함입니다. 위험은 결함입니다. 하지만 그것은 제 시나리오에 불과합니다. 그 관점을 유지할 수있는 여유가 있습니다. 제가 추천하는대로 제 사용 사례에 대한 질문에 답했습니다.
답변
undefined에 대해 테스트하는 것이 안전합니다. 이미 언급했듯이. 이를 재정의하는 코드 (매우 즉흥적 임)에 도달하면 더 이상 사용하지 마십시오.
어쩌면 당신은 공공 사용을위한 라이브러리를 작성하는 경우, 사용자의 변화에게 그것을 방지하기 위해 몇 가지 기술을 사용할 수 있습니다. 그러나이 경우에도 도서관이 아니라 그들의 문제입니다.
답변
undefined
ECMAScript 5.1을 지원하는 브라우저 용으로 코딩 할 때 언어 사양에 따라 변경할 수 없으므로 코드에서 사용할 수 있습니다 .
또한 모든 최신 브라우저 (IE 9+)가 immutable을 구현 했는지 확인하려면 이 호환성 표 또는 이 캐니 우스 ECMAScript 5 를 참조하십시오 .undefined
답변
전혀 위험하지 않습니다. ES3 엔진에서 실행할 때만 덮어 쓸 수 있으며 더 이상 사용되지 않을 것입니다.