【问题标题】:Do JSON Objects which contain custom keys as objects work?包含自定义键作为对象的 JSON 对象是否有效?
【发布时间】:2020-04-03 14:43:45
【问题描述】:

据我所知,javascript 允许任何类型的对象内的键的值,例如:

{
  key1: "string",
  key2: ["list"],
  key3: 123,
  key4: { name: "string embedded in an object in another object"}
}

但它只允许某些特定类型的键,如字符串和整数: { “字符串”:“字符串”, 123:“整数” }

我在编写以下代码时遇到了这个问题,关键是:[object Object]

let a = {}
let b = {}

b.name = {name: "name"}

a[b.name] = "value"

console.log(JSON.stringify(a))

上面的结果:

{"[object Object]":"value"}

那么 js 中的对象中的键允许哪些类型? 为什么它显示键为[object Object]?

【问题讨论】:

标签: javascript json nodes


【解决方案1】:

您正在混合两个不同的概念。 JSON 和 JavaScript 对象虽然相似,但并不相同。你可以阅读the difference between JSON and the Object Literal Notation。

为什么它把键显示为[object Object]?

因为键只能是字符串或符号。任何其他值都被强制转换为字符串(例如,如果可用,则调用该值的 toString 方法)。 ({}).toString() 返回“[object Object]”`。

如果你想使用对象作为键,你可以使用Map。

【讨论】:

    【解决方案2】:

    如果您尝试运行它,它将输出 value,如果您打印密钥类型,它将是 string

    let a = {}
    let b = {}
    
    b.name = {name: "name"}
    
    a[b.name] = "value"
    
    console.log(a['[object Object]'])
    for (key in a) {
        console.log(typeof key);
        //-> "string"
    }
    

    Javascript 在保存之前将键设为字符串。

    之前已经回答过类似问题:https://stackoverflow.com/a/3608275/12703377

    【讨论】:

      【解决方案3】:

      对象的键只能是字符串或符号。当您将对象放入[] 运算符时,该对象的字符串表示将用作键。

      let a = {}
      let b = {
          toString: function(){return "B string representation"}
      }
      a['attribute'] = 'value'
      a[b] = 'value'
      a[2] = 'value'
      Object.keys(a)
      

      结果

      (3) ["2", "attribute", "B string representation"]
      

      关闭您的问题...查看您的代码,您可能想要做的是

      let a = {}
      let b = {}
      b.name = "name"
      a[b.name] = "value"
      console.log(JSON.stringify(a))
      

      【讨论】:

        猜你喜欢
        • 2019-03-31
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 2013-10-22
        • 1970-01-01
        相关资源
        最近更新 更多