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요소가없는 결과)인지 여부를 확인 하는 변수 가 있습니다 . 그리고는 번역 indefinido에 undefined나는 약간의 차이를보고, 크롬과 가장자리에서 테스트 것을 나는 보았다. 그래서 배우고 있기 때문에 나머지 사람들의 의견을 묻기 위해 여기에 왔습니다.
— 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.