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

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

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 질문 -내가 여기서 알아 내려는 것에 대해 너무 광범위했습니다.



답변

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

예를 들면 :

  • [[원기]]

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

  • Object.getOwnPropertyDescriptor

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

  • document.getElementById

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

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


답변

정의되지 않음은 일반적으로 아직 값이 할당되지 않은 것을 나타냅니다. 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는 언제 사용됩니까?


답변

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

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

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

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

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


답변

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입니다. 차이점은 하나의 문 실행을 저장한다는 것입니다.


답변

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

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

typeof undefined는 undefined를 반환합니다.


답변

다음 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하지 않습니다.


답변

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

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

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

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


메모:

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

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

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