Creating JS object with Object.create(null)?

前端 未结 5 517
不知归路
不知归路 2020-11-28 01:58

I know a lot of ways to create JS objects but I didn\'t know the Object.create(null)\'s one.

Question:

is it exactly the same as:

5条回答
  •  广开言路
    2020-11-28 02:28

    They are definitely not equivalent. I'm writing this answer to more fully explain why it makes a difference.

    1. var p = {};

      Creates an object that inherits the properties and methods from Object.

    2. var p2 = Object.create(null);

      Creates an object that doesn't inherit anything.

    If you are using an object as a map, and you create an object using method 1 above, then you have to be extra careful when doing lookups in the map. Because the properties and methods from Object are inherited, your code may run into a case where there are keys in the map that you never inserted. For example, if you did a lookup on toString, you would find a function, even though you never put that value there. You can work around that like this:

    if (Object.prototype.hasOwnProperty.call(p, 'toString')) {
        // we actually inserted a 'toString' key into p
    }
    

    Note that it is fine to assign something to p.toString, it will simply override the inherited toString function on p.

    Note that you can't just do p.hasOwnProperty('toString') because you may have inserted a key "hasOwnProperty" into p, so we force it to use the implementation in Object.

    On the other hand, if you use method 2 above, then you won't have to worry about things from Object appearing in the map.

    You can't check for the existence of a property with a simple if like this:

    // Unreliable:
    if (p[someKey]) {
        // ...
    }
    

    The value might be an empty string, might be false, or null, or undefined, or 0, or NaN, etc. To check whether a property exists at all, you would still need to use Object.prototype.hasOwnProperty.call(p, someKey).

提交回复
热议问题