다국어를 고려하지 않았을 때

<aside> 💡 charAt은 인덱스에 해당하는 문자열을 반환하고, charCodeAt은 유니코드(0~65535) 값을 반환한다

</aside>

function capitalizeFirstLetter(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

capitalizeFirstLetter('hello world') // Hello world

다국어를 고려했을 때

<aside> 💡 로마자(라틴 문자)에선 점이 있는 소문자 i와 점이 없는 대문자 I가 짝을 이룬다. 반면 터키어, 아제르바이잔어에선 점 없는 문자ı I와, 점 있는 문자 i İ가 짝을 이룬다. Istanbul을 터키어 알파벳으로 적으면 İstanbul이 되는데 첫 글자가 바로 점 있는 대문자다. (참고글)

</aside>

function capitalizeFirstLetter([first, ...rest], locale = navigator.language) {
	return [first.toLocaleUpperCase(locale), ...rest].join('');
}

capitalizeFirstLetter('istanbul', 'en') // 'Istanbul'
capitalizeFirstLetter('istanbul', 'tr') // 'İstanbul' (tr은 터키어의 Locale 값)