【问题标题】:A map created with Object.create(null) has toString property使用 Object.create(null) 创建的地图具有 toString 属性
【发布时间】:2018-07-11 01:48:08
【问题描述】:

我正在阅读 Eloquent JavaScript (https://eloquentjavascript.net/),在第 6 章中,Marjin Haverbeke 建议创建我们自己的地图版本的一种方法是使用 Object.create(null)。书中给出的例子是

console.log("toString" in Object.create(null)); //null

我尝试使用这种方法创建地图。这是我所做的:

let ages = Object.create(null); 
ages = {Boris : 29, Liang : 22, > Julia : 62};
console.log("Do we know toString's age?", 'toString' in ages);
//returns true

我希望最后一个 console.log 返回 false,但它返回 true。为什么是这样?如何使用这个想法来创建一个不继承 toString 属性的地图? 注意:我模糊地知道地图数据类型,但我试图弄清楚这一点以便理解概念。

【问题讨论】:

    标签: javascript object prototype


    【解决方案1】:

    重新分配 ages 到一个对象字面量,该字面量确实继承了toString。在重新分配ages 变量后,通过Object.create(null) 创建的对象不再具有任何引用。如果您没有重新分配 ages 并简单地为其分配属性,则它不会像您所期望的那样具有 toString 属性:

    const ages = Object.create(null); 
    Object.assign(ages, {Boris : 29, Liang : 22, Julia : 62});
    console.log("Do we know toString's age?", 'toString' in ages);
    
    // similarly:
    
    const ages2 = Object.create(null);
    ages2.Boris = 29;
    ages2.Liang = 22;
    ages2.Julia = 62;
    console.log("Do we know toString's age?", 'toString' in ages);

    【讨论】:

      【解决方案2】:

      使用以下行,您正在重新创建一个对象:

       ages = {Boris : 29, Liang : 22, > Julia : 62};
      

      我想你想做的是以下几点:

       ages = Object.create(null); 
       ages.Boris = 29;
       ages.Liang = 22;
       ages.Julia = 62;
       console.log("Do we know toString's age?", 'toString' in ages); // => false
      

      问候, 文森特

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-17
        • 1970-01-01
        • 2019-10-17
        相关资源
        最近更新 更多