2012-04-21 1 views
4

Мой вопрос такой же, как Are Javascript arrays sparse? с одной разницей ...Являются ли массивы JavaScript/ECMAScript «разреженными» в Node.js?

ли JavaScript массивы разреженными, как это реализовано в Node.js (и/или V8)? Я взяла на себя были, но тогда я сделал следующее испытание:

var testArray = []; 
testArray[10000] = 'test'; 
console.log(testArray); 

Возвращается 10000 пустые элементы, с «тестом» в конце. Это из-за того, как работает отладочный вывод, или Node.js фактически выделяет память для неопределенных элементов массива при добавлении новых элементов?

+1

Консоль не является частью языка. Как консоль решает представить что-то, не влияет на то, что это на самом деле. –

+0

@amnotiam, я понимаю, что именно поэтому мой вопрос заключается в том, был ли вывод консоли, который я видел, из-за форматирования консоли или того, как объект был фактически сохранен. Деннис ответил на этот вопрос. – Brad

ответ

2

Утилита util.inspect узла специально проверяет разреженные массивы, чтобы печатать их так. Фактически, он имеет a test that specifically checks for it. Я знаю это, потому что мой полный пересмотр инспектору узла в конечном счете не сделал его ядром и привел к моему UltraREPL.

+0

Хороший инструмент! Я обязательно загружу его. И, спасибо за ваш ответ и ссылку на модульный тест. – Brad

5

Что вы видите, это не фактический массив, а просто представление. Консоль проверяет наличие свойства length и splice и печатает числовые свойства объекта, поэтому коллекции jQuery представляются массивами при регистрации.

function RandomThingThatIsDefinitelyNotAnArray() { 
    this.splice = function() {}; 
    this.length = 10; 
    this[5] = 5; 
} 

console.log(new RandomThingThatIsDefinitelyNotAnArray());​ 
// shows [undefined, undefined, undefined, undefined, undefined, 5] 

jsfFiddle для живой демонстрации.

+0

+1 Я хотел бы узнать больше. есть ли у вас какие-либо рекомендации относительно того, почему он возвращает структуру, подобную массиву, вместо объекта? являются 'length' и' splice' единственными вещами, необходимыми для создания подобной массиву структуры массива? – Joseph

+1

Структура на самом деле не отличается от внутренней, консоль просто отображает ее по-разному. [Найти isArray] (http://fbug.googlecode.com/svn/lite/brands/firebug1.4/build/firebug-lite-debug.js), чтобы увидеть квалификацию для Array-like, поскольку консоль обеспокоен. Это код Firebug, но, насколько мне известно, Chrome использует те же критерии. – Dennis

 Смежные вопросы

  • Нет связанных вопросов^_^