programing

JavaScript null 검사입니다.

bestprogram 2023. 7. 26. 22:13

JavaScript null 검사입니다.

다음 코드를 발견했습니다.

function test(data) {
    if (data != null && data !== undefined) {
        // some code here
    }
}

저는 자바스크립트에 익숙하지 않지만, 제가 여기서 읽은 다른 질문들로부터, 저는 이 코드가 별로 의미가 없다는 인상을 받았습니다.


특히, 대답은 다음과 같습니다.

다음 이외의 컨텍스트에서 정의되지 않은 변수에 액세스하면 오류가 발생합니다.typeof.

업데이트: 위의 (의) 답변이 오해의 소지가 있을 수 있습니다."미정의 변수"아니라 "미정의 변수"로 표시되어야 합니다.

제가 알아낸 바와 같이, Ryan ♦, 마에릭스의 거의답변에서는 함수에 인수가 제공되지 않더라도 인수에 대한 변수는 항상 선언됩니다.이 사실은 또한 아래 목록의 첫 번째 항목이 틀렸다는 것을 증명합니다.


제가 알기로는 다음과 같은 시나리오가 발생할 수 있습니다.

  • 함수가 인수 없이 호출되어 생성되었습니다.data되지 않은 변수, 정되지및오발에 합니다.data != null.

  • 함수는 다음과 같이 구체적으로 호출되었습니다.null(또는)undefined), 으로서, 이 에는 , , , , 이 경우에는.data != null내부 하여 이미내보있습다니고호를 렌더링합니다.&& data !== undefined쓸모 없는.

  • 는 null이 아닌되었으며, 이 경우 null은 null과 null을 합니다.data != null 그리고. data !== undefined.

Q: 제가 이해한 것이 맞습니까?


파이어폭스의 콘솔에서 다음을 시도해 보았습니다.

--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true

저는 그 사건을 알아낼 수가 없습니다.data !== undefined data != null쓸모가 있을지도 모릅니다.

variable"은 " variable" .undefined.

정의되지 않은 변수:

var a;
alert(b); // ReferenceError: b is not defined

이 값있 는변수인 undefined:

var a;
alert(a); // Alerts “undefined”

함수가 인수를 취할 때, 그 값이 다음과 같더라도 그 인수는 항상 선언됩니다.undefined그러면 오류가 발생하지 않습니다.당신 말이 맞아요!= null에 뒤에!== undefined하지만 쓸모가 없습니다.

스크트서에립자바,null는 "값 없음" 신호를 보내는 데 유용한 특수 싱글톤 개체입니다.를 해볼 수처럼 를통수있으테며할, 자크립서것사처럼는하용일로반으에적트비교바해스트스▁to▁the것,처▁you럼▁practice,===혼동되는 유형의 강제를 방지하기 위한 연산자:

var a = null;
alert(a === null); // true

@rynah가 언급했듯이, 자바스크립트에서 "정의되지 않음"은 약간 혼란스럽습니다.그러나, 테스트는 항상 안전합니다.typeof(x)는 "변수가 입니다. "x" 선 "x" 변 " sigma " 문 " 니 " 다 " 입 " 열 " 자 " 가 " 는 " 도 " 에 " 우 " 경 " 가 " 된 " 아 " 닌 " 수 " 언 " " " ▁the " 다 "

alert(typeof(x) === 'undefined'); // true

또한 변수가 초기화되지 않은 경우 "정의되지 않은 값"을 가질 수 있습니다.

var y;
alert(typeof(y) === 'undefined'); // true

이 모든 것을 종합하면, 수표는 다음과 같아야 합니다.

