function makeBuffer() {
let str = '';
return function(...rest) {
if (rest.length === 0) {
return str;
}
str += rest;
str.toString();
};
};
;(function () {
let buffer;
beforeEach(function() {
buffer = makeBuffer();
});
it("приводит всё к строке", function() {
buffer(null);
buffer(false);
assert.equal(buffer(), "nullfalse");
});
})()
var buffer = makeBuffer();
buffer('Расстояние');
buffer(' до');
buffer(' Луны');
console.log(buffer());
<html>
<head>
<meta charset="utf-8">
<script src="https://js.cx/test/libs.js"></script>
</head>
<body>
</body>
</html>
На самом деле, при приведении массива, содержащего null в качестве элементов, вместо строки "null" вы получаете пустую строку:
console.log('' === ('' + [null])); // true
console.log(',' === ('' + [null, null])); // true
Происходит это потому, что метод Array.prototype.join (который фактически вызывается для приведения массива к строке) преобразует null и undefined в пустую строку.
Как следствие, вместо автоматического преобразования массива в строку:
str += rest;
Вам следовало бы обрабатывать элементы массива rest вручную:
function makeBuffer() {
let str = '';
return function(...rest) {
if (rest.length === 0) {
return str;
}
str += rest.map(item => '' + item);
};
};
Замечание
Еще более любопытные результаты вы получили бы, если бы скормили вашей исходной функции buffer более одного аргумента:
buffer('Расстояние');
buffer(' до', ' Луны');
console.log(buffer()); // "Расстояние до, Луны"
Этот факт тоже очевиден, если вспомнить, что для прведения массива к строке используется Array.prototype.join без аргументов.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости