Why is null an object and what's the difference between null and undefined?

后端 未结 22 1305
猫巷女王i
猫巷女王i 2020-11-22 02:58

Why is null considered an object in JavaScript?

Is checking

if ( object == null )
      Do something

the

22条回答
  •  挽巷
    挽巷 (楼主)
    2020-11-22 03:50

    null is not an object, it is a primitive value. For example, you cannot add properties to it. Sometimes people wrongly assume that it is an object, because typeof null returns "object". But that is actually a bug (that might even be fixed in ECMAScript 6).

    The difference between null and undefined is as follows:

    • undefined: used by JavaScript and means “no value”. Uninitialized variables, missing parameters and unknown variables have that value.

      > var noValueYet;
      > console.log(noValueYet);
      undefined
      
      > function foo(x) { console.log(x) }
      > foo()
      undefined
      
      > var obj = {};
      > console.log(obj.unknownProperty)
      undefined
      

      Accessing unknown variables, however, produces an exception:

      > unknownVariable
      ReferenceError: unknownVariable is not defined
      
    • null: used by programmers to indicate “no value”, e.g. as a parameter to a function.

    Examining a variable:

    console.log(typeof unknownVariable === "undefined"); // true
    
    var foo;
    console.log(typeof foo === "undefined"); // true
    console.log(foo === undefined); // true
    
    var bar = null;
    console.log(bar === null); // true
    

    As a general rule, you should always use === and never == in JavaScript (== performs all kinds of conversions that can produce unexpected results). The check x == null is an edge case, because it works for both null and undefined:

    > null == null
    true
    > undefined == null
    true
    

    A common way of checking whether a variable has a value is to convert it to boolean and see whether it is true. That conversion is performed by the if statement and the boolean operator ! (“not”).

    function foo(param) {
        if (param) {
            // ...
        }
    }
    function foo(param) {
        if (! param) param = "abc";
    }
    function foo(param) {
        // || returns first operand that can't be converted to false
        param = param || "abc";
    }
    

    Drawback of this approach: All of the following values evaluate to false, so you have to be careful (e.g., the above checks can’t distinguish between undefined and 0).

    • undefined, null
    • Booleans: false
    • Numbers: +0, -0, NaN
    • Strings: ""

    You can test the conversion to boolean by using Boolean as a function (normally it is a constructor, to be used with new):

    > Boolean(null)
    false
    > Boolean("")
    false
    > Boolean(3-3)
    false
    > Boolean({})
    true
    > Boolean([])
    true
    

提交回复
热议问题