자바 스크립트 함수에서 'undefined'또는 'null'을 반환하는 것이 더 낫습니까?


102

기본적으로 다음과 같이 작성한 함수가 있습니다.

function getNextCard(searchTerms) {
  // Setup Some Variables

  // Do a bunch of logic to pick the next card based on termed passed through what I'll call here as 'searchTerms' all of this logic is omitted because it's not important for my question.
  // ...

  // If we find a next card to give, than give it
  if (nextCardFound)
    return nextCardFound;

  // Otherwise - I'm returning undefined
  return undefined;
}

질문 : 여기에 "null"을 반환하는 것이 더 낫습니까?

나는 내가 원하는 것은 무엇이든 되돌릴 수있다 – 당연히 ... 나는 단지 사용하는 것이 가장 좋은 것이 무엇인지 확신하지 못했다.

이 함수를 호출하는 코드는 정의되지 않은 문제를 처리하는 방법을 알고 있습니다 (무언가가 끔찍하게 잘못되지 않는 한 실제로 발생하지 않습니다).

제가이 질문을하는 이유는 "변수에 정의되지 않은 것을 할당하지 마십시오"라는 소리를 들었 기 때문입니다. 디버깅을 더 어렵게 만들 것입니다. 따라서 null다시 전달 되는 것을 볼 수 있다는 사실 은 반환이 작동하고 있지만 기본적으로 undefined.


선적 서류 비치:

Mozilla 문서 가 내 질문에 답변하지 않았습니다 ... Google도 답변하지 않았습니다. \

이 SO 질문 -내가 여기서 알아 내려는 것에 대해 너무 광범위했습니다.


1
질문이 대답하지 않습니까?
warkentien2 2016-06-23

8
제 생각에는 null. 남겨 undefined자바 스크립트 자체에. 그러나 "더 나은"것은 없으므로 이것은 의견의 문제입니다.
Felix Kling

@ warkentien2 감사합니다. 도움이되었습니다.하지만 getter 함수에서 반환하는 규칙이 무엇인지는 아직 명확하지 않습니다.
제레미 Iglehart

1
나는 null"당신이 요구하는 것에 대한 적절한 가치가 없다"와 "당신이 요구하는 undefined것을 해결할 수 없습니다 " 라고 읽었습니다 .
Marty

@ warkentien2 그 질문과 내가 내 대답에 링크 한 질문은 관련이 있지만 둘 다 그들 사이의 차이점이 무엇인지 묻고 둘 중 하나를 반환 값으로 사용할 시기 가 아닌 것 같습니다 .
chiliNUT

답변:


39

나는 최선의 방법이 없다고 주장 할 것이며, 심지어 표준 기능조차 때때로 둘 중 하나를 선택합니다.

예를 들면 :

  • [[원기]]

    일반 개체에는 상속되는 다른 개체를 결정하는 [[Prototype]] 내부 슬롯이 있습니다. 물론 어떤 객체가 다른 객체로부터 상속받지 않는다고 말하는 방법이 있어야합니다. 이 경우 "그런 객체가 없습니다"는를 사용하여 표시됩니다 null.

  • Object.getOwnPropertyDescriptor

    속성 설명자, 즉 속성을 설명하는 객체 (예 : 값, 쓰기 가능성, 열거 가능성 및 구성 가능성)를 반환 할 것으로 예상됩니다. 그러나 속성이 존재하지 않을 수 있습니다. 이 경우 "해당 속성이 없습니다"는를 사용하여 표시됩니다 undefined.

  • document.getElementById

    주어진 ID를 가진 요소를 반환 할 것으로 예상됩니다. 그러나 해당 ID를 가진 요소가 없을 수 있습니다. 이 경우 "해당 요소가 없습니다"는를 사용하여 표시됩니다 null.

따라서 원하는 것을 선택하거나 특정 경우에 더 합리적이라고 생각하십시오.


3
이것을 읽은 후 나는 void 0이 답변의 미래 시청자를 위해 기술 을 제안하기로 결정했습니다 . 또한 귀하의 요점을 더 명확하게하기 위해 코드를 추가했습니다. 답변 주셔서 감사합니다!
제레미 Iglehart

117

정의되지 않음은 일반적으로 아직 값이 할당되지 않은 것을 나타냅니다. Null은 확실히 가치가없는 것을 나타냅니다. 이 경우 null을 반환하는 것이 좋습니다. 반환 값이 지정되지 않은 함수는 암시 적으로 undefined를 반환합니다.

ECMAScript2015 사양에서

