我理解以下代码将数字包装到对象中:
var x = Object(5);
因此,我期待并理解以下内容:
alert(x == 5); //true
alert(x === 5); //false
但是,我也理解对象是键/值对的列表。所以我希望以下内容有所不同:
alert(JSON.stringify(5)); //5
alert(JSON.stringify(x)); //5
x的结构是什么样的?为什么它看起来不是键/值对格式?
答案 0 :(得分:11)
Object constructor为给定值创建一个对象包装器,该对象包含与该值对应的Type。
因此,在将数字传递给Object
var x = Object(5);
与做
完全一样var x = new Number(5);
在两者上调用valueOf()时,会再次返回原始值5
,这就是为什么对其进行字符串化与将数字5
字符串化相同,对象将转换为它的原因在字符串化之前的原始值
JSON.stringify
的规范说
在字符串化过程中,Boolean,Number和String对象将转换为相应的原始值,符合传统的转换语义。
答案 1 :(得分:0)
var x = Object(5);
这个框5作为一个对象,所以Stringify只是取消了这个值。
如果为对象指定键/值,Stringify将显示为:
var x = {};
x.foo = "bar";
这是javascript鸭子打字 - 基本上如果它看起来像鸭子,听起来像鸭子,它必须是鸭子然而用数据类型替换鸭子,例如int或集合。 .https://en.m.wikipedia.org/wiki/Duck_typing
答案 2 :(得分:0)
在javascript控制台中,我输入了以下内容:
> var x = Object(5);
> x
[Number: 5]
> JSON.stringify(5)
'5'
> JSON.stringify(x)
'5'
使用Object(5)
时,您正在创建一个具有键/值对的对象。但是,JSON.stringify()
正在将该对象转换为字符串表示形式 - “5”。在原始数字5之类的文字值上调用JSON.stringify()
也会返回它的字符串表示形式 - “5”。您将对象和基元都转换为字符串,这就是它们相等的原因。