2014-11-21 2 views
0

Как файл node.js REPL строит объекты, которые он печатает? Я стал любопытным после запуска в этой причуде с массивом, содержащим ключ-значение пары (?!):Как файл node.js REPL строит вывод?

> var arr = [1] 
undefined 
> arr 
[ 1 ] 
> arr.key = "value" 
'value' 
> arr 
[ 1, key: 'value' ] 

Типичные функции, кажется, не порождающим точно [ 1, key: 'value' ].

> arr.toString() 
'1' 
> JSON.stringify(arr) 
'[1]' 
> require("util").inspect(arr, {showHidden: true}) 
'[ 1, [length]: 1, key: \'value\' ]' 

Последнее один почти что, но имеет дополнительный [length] (уточнить, котировки, очевидно, не имеет значения). Я запускаю узел v0.10.33.

+0

это только специальный чехол для чего 'util.ispect' возврат. 'util.inspect' возвращает вам строку, но REPL показывает, что« как есть » –

ответ

2

Вы почти там; util.inspect возвращает строку и вызывается без showHidden:

> require("util").inspect(arr) 
'[ 1, key: \'value\' ]' 
> console.log(require("util").inspect(arr)) 
[ 1, key: 'value' ] 

При входе строки в консоль, он будет обернут в кавычках, но console.log не делает этого. Написать «выход S в файл, если вы хотите, чтобы убедиться, что он точно такой же, как и console.log» inspect выход s:

> require("fs").writeFileSync("dump.txt", require("util").inspect(arr)); 

В консоли:

$ cat dump.txt 
[ 1, key: 'value' ] 

Что касается первого пункта:

массив, содержащий пары ключ-значение (?!):

Это не то, что странно - массивы - это объекты, поэтому это совершенно верно. Но это может смущать других людей, которые смотрят на ваш код. :-)

Делать это не сильно отличается от этого:

var fn = function() {} 
fn.key = "value"; 

Это будет выглядеть так же, как ваш пример массива, если вы должны были войти в этом.

+0

также функция уже имеет некоторые значения ключа:' (function foo() {}). name' –

+0

Да, но вы увидите только те, вы передаете '{showHidden: true}' для 'проверки'. – RikkusRukkus

+0

«скрытый» - что это? ключи от прототипов? –