Делаем просто, ровно то, что спрошено:
str.replace(/.{4}(?!$)/g, '$&-')
Делаем сложно:
chunked(str, 4).join('-')
Спросите, в чём тут сложность? В том, что функцию нарезания на куски массивоподобных объектов нам придётся изготовить самостоятельно:
const chunked = (data, chunkSize, slice = data.slice) =>
Array.from(
{ length: Math.ceil(data.length / chunkSize) },
function(_, i) {
return this(i * chunkSize, (i + 1) * chunkSize);
},
(slice instanceof Function ? slice : Array.prototype.slice).bind(data)
);