从原始问题更新
我试图通过查看它的属性来了解javascript对象的“貌似”:
//create object without prototype
var obj = Object.create(null);
//add properties
obj.a = 3;
obj.b = 76.3;
obj.c = { a : 23 , b : true , c : 1};
obj.s = "ABC!";
//output string
var outStr = new String();
for(var prop in obj)
{
outStr += "Property " + prop + " is a " + typeof(obj[prop]) + " with value " + obj[prop] + "\n";
for(var prop1 in obj[prop])
{
outStr += "Property " + prop1 + " is a " + typeof(obj[prop][prop1]) + " with value " + obj[prop][prop1] + "\n";
for(var prop2 in obj[prop][prop1])
{
outStr += "Property " + prop2 + " is a " + typeof(obj[prop][prop1][prop2]) + " with value " + obj[prop][prop1][prop2] + "\n";
for(var prop3 in obj[prop][prop1][prop2])
{
outStr += "Property " + prop3 + " is a " + typeof(obj[prop][prop1][prop2][prop3]) + " with value " + obj[prop][prop1][prop2][prop3] + "\n";
for(var prop4 in obj[prop][prop1][prop2][prop3])
{
outStr += "Property " + prop4 + " is a " + typeof(obj[prop][prop1][prop2][prop3][prop4]) + " with value " + obj[prop][prop1][prop2][prop3][prop4] + "\n";
}
}
}
}
}
alert(outStr);
提供输出:
Property a is a number with value 3
Property b is a number with value 76.3
Property c is a object with value [object Object]
Property a is a number with value 23
Property b is a boolean with value true
Property c is a number with value 1
Property s is a string with value ABC!
Property 0 is a string with value A
Property 0 is a string with value A
Property 0 is a string with value A
Property 0 is a string with value A
Property 1 is a string with value B
Property 0 is a string with value B
Property 0 is a string with value B
Property 0 is a string with value B
Property 2 is a string with value C
Property 0 is a string with value C
Property 0 is a string with value C
Property 0 is a string with value C
Property 3 is a string with value !
Property 0 is a string with value !
Property 0 is a string with value !
Property 0 is a string with value !
现在,除了String属性obj.s =“ABC!”之外,这个行为完全符合我对每个属性的预期。
我知道obj.s包含属性(键和值):
“0”=“A”
“1”=“B”
“2”=“C”
“3”=“!”
从之前的回答(非常感谢@pimvdb和@deestan)我收集到,因为每个属性值都是字符串,它们每个都包含属性键“0”,其本身必须包含属性键“ 0“等等?这就是我为字符串属性写出额外行的原因。
所以现在我的问题变成了:
在某些时候所有属性的值类型最终是否会恢复为数字或布尔值等原始类型以停止此递归链?我正在考虑实际拥有这个对象的内存,当我开始编写这个小的测试脚本来“查看”对象时,我基本上想要查看所有的基元以及对象如何存储它们,但实际上并不存在无限地将字符串分配给字符串到字符串...我想它只是存储为字符串对象,其中包含4个字符(如果字符串字符的结尾也是5个字符\ 0)
答案 0 :(得分:3)
也许不是发布的问题的答案,但我认为这是对您实际问题的答案::)
安装Chrome并打开Javascript控制台(CTRL + SHIFT + J)。在那里,您可以从Javascript调试器创建对象并以可视方式检查它们。
> x = "stringystringstring"
"stringystringstring"
>
然后在右上角,将x
添加到“观看表达式”以进行检查。
正如您所看到的,x
作为字符串不是很有趣,所以让它变得更复杂:
> x = { a: "b" }
|> Object
>
刷新Watch表达式并展开x
以查看对象结构。看起来应该是这样的:
v x: Object
a: "b"
v __proto__: Object
|> __defineGetter__: function __defineGetter__()...
|> __defineSetter__: function __defineSetter__()...
...
|> valueOf: function valueOf() { [native code] }
我们从中学到的是对象x
有一个属性,而一些方法从Object原型继承。
如果您需要查看所有属性和方法,例如字符串,在控制台中键入"derp".
。半秒后,应显示一个显示所有可用属性的自动完成列表。
答案 1 :(得分:2)
您首先迭代"ABC!"
的键。对于每个属性(字母),您正在迭代键(一个字母的字符串有一个属性),即"0"
(键总是字符串)。此字符串包含一个属性,其中包含键"0"
(因为它是第一个也是唯一一个字符)和值"0"
(前一个级别的键)。你在这个属性上做了完全相同的事情,所以你最终会得到一个string 0 0
'递归'模式。
我不确定为什么你希望在2级之后停止,因为字符串"A"
仍然可以像"ABC!"
一样进行检查 - 事实上,如果我'你的方法永远不会停止我正确地理解你。