2012-03-09 67 views
3

修订版从原来的问题JavaScript对象调查

我想学什么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如果theres字符串字符的结尾太0)

回答

3

也许不是张贴一个问题的答案,但我认为这是一个答案,你的实际的问题::)

安装并公开Chrome的JavaScript控制台(Ctrl + Shift + J)。在那里你可以创建对象并从Javascript调试器直观地检查它们。

> x = "stringystringstring" 
    "stringystringstring" 
> 

然后在右上角,加x到“监视表达式”,以检查它。

正如你所看到的,x作为一个字符串是不是很有意思,所以让我们把它更加复杂:

> x = { a: "b" } 
|> Object 
> 

刷新监视表达式和扩大x看到物体的结构。它应该是这个样子:

v x: Object 
    a: "b" 
    v __proto__: Object 
    |> __defineGetter__: function __defineGetter__()... 
    |> __defineSetter__: function __defineSetter__()... 
    ... 
    |> valueOf: function valueOf() { [native code] } 

我们从中学到了什么是对象x有一个属性,和一堆方法继承从对象的原型。


如果您需要看到所有属性和方法访问例如字符串,在控制台中键入"derp".。半秒后,应显示一个显示所有可用属性的自动完成列表。

+0

谢谢你,这是非常有帮助的答案我一定会从现在开始使用JavaScript控制台。 – 0xor1 2012-03-09 22:19:25

2

你迭代的键首先是"ABC!"。对于每个属性(字母),您都在迭代键(单字母字符串有一个属性),即"0"(键总是字符串)。该字符串包含一个属性,其中包含键"0"(因为它是第一个也是唯一的字符)和值"0"(上一级的键)。你在这个属性上做的事情完全一样,所以你最终会得到一个string 0 0'递归'模式。

我不知道为什么您预计会在2个水平停止,因为字符串"A"仍然可以检查一样"ABC!" - 事实上,如果我理解正确,你的方法永远不会停止。

+0

谢谢,这真的有帮助,我已经改变了循环的价值而不是关键,它仍然产生同样的问题,因为该值也是字符串类型,所以我最终出现了一个无限数量的字符串“0”指向原始字符串中的每个字符:S – 0xor1 2012-03-09 22:19:18

+0

@Danny R:使用该值而不是键将不会真正帮助我猜测,因为'“ABC!”'会产生'“A”', (“ABC”,“contains”,“A”,其中包含“A”,...)。当然,你可以停止使用单字母字符串,但这不是一个令人满意的方法。 – pimvdb 2012-03-09 22:28:05