if ((typeof(data) !== 'undefined') && (data !== null)) {
  // ...

그러나 변수 "data"는 형식 함수 매개변수이므로 항상 정의되므로 "type of" 연산자를 사용할 필요가 없으며 "undefined value"와 직접 안전하게 비교할 수 있습니다.

function(data) {
  if ((data !== undefined) && (data !== null)) {
    // ...

이 스니펫은 "만약 함수가 null이 아닌 정의된 인수로 호출되었다면.."

에는 사자의경을 사용합니다.data==null이고 정의되지 않음 - 두행/에 초점을 . null은 null-undefined입니다

function test(data) {
    if (data != null) {
        console.log('Data: ', data);
    }
}

test();          // the data=undefined
test(null);      // the data=null
test(undefined); // the data=undefined

test(0); 
test(false); 
test('something');

모두 표시됩니다(src).

한다면

enter image description here

(부정!=)

enter image description here

(부정!==)

enter image description here

Q: 인수 없이 함수가 호출되어 데이터가 정의되지 않은 변수가 되고 데이터에 오류가 발생했습니다!= null.

A: 네.data정의되지 않음으로 설정됩니다.섹션 10.5 규격의 선언 바인딩 인스턴스화를 참조하십시오.그러나 정의되지 않은 값에 액세스해도 오류가 발생하지 않습니다.당신은 아마도 이것을 오류를 유발하는 엄격한 모드에서 선언되지 않은 변수에 액세스하는 것과 혼동하고 있을 것입니다.

Q: 이 함수는 인수로 null(또는 정의되지 않음)을 지정하여 호출되었으며, 이 경우 data!= null이 이미 내부 코드를 보호하고 &&data!== 정의되지 않음을 렌더링합니다.

Q: 함수가 non-prefix 인수를 사용하여 호출되었으며, 이 경우 != null 및 data!== defined를 모두 사소한 방식으로 전달합니다.

A: 맞습니다.다음 테스트는 동등합니다.

data != null
data != undefined
data !== null && data !== undefined

섹션 11.9.3 참조 추상적 동등성 비교 알고리즘과 섹션 11.9.6 규격의 엄격한 동일성 비교 알고리즘입니다.

typeof foo === "undefined"는 와다다와 .foo === undefined절대 그들을 혼동하지 마세요.typeof foo === "undefined"당신이 정말로 필요로 하는 것입니다.또한, 사용하기!==신에를 !=

그래서 그 진술은 다음과 같이 쓸 수 있습니다.

function (data) {
  if (typeof data !== "undefined" && data !== null) {
    // some code here
  }
}

편집:

당신은 수없다니습할을 사용할 수 .foo === undefined선언되지 않은 변수의 경우.

var t1;

if(typeof t1 === "undefined")
{
  alert("cp1");
}

if(t1 === undefined)
{
  alert("cp2");
}

if(typeof t2 === "undefined")
{
  alert("cp3");
}

if(t2 === undefined) // fails as t2 is never declared
{
  alert("cp4");
}

일반적으로 기대하지 않는 값에 대해 변수를 테스트하는 것은 좋은 생각이 아니라고 생각합니다.왜냐하면 테스트는 금지된 값의 블랙리스트를 작성하는 것으로 간주할 수 있기 때문입니다.하지만 여러분이 모든 금지된 값들을 나열하는 것을 잊는다면 어떨까요?누군가, 심지어 당신조차도 예상치 못한 값을 전달함으로써 당신의 코드를 해독할 수 있습니다.따라서 보다 적절한 접근 방식은 화이트리스트와 같은 것입니다. 즉, 예상치에 대한 변수만 테스트하는 것이지 예상치 않은 값을 테스트하는 것이 아닙니다.예를 들어, 데이터 값이 다음 대신 문자열이 될 것으로 예상하는 경우:

function (data) {
  if (data != null && data !== undefined) {
    // some code here
    // but what if data === false?
    // or data === '' - empty string?
  }
}

다음과 같은 작업을 수행합니다.

function (data) {
  if (typeof data === 'string' && data.length) {
    // consume string here, it is here for sure
    // cleaner, it is obvious what type you expect
    // safer, less error prone due to implicit coercion
  } 
}

테스트를 수행하는 간단한 방법은 다음과 같습니다.

function (data) {
    if (data) { // check if null, undefined, empty ...
        // some code here
    }
}
var a;
alert(a); //Value is undefined

var b = "Volvo"; 
alert(b); //Value is Volvo

var c = null;
alert(c); //Value is null

언급URL : https://stackoverflow.com/questions/16672743/javascript-null-check