JavaScript에서 undefined를 쓸 수없는 이유는 무엇입니까?


59

에 따르면 에 MDN 설명서undefined :

최신 브라우저 (JavaScript 1.8.5 / Firefox 4+)에서 undefined는 ECMAScript 5 사양에 따라 구성 할 수없고 쓸 수없는 속성입니다. 그렇지 않은 경우에도 무시하지 마십시오.

undefined 의 속성 중 하나는 쓸 수 없다는 것입니다.

그러나 내가하면 :

var undefined = 'hello';
var test = undefined;
console.log(typeof test);
//string

이것이 내가 값을 덮어 쓸 수 있다는 것을 의미합니까 undefined? 누군가 그렇게하면 어떻게됩니까? JavaScript가 경고해야합니까?


5
사용중인 브라우저를 알려주시겠습니까? (Linux에서 Firefox 72.0b10 (64 비트)는 의도 한대로 작동 함 typeof test === "undefined")
jonatjano

3
@DmitryReutov typeof undefined"undefined"정상적인 상황에서 반환합니다 .
Amy

3
@DmitryReutov 물론 "undefined"문자열입니다. 문제는 무엇을 typeof (typeof undefined)평가 하는지 묻지 않습니다 . 무엇을 typeof undefined평가 하는지 묻습니다 . "undefined""string"
Amy가

2
@DmitryReutov typeof ______는의 유형을 포함하는 문자열로 평가되는 표현식입니다 ______. 당신은 그 질문을 오해하고 있습니다.
Amy

3
알아요,하지만 에지 반환 "문자열"과 크롬이 "정의되지 않은"@Amy
아론 에이 탄

답변:


50

Amy 가 삭제 한 주석 이 해결책을 제시합니다. 이라는 변수를 작성 undefined중이며 전역 범위에서 스 니펫을 수행하면 작동하지 않습니다.

var undefined = 'hello';
var test = undefined;
console.log(typeof test);

그러나 undefined 가 더 이상 전역 변수를 참조하지 않는 로컬 범위에서 수행하면 효과적으로 작동합니다 .

(()=>{
  var undefined = 'hello';
  var test = undefined;
  console.log(typeof test);
})()

이 실수를 방지하기 위해 'use strict';지시문을 사용할 수 있습니다 .

'use strict';
var undefined = 'hello';
var test = undefined;
console.log(typeof test);

실행될 곳 (예 : 라이브러리, 임베드 등)을 제어 할 수없는 코드를 작성하는 경우 IIFE를 사용하는 것이 좋은 패턴입니다. 예를 들면 다음과 같습니다.

(function(undefined){
  // undefined will equal `undefined` because we didn't pass in an argument to the IIFE
  
  console.log(undefined); // always `undefined`, even if undefined !== `undefined`outside of the IIFE scope
})(); // No argument supplied


모든 테스트는 Ubuntu에서 Firefox 72.0b10 (64 비트)을 사용하여 수행되었으며 첫 번째 코드 조각의 결과는 이전 브라우저에서 다를 수 있습니다.


3
@pmiranda는 내 것이 아니라 매우 흥미로웠다
jonatjano

2
다시 감사합니다. 이 모든 의심은 이것의 기원을 가지고 있습니다 : 여기에 새로운 개발자가 일부 스페인어 이름 변수를 영어로 번역하고있었습니다. 우리 코드에는 let indefinido= dataArray( (a) => (anotherArray.includes(someName)));var가 'undefined'( find요소가없는 결과)인지 여부를 확인 하는 변수 가 있습니다 . 그리고는 번역 indefinidoundefined나는 약간의 차이를보고, 크롬과 가장자리에서 테스트 것을 나는 보았다. 그래서 배우고 있기 때문에 나머지 사람들의 의견을 묻기 위해 여기에 왔습니다.
pmiranda

@pmiranda이 답변은 "why"부분에 엄격하게 답변하지는 않습니다. 그러나 좋은 대답입니다.
Ismael Miguel

2
undefined의 실제 값이 필요한 경우void 0
사용자가 아닌 사용자

2
@Jon 어떤 이유로 Ecmascript Consortium이 예약 키워드를 정의하지 않고 전역 객체의 속성을 선택 하지 않기 때문에
jonatjano

17

undefined가 예약어가 아니기 때문에 전역 범위 이외의 다른 범위에서 식별자 (변수 이름)로 사용할 수는 있지만 코드를 유지 관리 및 디버깅하기 어려운 매우 나쁜 생각입니다.

출처 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

undefined되고 예약되지 따라서 그것에게 새로운 값을 할당 할 수있다.

사용하지 않을 때는 strict mode본질적 undefined으로 로컬 범위에서 호출되는 변수를 만들고 string값을 지정 합니다.

undefined전역 객체의 속성입니다 . undefined의 초기 값은 프리미티브 값undefined입니다.

use strict 전역 범위 에서이 실수를 방지하는 데 도움이되지만 로컬 범위에서 여전히 덮어 쓸 수 있습니다.

보다 안전하려면 항상을 반환 하는 void 0대신 사용해야 undefined합니다 undefined.

'use stict'

const test = (() => {
  let undefined = "test"
  console.log(typeof undefined)
  console.log(typeof void 0)
})()


1
자세한 내용 은 키워드 목록 을 참조하십시오
jonatjano

1
그러한 IIFE undefined에서는 인수로 읽어서 참조를 얻을 수 있다는 점에 주목할 가치가 있습니다 . IIFE가 여기에 어떤 인수도 전달되지 않기 때문에 IIFE는 그 undefined안에있을 것입니다. 예 :((undefined) => console.log(typeof undefined))()
SeinopSys
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.