4.3.10 정의되지 않은 값

변수에 값이 할당되지 않았을 때 사용되는 기본 값

4.3.12 null 값

객체 값의 의도적 부재를 나타내는 원시 값

http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type

추가 읽기 :

JavaScript에서 null 또는 undefined는 언제 사용됩니까?


1
예, 정의되지 않음은 변수에 값이 할당되지 않은 경우 사용되는 값입니다. 정확히 그것이 함수에서 undefined를 반환해서는 안된다는 것을 의미하는 이유는 무엇입니까?
오리올

1
@Oriol, 내 마음에 void 함수는 undefined를 반환하기 때문에 해당 유형의 함수에 대한 예약 된 값이므로 함수의 반환 값을 처리 할 때 null은 null을 반환하기로 결정한 반면 undefined는이를 알려줍니다. undefined를 반환하기로 결정했거나 아무것도 반환하지 않기로 결정했지만 어떤 것인지 확실히 알 수 없습니다. 또한을 수행하는 경우 var x=someFunc();의도적으로 xa 값을 할당하고 있으며 값이 할당되지 않았거나 할당되지 않았 음을 나타내는 테스트를 통과하지 않을 것입니다. 그냥 이럴
chiliNUT

이것은 받아 들여진 대답이어야합니다. 이것이 스펙에 사용되도록 의도 된 방법입니다
Zinc

1
나는 그렇게 읽지 않는다. 나는 그것을 다음과 같이 읽습니다. 변수를 정의하지만 초기화하지 않으면 대신 초기 값이 정의되지 않습니다. 프로그래머는 변수가 비어 있음을 의도적으로 나타 내기 위해 Null을 사용해야합니다. IMHO undefined는 프로그래머가 변수에 할당해서는 안되며 js 엔진에 맡겨 사용하십시오. "객체"값이라는 용어는 오해의 소지가 있습니다. JS에서는 기본 요소조차도 오토 박싱으로 인해 대부분 객체처럼 동작하기 때문입니다
chiliNUT

1
네, 말이 되네요. 공평하게 말하면, 하나 null를 고수하는 한 다른 하나를 사용하는 데 신경 쓰지 않지만 (보다 익숙 하지만), 가치가 없음을 나타내는 2 개의 값 ( "유형"이 무엇이든간에)은 항상 혼란 스럽습니다.
Sergio Rosas

40

둘 중 하나를 고르는 내 개인적인 의견을 제시하겠습니다.

내 간단한 질문은 다음과 같습니다. 다른 입력 / 상태 / 컨텍스트가 주어진 값이 무언가에 정의 될 수 있습니까?

대답이 예이면 nullelse 사용을 사용하십시오 undefined. 일반적으로 객체를 반환하는 모든 함수 null는 의도 한 객체가 존재하지 않을 때 반환되어야 합니다. 다른 입력 / 상태 / 컨텍스트가 주어질 수 있기 때문입니다.

null주어진 입력 / 상태 / 컨텍스트에 대한 없음을 나타냅니다 . 이는 값 자체 의 개념 이 애플리케이션 컨텍스트에 존재하지만 부재 할 수 있음을 의미합니다. 귀하의 예에서 다음 카드의 개념은 존재하지만 카드 자체는 존재하지 않을 수 있습니다. null사용되어야한다.

undefined애플리케이션 컨텍스트에서 해당 값 의 의미없음을 암시 적으로 나타냅니다 . 예를 들어, user주어진 속성 집합으로 객체를 조작하고 속성에 액세스하려고하면 pikatchu. 이 속성의 값은로 설정되어야합니다 undefined. 내 컨텍스트에서 이러한 속성을 갖는 것은 의미가 없기 때문입니다.


1
이것은 나에게 매우 사실입니다. IMO 순수 함수는 함수 프로그래머처럼 생각할 때를 null반환해야하지만 부작용이 undefined있는 함수는를 반환해야합니다 .
Jake

4

undefined할당해야 할 것이 아닙니다. 이외의 다른 항목을 반환하는 것을 고려할 수 있습니다 undefined. 귀하의 경우에는 아무것도 반환하지 않더라도 결과는 undefined이미 있습니다. 그래서 null대신 함께 갈 것을 제안합니다 .

이 샘플을 고려하십시오.

function getSomething() {
     // .. do something
     return undefined;
}

function doSomething() {
     // .. I'm not gonna return anything.
}

var a = getSomething();
var b = doSomething();

위의 샘플 결과 a === bundefined입니다. 차이점은 하나의 문 실행을 저장한다는 것입니다.


