JavaScript null check

前端 未结 8 977
小鲜肉
小鲜肉 2020-12-04 06:20

I\'ve come across the following code:

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


        
相关标签:
8条回答
  • 2020-12-04 06:39

    typeof foo === "undefined" is different from foo === undefined, never confuse them. typeof foo === "undefined" is what you really need. Also, use !== in place of !=

    So the statement can be written as

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

    Edit:

    You can not use foo === undefined for undeclared variables.

    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");
    }
    
    0 讨论(0)
  • 2020-12-04 06:40

    In JavaScript, null is a special singleton object which is helpful for signaling "no value". You can test for it by comparison and, as usual in JavaScript, it's a good practice to use the === operator to avoid confusing type coercion:

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

    As @rynah mentions, "undefined" is a bit confusing in JavaScript. However, it's always safe to test if the typeof(x) is the string "undefined", even if "x" is not a declared variable:

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

    Also, variables can have the "undefined value" if they are not initialized:

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

    Putting it all together, your check should look like this:

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

    However, since the variable "data" is always defined since it is a formal function parameter, using the "typeof" operator is unnecessary and you can safely compare directly with the "undefined value".

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

    This snippet amounts to saying "if the function was called with an argument which is defined and is not null..."

    0 讨论(0)
  • 2020-12-04 06:41

    Q: The function was called with no arguments, thus making data an undefined variable, and raising an error on data != null.

    A: Yes, data will be set to undefined. See section 10.5 Declaration Binding Instantiation of the spec. But accessing an undefined value does not raise an error. You're probably confusing this with accessing an undeclared variable in strict mode which does raise an error.

    Q: The function was called specifically with null (or undefined), as its argument, in which case data != null already protects the inner code, rendering && data !== undefined useless.

    Q: The function was called with a non-null argument, in which case it will trivially pass both data != null and data !== undefined.

    A: Correct. Note that the following tests are equivalent:

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

    See section 11.9.3 The Abstract Equality Comparison Algorithm and section 11.9.6 The Strict Equality Comparison Algorithm of the spec.

    0 讨论(0)
  • 2020-12-04 06:48

    The simple way to do your test is :

    function (data) {
        if (data) { // check if null, undefined, empty ...
            // some code here
        }
    }
    
    0 讨论(0)
  • 2020-12-04 06:51

    I think, testing variables for values you do not expect is not a good idea in general. Because the test as your you can consider as writing a blacklist of forbidden values. But what if you forget to list all the forbidden values? Someone, even you, can crack your code with passing an unexpected value. So a more appropriate approach is something like whitelisting - testing variables only for the expected values, not unexpected. For example, if you expect the data value to be a string, instead of this:

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

    do something like this:

    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
      } 
    }
    
    0 讨论(0)
  • 2020-12-04 06:54
    var a;
    alert(a); //Value is undefined
    
    var b = "Volvo"; 
    alert(b); //Value is Volvo
    
    var c = null;
    alert(c); //Value is null
    
    0 讨论(0)
提交回复
热议问题