Javascript Объект исследования - PullRequest
3 голосов
/ 09 марта 2012

ОБНОВЛЕНО ИЗ ОРИГИНАЛЬНОГО ВОПРОСА

Я пытаюсь узнать, как «выглядит» объект 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);

output:

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» и т. д., и т. д.?вот почему я получаю дополнительные строки, записанные для свойства string.

Поэтому мой вопрос теперь звучит так:

Должен ли тип значения всех свойств в какой-то момент в конечном итоге вернуться к примитивувведите число или логическое значение, чтобы остановить эту рекурсивную цепочку?Я думаю о памяти, которая на самом деле содержит этот объект, и когда я начал писать этот небольшой тестовый скрипт, чтобы «посмотреть» на объект, я в основном хотел увидеть все примитивы и то, как объект хранит их, но на самом деле не может бытьбесконечное распределение строки в строку в строку ... Я представляю, что он просто хранится как строковый объект с его 4 символами (или 5, если есть и конец символа строки \ 0)

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Возможно, это не ответ на вопрос в том виде, в котором он был опубликован, но я считаю, что это ответ на вашу актуальную проблему::)

Установите Chrome и откройте консоль Javascript (CTRL + SHIFT + J).Там вы можете создавать объекты и проверять их визуально из отладчика Javascript.

> x = "stringystringstring"
  "stringystringstring"
>

Затем в правом верхнем углу добавьте x к "Watch Expressions", чтобы проверить его.

Как выможно видеть, что 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". в консоли.Через полсекунды должен появиться список автозаполнения со всеми доступными свойствами.

2 голосов
/ 09 марта 2012

Сначала вы перебираете ключи "ABC!".Для каждого свойства (буквы) вы выполняете итерацию ключа (есть одно свойство для однобуквенной строки), равное "0" (ключи всегда являются строками).Эта строка содержит одно свойство, которое имеет ключ "0" (потому что это первый и единственный символ) и значение "0" (ключ предыдущего уровня).Вы делаете то же самое с этим свойством, поэтому вы получите шаблон string 0 0 'recursion'.

Я не уверен, почему вы ожидаете остановиться после 2 уровней, потому чтоСтрока "A" все еще может быть проверена так же, как и "ABC!" - фактически ваш метод никогда не остановится, если я вас правильно понимаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...