@Oriol 내 말은 undefined할당 할 필요가 없습니다. 값없이 선언 된 모든 변수는 이미 undefined있습니다.
choz

@choz & @Oriol-@chiliNUT에서 앞서 언급했듯이 "지정된 반환 값이없는 함수는 암시 적으로 undefined를 반환합니다." -이것은 (function(){ /* code */ })()콘솔에서 null을 반환 하기 때문에 사실 입니다.
제레미 Iglehart

1
@JeremyIglehart 그 코드는 실제로 아무것도 반환하지 않습니다. 그렇지 않으면 undefined내 크롬과 파이어 폭스 콘솔에서 제공 됩니다.
choz

네 요점을 이해하지 못했습니다. 예, 명시 적으로 아무것도 반환하지 않으면 undefined가 암시 적으로 반환됩니다. 하지만 그게 왜 중요할까요?
오리올

1
@Oriol, @choz가 (이 질문에 대해 언급 한 것처럼) undefined다른 것이 더 일찍 반환되지 않으면 반환 하고 싶다면 함수의 기본 동작 때문에 할 필요가 없다고 생각합니다. 당신은 아무것도 반환하지 않는 것은 undefined를 반환하는 것입니다-그들은 이것이 필요하지 않다고 말하는 것입니다. 더군다나 ... null을 반환하는 내장 getter 함수에 대해 말한 내용이 마음에 듭니다. 그 효과에 대한 답변을 게시 해 주시면 수락하겠습니다.
제레미 Iglehart

3

반환 된 값으로 무엇을해야하는지에 따라 다릅니다.

typeof null은 객체를 반환합니다. 해당 개체의 값이 정의되지 않음

typeof undefined는 undefined를 반환합니다.


개인적으로 나는 보통 null을 사용합니다.
Dan

4
"해당 객체는 정의되지 않은 값을가집니다." 아니요, 객체가 아니고 Null입니다. typeof값의 실제 데이터 유형을 반드시 반환하는 것은 아니며 데이터 유형을 레이블에 매핑하고 해당 레이블을 반환하는 맵이 있습니다.
펠릭스 클링

typeof이름에도 불구하고 값의 유형을 알려주지 않지만 신뢰하지 마십시오 .
Oriol

3

다음 undefined은보다 의미가 있는 예입니다 null.

JSON.parse예외를 undefined다음과 같이 변환 하는 래퍼 함수를 ​​사용합니다 .

// parses s as JSON if possible and returns undefined otherwise
// return undefined iff s is not a string or not parseable as JSON; undefined is not a valid JSON value https://stackoverflow.com/a/14946821/524504
function JSON_parse_or_undefined(s) {
    if ("string" !== typeof s) return undefined

    try {
        const p = JSON.parse(s)
        return p
    } catch (x){}

    return undefined
}

null동안 JSON에 유효 undefined하지 않습니다.


나는 당신이 그곳에서 무엇을하고 있는지를 봅니다. 그리고 나는 당신이 틀렸다고 말할 수 없습니다. 나중에 "유효성 검사"단계를 수행하기 때문에이 작업을 수행하는 데 사용하는 다른 패턴이 있습니다. 나는 이것이 값을 반환하는 것과 혼합 된 유효성 검사를 받고 있다고 생각합니다. 내가하는 일은 다음과 같습니다 let getStringOrJSON = value => { try { value = JSON.parse(value); } catch(e) { return value; } return value; };. 이제 두 번의 수익이 다르게 처리 될 수 있으며 JS 골프 대회에서 우승하지 못할 수도 있습니다. 효과가있다.
Jeremy Iglehart

2

이 경우에는 null반환되어야 한다고 주장합니다 .

이론적 인 컴퓨터 과학 관점에서 질문을 고려한다면 undefined비 종결 / 비계 산성 을 나타내는 데 사용됩니다 (예 : 종종 작성되는 부분 함수 의 정의되지 않은 지점 x에 대한 자리 표시 자 ). ff(x) = ⊥

getNextCard그러나 다음 카드 (존재하는 경우)를 계산할 수 있고 다음 카드가없는 경우에도 계산할 수있는 것으로 보입니다. 즉, 함수는 모든 입력에 대해 종료되므로 합계 입니다.

즉, 의미있는 결과가없는 특수 값 신호 종료 (예 : "이 입력에 대해 반환 할 수있는 카드가 없습니다")가 필요하며 이것은 나에게는 null아닙니다 undefined.


메모:

