问题 理解JavaScript对象(值)


我知道以下代码将一个数字包装到一个对象中:

var x = Object(5);

因此,我期望并理解以下内容:

alert(x == 5); //true
alert(x === 5); //false

但是,我也明白一个对象是一个列表 键/值对。所以我希望以下内容有所不同:

alert(JSON.stringify(5)); //5
alert(JSON.stringify(x)); //5

x的结构是什么样的?为什么它看起来不是键/值对格式?


8255
2018-01-03 20:31


起源

这里的问题是。的行为 JSON.stringify(), 是对的吗? - Pointy
我不确定。我想我的定义是所有对象都是字面意义上的键/值对,因此,预期键/值对格式。 - Sandy
那就是我的意思;来自的输出 JSON.stringify() 在您的问题中,该特定API的工作原理。它明确地理解Number实例应该被视为生成的JSON中的数值。 - Pointy
类似地,String实例被视为字符串基元,布尔实例被视为布尔基元。 - Pointy
但....对象仍然有键/值对,Number对象有一个 primitiveValue 属性,值是 5,就像Pointy解释的那样,一些API理解“常规”对象与仅保持原始值的对象之间的区别。 - adeneo


答案:


对象构造函数 为给定值创建一个对象包装器,该对象包含与该值对应的Type。

所以你得到了 数字对象 传递数字时的原始值为5 Object

var x = Object(5);

它和做的完全一样

var x = new Number(5);

打电话的时候 的价值() 在两者上,你得到原始价值 5 再次回来,这就是为什么字符串化它给字符串化数字的原因 5,在字符串化之前将对象转换为它的原始值

规范 JSON.stringify 说

根据传统的转换语义,在字符串化期间将Boolean,Number和String对象转换为相应的原始值。


11
2018-01-03 20:43



所以下面的返回false是因为它是一个不同的实例? var x = Object(5); var y = new Number(5);警报(x === y); - Sandy
@Sandy - 是的,当直接和严格比较时,它仍然是对象,两个对象永远不会相同 - adeneo


var x = Object(5);

这个框5作为一个对象,所以Stringify只是取消了这个值。

如果为对象指定键/值,则Stringify将显示为:

var x = {};
x.foo = "bar";

这是javascript Duck Typing - 基本上 如果它看起来像一只鸭子,听起来像一只鸭子,它一定是鸭子 但是用数据类型替换duck,例如int或collection ... https://en.m.wikipedia.org/wiki/Duck_typing


0
2018-01-03 20:46





在javascript控制台中,我输入以下内容:

> var x = Object(5);
> x
[Number: 5]
> JSON.stringify(5)
'5'
> JSON.stringify(x)
'5'

当你使用 Object(5),您正在创建一个具有键/值对的对象。然而, JSON.stringify() 正在将该对象转换为它的字符串表示 - “5”。调用 JSON.stringify() 在像原始数字5这样的文字值上也返回它的字符串表示 - “5”。您将对象和基元都转换为字符串,这就是它们相等的原因。


0
2018-01-03 20:48