【Nodejs 纯 JS 问题】JSON 的 Key 用字符串和不用字符串有什么区别?

【Nodejs 纯 JS 问题】JSON 的 Key 用字符串和不用字符串有什么区别?

比如在 console 里发现:

{a: '1'} == {'a': '1'}的值为false,这是为什么?

是因为是两个对象所以不相等么。。

7 回复

【Nodejs 纯 JS 问题】JSON 的 Key 用字符串和不用字符串有什么区别?

在 JavaScript 中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。理解 JSON 的 Key 用字符串和不用字符串的区别非常重要,这不仅影响数据的表示方式,还会影响数据的解析和比较。

示例代码

const obj1 = {a: '1'};
const obj2 = {'a': '1'};

console.log(obj1 === obj2); // 输出: false

解释

  1. 对象引用

    • 在上面的示例中,obj1obj2 是两个不同的对象实例。尽管它们具有相同的键和值,但它们在内存中的地址是不同的,因此 obj1 === obj2 返回 false
  2. JSON 字符串化

    • 当我们使用 JSON.stringify 方法将对象转换为 JSON 字符串时,对象的键必须是字符串。例如:

      const obj = {a: '1'};
      const jsonString = JSON.stringify(obj);
      console.log(jsonString); // 输出: {"a":"1"}
      
  3. JSON 解析

    • 使用 JSON.parse 方法将 JSON 字符串转换回 JavaScript 对象时,所有的键都会被转换为字符串。例如:

      const jsonString = '{"a": "1"}';
      const parsedObj = JSON.parse(jsonString);
      console.log(parsedObj); // 输出: { a: '1' }
      
  4. 对象字面量中的键

    • 在对象字面量中,如果键是标识符(如 a),可以省略引号。但在 JSON 中,所有的键都必须是字符串,并且必须用双引号包裹。例如:

      {
        "a": "1"
      }
      

总结

  • 在 JavaScript 对象中,键可以是标识符(不需要引号)或字符串(需要引号)。但在 JSON 中,所有的键都必须是字符串。
  • 当使用 ===== 比较两个对象时,它们会比较对象的引用,而不是内容。因此,即使两个对象具有相同的内容,只要它们不是同一个对象实例,比较结果就是 false
  • JSON 的 Key 必须是字符串,并且通常用双引号包裹,以确保数据的正确解析和表示。

好吧。。。 {'a': '1'} == {'a': '1'}也是false。。。看来是这样。。。

你写的是2个对象,对象都是唯一独立的,任何2个对象都是不相等的 引用类型,js基础啊

另外, 不知楼主是混淆了还是问错了, 书写 JSON 与书写 JS 代码是不一样的. JSON 中字典 key 必须写作字符串形式, 并且须以双引号而非单引号引起. 如

JSON.parse('{ a: 1 }')
JSON.parse("{ 'a': 1 }")

都会出错.

而书写 JS 对象才能省去引号 (且仅当字符串内容为 JS 标识符或数值, bool 值时, 部分浏览器支持关键字直接作为 key) 或使用单引号替代双引号引起 key 的内容.

在 js 中,对象时引用类型,而引用类型比较相等的时候,比较的是内存地址,所以即使两个看起来一摸一样的对象,如果内存地址不相等的话,那么也是不等的。另外请参考三楼。

JSON数据本身就是字符串,经过JSON.parse才转化为javascript对象,你在console中输入的是对象,而不是JSON字符串。另外对象的key也可看作是字符串,例如一个对象{1:1},其中的属性名——1实际上是string类型,属性值——1则是number类型

在 JavaScript 中,JSON 对象的键(Key)必须使用字符串。如果你尝试使用其他类型的键,JavaScript 会自动将其转换为字符串。因此,{a: '1'}{'a': '1'} 在 JSON 的语境中实际上是相同的。

但是,如果你直接使用 JavaScript 对象字面量 {a: '1'},这并不是 JSON 格式,而是 JavaScript 对象。在这种情况下,{a: '1'}{a: '1'} 是同一个对象引用,而 {a: '1'}{b: '1'} 是不同的对象,即使它们的键在字符串形式上相同。

具体到你提到的例子:

console.log({a: '1'} == {a: '1'}); // false

这里的 == 操作符比较的是两个对象的引用是否相同,而不是它们的内容。由于这两个对象是在内存中的不同位置,因此引用不同,结果为 false

为了说明这个问题,我们可以通过以下代码来更好地理解:

const obj1 = { a: '1' };
const obj2 = { a: '1' };

console.log(obj1 === obj2); // false,因为它们是不同的对象

// 如果你想比较两个对象的内容,可以使用 JSON.stringify
console.log(JSON.stringify(obj1) === JSON.stringify(obj2)); // true

在这个例子中,obj1obj2 是两个不同的对象,因此它们的引用不同。但它们的内容是相同的,所以我们可以通过 JSON.stringify 将它们转换为字符串进行比较。

回到顶部