의미있는 결과가없는 종료가 옵션 유형 (때때로 nullable 유형 이라고도 함)을 사용하여 표현되는 다른 유형 언어에서도이 인수에 대한 일부 지원을 볼 수 있습니다 . 이에 대한 예는 Maybe in Haskell 입니다.

반면에 우리는 물론 undefinedJavaScript에서 실제로 의미 하는 바를 알지 못합니다 . 따라서 undefined에 대한 비유 는 약간입니다. 더욱이, 우리는 항상 전체 함수로 작업하기를 원하기 때문에 이것은 " undefined함수에서 반환하지 않는다"라고 말하는 것과 같습니다 . undefined설정되지 않은 속성 / 변수에 대한 사용을 제한하기 때문에 약간 엄격한 것처럼 보입니다 .

결국, 개인적으로 선호하는 것은 돌아올 수 undefined있는 곳 으로 돌아 오지 않는 null것입니다. 그리고 이것이 더 나은 코딩 규칙이라고 주장 할 것 x !== null입니다 (왜냐하면 무엇 보다도 typeof x !== 'undefined'.


1

첫 번째 대답이 맞습니다. 그들은 이론적으로 다른 의미를 가지고 있습니다. 그러나 어느 것을 골라야할지 항상 명확하지는 않습니다.

나는 그것이 완전히 주관적인 것이라고 생각하지만 내 개발에 null을 사용하는 경향이 있습니다.

나는 주로 다음과 같은 이유로 사용합니다.

  1. 정의되지 않은 변수는 이전 브라우저에서 덮어 쓸 수 있으므로 반환하는 것이 조금 더 복잡합니다. 이 동일한 문제로 인해 typeof var === 'undefined'함수 결과를 얻을 때 사용해야 합니다.링크

  2. 다른 언어는 null을 널리 사용하는 경향이 있으며, 많은 언어가 정의되지 않은 언어 (예 : PHP)도 없습니다. 언어를 빠르게 바꿀 때 일관성이 있습니다.


1

나는 무엇을 사용해야할지 매우 논쟁의 여지가 있다고 생각합니다. 나는 의미 상 가능한 한 정확한 코드를 선호하므로undefined 경우에 적절 합니다.

null할당은 "무로 설정된 변수"를 의미 한다고 생각 합니다. 이것은 반대입니다undefined "이것이 전혀 존재하지 않는다"는 의미

이전 답변에서 지적했듯이 복귀 undefined에는 문제가 있으며 그것이 당신을 괴롭히는 지 여부는 전적으로 당신에게 달려 있습니다. 그것은 나를 괴롭히지 않을 것입니다.


2
그러나 의미가 "이 것은 전혀 존재하지 않는다"에 더 가깝더라도를 document.getElementById('iDoNotExist')반환합니다 null. 표준 방법이 작동한다면 왜 OP가 아닌가?
오리올

@Oriol 나는 실제로 당신의 추론을 가장 좋아합니다. 이 효과에 대한 답변을 게시하면 수락하겠습니다. (필요한 경우 난 몇 가지 수정 사항을 추가 할 수 있습니다)
제레미 Iglehart에게

Yah @Oriol, 이것이 Q / A 사이트에서도 실제로 토론을 즐기는 이유입니다. 카운터 예제를 얻는 것이 정말 좋습니다. 그리고 당신은 좋은 것을 제공했습니다.
라이언 Laboucane

-2

내 경험에 따르면 내 개인적인 의견은 코드 충돌을 원하지 않으면 undefined 및 null을 사용하지 않는다는 것입니다. 적어도 나는 그것을 개인적으로 피할 것입니다. 자바 스크립트에는 undefined를 반환하는 많은 함수가 있으며 우리가 사용해야합니다. 그러나 코드를 디자인 할 때 사용하지 마십시오. 항상 "false"적어도 무언가 를 반환하는 것이 중요합니다 . 예를 들어 배열이 있고 그 위에 매핑하는 경우. 반환 [undefined, undefined.....]또는 그냥 좋지 않습니다 undefined. 원래 배열의 유형을 유지하는 것이 좋습니다. 예:

 const mapper:Map <string[],boolean[]>  
['i', 'dont', 'use', 'null or undefined'] -> [false, true, false, true, false]
or ['', dont, '', '', use] 
or al the stuff above and then filter(v => v)
that will keep all undefined and null out

그게 아이디어입니다. 나는 그것을 피하기 위해 항상 노력합니다. 때문에 null또는 undefined쉽게 코드를 충돌 할 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.