You could use recursion to reverse a string without converting the string to an array.
This code will basically slice the last character from the input string and append it to the accumulator, it will continue calling itself until the input string no longer has any characters where it will return the accumulator string.
As a bonus it's tail recursive so in modern browsers you could process a string of any size.
As alluded to above, strings are immutable so you won't get the same string out as you put in but you probably don't need to worry about that.
const reverse= (xs, acc = '') =>
!xs.length
? acc
: reverse(
xs.slice(0, -1), // get the start of the string
acc.concat(xs.slice(-1)) // append the end of the string to the accumulator
)
console.log(
reverse('.gnirts rotalumucca eht nruter lliw ti erehw sretcarahc yna sah regnol on gnirts tupni eht litnu flesti gnillac eunitnoc lliw ti ,rotalumucca eht ot ti dneppa dna gnirts tupni eht morf retcarahc tsal eht ecils yllacisab lliw edoc sihT')
)
console.log(
// you can even use it on an array if you change the accumulator to an array
reverse(['one', 'two', 'three'], [])
)
console.log(
// or you could put it into an array
reverse('reverse', [])
)