Почему не преобразуется к строке?

263
27 мая 2017, 18:20

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>

Answer 1

На самом деле, при приведении массива, содержащего 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 без аргументов.

READ ALSO
jQuery Validate и неактивная кнопка отправки

jQuery Validate и неактивная кнопка отправки

Доброго времени суток, друзьяПодскажите пожалуйста можно ли в jQuery Validate создать условие по которому если хоть один инпут невалиден, то кнопка...

436
Intellisense для requirejs модулей в visual studio 2017

Intellisense для requirejs модулей в visual studio 2017

А в 2017 поддержку _referencesjs выпилили и подсветка обычных js файлов работает только если подсунуть системе d

285