Проблемы с пониманием теста отражения в Javascript Koans - PullRequest
5 голосов
/ 17 февраля 2012

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

Часть теста , которая доставляет мне неприятности:

var keys = [];
var fruits =  ['apple', 'orange'];
for(propertyName in fruits) {
    keys.push(propertyName);
}
ok(keys.equalTo(['__', '__', '__']), 'what are the properties of the array?');

(очевидно) правильный ответ, как отмечено в приведенном выше связанном вопросе:

ok(keys.equalTo(['0', '1', 'fruits.prototype'), 'what are the properties of the array?');

Я попытался вставить ответ - исправил синтаксическую ошибку - и мой тест по-прежнему не проходит.

В том же файле теста другой тест почти идентичен, и ответ такой, какой я ожидал:

test("property enumeration", function() {
    var keys = [];
    var values = [];
    var person = {name: 'Amory Blaine', age: 102, unemployed: true};
    for(propertyName in person) {
        keys.push(propertyName);
        values.push(person[propertyName]);
    }
    ok(keys.equalTo(['name','age','unemployed']), 'what are the property names of the object?');
    ok(values.equalTo(['Amory Blaine',102,true]), 'what are the property values of the object?');
});

Единственное различие, которое я вижу между этими двумя тестами, заключается в том, что второй использует объект, а не массив.

Я запускал код из первого теста сам (внеструктуры модульного тестирования) и выведите значение ключей, которое было показано как ["0","1"] - что я и ожидал.Где находится это скрытое третье значение и как я могу получить к нему доступ?

Итак, я полагаю, что в конечном итоге у меня есть два вопроса:

  1. Почему ответ на другой вопрос не работает длямне?
  2. Чем отличается первый тест от второго?

1 Ответ

2 голосов
/ 17 февраля 2012

Отказ от ответственности: я почти уверен, что это правильно, но не потрудился проверить это.Не могли бы вы попробовать мой ответ, поскольку у вас запущены тесты?

При просмотре файлов на GitHub, существует вспомогательный скрипт с именем koan.js.Я предполагаю, что это загружается перед тестами, потому что я слишком ленив, чтобы запустить их самостоятельно: P.(Он находится в каталоге support.)

В этом файле есть метод с именем equalTo, определенный для всех массивов:

Array.prototype.equalTo = function(compareTo) { ... }

Итак, ответы на ваши вопросы:

  1. Потому что ответ на другой вопрос был неправильным.Совершенно ошибочно.И т. Д.
  2. Поскольку метод определен для Array, а не Object.

Кажется немного подавленным.

Если вы определили функцию какэто на прототипе, он будет наследоваться всеми массивами.Попробуйте определить что-то подобное в консоли и затем оцените [].equalTo.А затем, для большего удовольствия, попробуйте что-то вроде:

for (x in []) console.log(x)

Поскольку этот метод определен в прототипе, цикл также проходит по нему.Таким образом, ответ на тест, вероятно, 0, 1, 'equalTo'.Однако, если вы используете цикл for с проверкой hasOwnProperty, он, естественно, не будет перебирать метод.

Это действительно объектный урок о том, что не нужно использовать for in для перебора массивов :).Вы никогда не знаете, что произойдет ... По совпадению, именно поэтому prototype.js потерял популярность, несмотря на то, что на самом деле был хорошим фреймворком.

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