我知道以下代码将一个数字包装到一个对象中:
var x = Object(5);
因此,我期望并理解以下内容:
alert(x == 5); //true
alert(x === 5); //false
但是,我也明白一个对象是一个列表 键/值对。所以我希望以下内容有所不同:
alert(JSON.stringify(5)); //5
alert(JSON.stringify(x)); //5
x的结构是什么样的?为什么它看起来不是键/值对格式?
我知道以下代码将一个数字包装到一个对象中:
var x = Object(5);
因此,我期望并理解以下内容:
alert(x == 5); //true
alert(x === 5); //false
但是,我也明白一个对象是一个列表 键/值对。所以我希望以下内容有所不同:
alert(JSON.stringify(5)); //5
alert(JSON.stringify(x)); //5
x的结构是什么样的?为什么它看起来不是键/值对格式?
该 对象构造函数 为给定值创建一个对象包装器,该对象包含与该值对应的Type。
所以你得到了 数字对象 传递数字时的原始值为5 Object
var x = Object(5);
它和做的完全一样
var x = new Number(5);
打电话的时候 的价值() 在两者上,你得到原始价值 5
再次回来,这就是为什么字符串化它给字符串化数字的原因 5
,在字符串化之前将对象转换为它的原始值
规范 JSON.stringify
说
根据传统的转换语义,在字符串化期间将Boolean,Number和String对象转换为相应的原始值。
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
在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”。您将对象和基元都转换为字符串,这就是它们相等的原因。