【Nodejs 纯 JS 问题】JSON 的 Key 用字符串和不用字符串有什么区别?
【Nodejs 纯 JS 问题】JSON 的 Key 用字符串和不用字符串有什么区别?
比如在 console 里发现:
{a: '1'} == {'a': '1'}
的值为false
,这是为什么?
是因为是两个对象所以不相等么。。
【Nodejs 纯 JS 问题】JSON 的 Key 用字符串和不用字符串有什么区别?
在 JavaScript 中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。理解 JSON 的 Key
用字符串和不用字符串的区别非常重要,这不仅影响数据的表示方式,还会影响数据的解析和比较。
示例代码
const obj1 = {a: '1'};
const obj2 = {'a': '1'};
console.log(obj1 === obj2); // 输出: false
解释
-
对象引用:
- 在上面的示例中,
obj1
和obj2
是两个不同的对象实例。尽管它们具有相同的键和值,但它们在内存中的地址是不同的,因此obj1 === obj2
返回false
。
- 在上面的示例中,
-
JSON 字符串化:
-
当我们使用 JSON.stringify 方法将对象转换为 JSON 字符串时,对象的键必须是字符串。例如:
const obj = {a: '1'}; const jsonString = JSON.stringify(obj); console.log(jsonString); // 输出: {"a":"1"}
-
-
JSON 解析:
-
使用
JSON.parse
方法将 JSON 字符串转换回 JavaScript 对象时,所有的键都会被转换为字符串。例如:const jsonString = '{"a": "1"}'; const parsedObj = JSON.parse(jsonString); console.log(parsedObj); // 输出: { a: '1' }
-
-
对象字面量中的键:
-
在对象字面量中,如果键是标识符(如
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
在这个例子中,obj1
和 obj2
是两个不同的对象,因此它们的引用不同。但它们的内容是相同的,所以我们可以通过 JSON.stringify
将它们转换为字符串进行比较。