Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

используя оператор расширения не проходит тест преобразовать к строке





Решение с тестами 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(), 'Замыкания Использовать Нужно!'); });

Комментариев нет:

Отправить комментарий