Решение с тестами https://plnkr.co/edit/21ZpBDaIF3H2YPPDvbC3?p=preview
Ответ
В данном случае ... - это не оператор расширения, а синтаксис для определения rest-параметров
Поэтому piece внутри функции является массивом, и при приведении массива к строке действуют другие правила, а именно: если элемент null или undefined, то вместо него на выходе будет пустая строка.
Так как в тесте вызывается buffer(null);, внутри функции piece=== [null]
И при приведении к строке этого массива получается пустая строка
Кроме того, если в функцию буфер передать несколько параметров, то на выходе они будут через запятую.
Если предполагается наличие только одного параметра, нет нужды использовать rest-параметры, достаточно явно описать один параметр.
Если предполагается возможность передавать несколько параметров, и поведение осталось прежним стоит изменить функцию makeBuffer работая внутри нее с piece как с массивом, например так:
function makeBuffer() {
let text = '';
//используем деструктивные параметры
return function(...piece) {
if (piece.length == 0) { // вызов без аргументов
return text;
}
text += piece.map(el=>el+'').join('');
};
};
let buffer;
beforeEach(function() {
buffer = makeBuffer();
});
it("возвращает пустую строку по умолчанию", function() {
assert.strictEqual(buffer(), "");
});
it("добавляет аргументы в буффер", function() {
buffer('Замыкания');
buffer(' Использовать');
buffer(' Нужно!');
assert.equal(buffer(), 'Замыкания Использовать Нужно!');
});
it("приводит всё к строке", function() {
buffer(null);
buffer(false);
assert.equal(buffer(), "nullfalse");
});
it("добавляет аргументы в буффер, несколько аргументов", function() {
buffer('Замыкания',' ','Использовать');
buffer(' ','Нужно!');
assert.equal(buffer(), 'Замыкания Использовать Нужно!');
});
Комментариев нет:
Отправить комментарий