νμ€ λΉνΈμΈ κ°μ²΄μΈ String κ°μ²΄λ μμ±μ ν¨μ κ°μ²΄μ΄λ€. λ°λΌμ new μ°μ°μμ ν¨κ» νΈμΆνλ©΄ String μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
const strObj = new String();
console.log(strObj); // String {length: 0, [[PrimitiveValue]]: ""}
String μμ±μ ν¨μμ μΈμλ₯Ό μ λ¬νμ§ μκ³ new μ°μ°μμ ν¨κ» νΈμΆνλ©΄ [[StringData]] λ΄λΆ μ¬λ‘―μ λΉ λ¬Έμμ΄μ ν λΉν String λνΌ κ°μ²΄λ₯Ό μμ±νλ€.
const strObj = new String('Lee');
console.log(strObj);
// String {0: "L", 1: "e", 2: "e", length: 3, [[PrimitiveValue]]: "Lee"}
String μμ±μ ν¨μμ μΈμλ‘ λ¬Έμμ΄μ΄ μλ κ°μ μ λ¬νλ©΄ μΈμλ₯Ό λ¬Έμμ΄λ‘ κ°μ λ³νν ν, [[StringData]] λ΄λΆ μ¬λ‘―μ λ³νλ λ¬Έμμ΄μ ν λΉν String λνΌ κ°μ²΄λ₯Ό μμ±νλ€.
let strObj = new String(123);
console.log(strObj);
// String {0: "1", 1: "2", 2: "3", length: 3, [[PrimitiveValue]]: "123"}
strObj = new String(null);
console.log(strObj);
// String {0: "n", 1: "u", 2: "l", : "l", length: 4, [[PrimitiveValue]]: "null"}
new μ°μ°μλ₯Ό μ¬μ©νμ§ μκ³ String μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ String μΈμ€ν΄μ€κ° μλ λ¬Έμμ΄μ λ°ννλ€. μ΄λ₯Ό μ΄μ©ν΄ λͺ μμ μΌλ‘ νμ λ³νμ΄ κ°λ₯νλ€.
// μ«μ νμ
=> λ¬Έμμ΄ νμ
String(1); // -> "1"
String(NaN); // -> "NaN"
String(Infinity); // -> "Infinity"
// λΆλ¦¬μΈ νμ
=> λ¬Έμμ΄ νμ
String(true); // -> "true"
String(false); // -> "false"
length νλ‘νΌν°λ λ¬Έμμ΄μ κ°μλ₯Ό λ°ννλ€.
'Hello'.length; // -> 5
'μλ
νμΈμ!'.length; // -> 6
String λνΌ κ°μ²΄λ λ°°μ΄κ³Ό λ§μ°¬κ°μ§λ‘ length νλ‘νΌν°λ₯Ό κ°λλ€. κ·Έλ¦¬κ³ μΈλ±μ€λ₯Ό λνλ΄λ μ«μλ₯Όνλ‘νΌν° ν€λ‘, κ° λ¬Έμλ₯Ό νλ‘νΌν° κ°μΌλ‘ κ°μ§λ―λ‘ String λνΌ κ°μ²΄λ μ μ¬ λ°°μ΄ κ°μ²΄λ€.
String κ°μ²΄μλ λ°°μ΄κ°μ²΄μ λ¬λ¦¬ μλ³Έ String λνΌ κ°μ²΄λ₯Ό μ§μ λ³κ²½νλ λ©μλλ μ‘΄μ¬νμ§ μλλ€.μ¦, String κ°μ²΄μ λ©μλλ μΈμ λ μλ‘μ΄ λ¬Έμμ΄μ λ°ννλ€. λ¬Έμμ΄μ λ³κ²½ λΆκ°λ₯ν μμ κ°μ΄κΈ° λλ¬Έμ String λνΌ κ°μ²΄λ μ½κΈ° μ μ© κ°μ²΄λ‘ μ 곡λλ€.
const strObj = new String('Lee');
console.log(Object.getOwnPropertyDescriptors(strObj));
/* String λνΌ κ°μ²΄λ μ½κΈ° μ μ© κ°μ²΄λ€. μ¦, writable νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ κ°μ΄ falseλ€.
{
'0': { value: 'L', writable: false, enumerable: true, configurable: false },
'1': { value: 'e', writable: false, enumerable: true, configurable: false },
'2': { value: 'e', writable: false, enumerable: true, configurable: false },
length: { value: 3, writable: false, enumerable: false, configurable: false }
}
*/
indexOf λ©μλλ λμ λ¬Έμμ΄(λ©μλλ₯Ό νΈμΆν λ¬Έμμ΄)μμ μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄μ κ²μνμ¬ μ²« λ²μ§Έ μΈλ±μ€λ₯Ό λ°ννλ€. κ²μμ μ€ν¨νλ©΄ -1μ λ°ννλ€. λλ²μ§Έ μΈμλ‘ κ²μμ μμν μΈλ±μ€λ₯Ό μ λ¬ν μ μλ€.
const str = 'Hello World';
// λ¬Έμμ΄ strμμ 'l'μ κ²μνμ¬ μ²« λ²μ§Έ μΈλ±μ€λ₯Ό λ°ννλ€.
str.indexOf('l'); // -> 2
// λ¬Έμμ΄ strμμ 'or'μ κ²μνμ¬ μ²« λ²μ§Έ μΈλ±μ€λ₯Ό λ°ννλ€.
str.indexOf('or'); // -> 7
// λ¬Έμμ΄ strμμ 'x'λ₯Ό κ²μνμ¬ μ²« λ²μ§Έ μΈλ±μ€λ₯Ό λ°ννλ€. κ²μμ μ€ν¨νλ©΄ -1μ λ°ννλ€.
str.indexOf('x'); // -> -1
// λ¬Έμμ΄ strμ μΈλ±μ€ 3λΆν° 'l'μ κ²μνμ¬ μ²« λ²μ§Έ μΈλ±μ€λ₯Ό λ°ννλ€.
str.indexOf('l', 3); // -> 3
search λ©μλλ λμ λ¬Έμμ΄μμ μΈμλ‘ μ λ¬λ°μ μ κ· ννμκ³Ό 맀μΉνλ λ¬Έμμ΄μ κ²μνμ¬ μΌμΉνλ λ¬Έμμ΄μ μΈλ±μ€λ₯Ό λ°ννλ€. κ²μμ μ€ν¨νλ©΄ -1μ λ°ννλ€.
const str = 'Hello world';
// λ¬Έμμ΄ strμμ μ κ· ννμκ³Ό 맀μΉνλ λ¬Έμμ΄μ κ²μνμ¬ μΌμΉνλ λ¬Έμμ΄μ μΈλ±μ€λ₯Ό λ°ννλ€.
str.search(/o/); // -> 4
str.search(/x/); // -> -1
includes λ©μλλ λμ λ¬Έμμ΄μ μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄μ΄ ν¬ν¨λμ΄ μλμ§ νμΈνμ¬ κ·Έ κ²°κ³Όλ₯Ό true λλ falseλ‘ λ°ννλ€. λ λ²μ§Έ μΈμλ‘ κ²μμ μμν μΈλ±μ€λ₯Ό μ λ¬ν μ μλ€.
const str = 'Hello world';
str.includes('Hello'); // -> true
str.includes(''); // -> true
str.includes('x'); // -> false
str.includes(); // -> false
startsWith λ©μλλ λμ λ¬Έμμ΄μ΄ μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄λ‘ μμνλμ§ νμΈνμ¬ κ·Έ κ²°κ³Όλ₯Ό true λλ falseλ‘ λ°ννλ€. λ λ²μ§Έ μΈμλ‘ κ²μμ μμν μΈλ±μ€λ₯Ό μ λ¬ν μ μλ€.
const str = 'Hello world';
// λ¬Έμμ΄ strμ΄ 'He'λ‘ μμνλμ§ νμΈ
str.startsWith('He'); // -> true
// λ¬Έμμ΄ strμ΄ 'x'λ‘ μμνλμ§ νμΈ
str.startsWith('x'); // -> false
// λ¬Έμμ΄ strμ μΈλ±μ€ 5λΆν° μμνλ λ¬Έμμ΄μ΄ ' 'λ‘ μμνλμ§ νμΈ
str.startsWith(' ', 5); // -> true
endsWith λ©μλλ λμ λ¬Έμμ΄μ΄ μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄λ‘ λλλμ§ νμΈνμ¬ κ·Έ κ²°κ³Όλ₯Ό true λλ falseλ‘ λ°ννλ€. λ λ²μ§Έ μΈμλ‘ κ²μν λ¬Έμμ΄μ κΈΈμ΄λ₯Ό μ λ¬ν μ μλ€.
const str = 'Hello world';
// λ¬Έμμ΄ strμ΄ 'ld'λ‘ λλλμ§ νμΈ
str.endsWith('ld'); // -> true
// λ¬Έμμ΄ strμ΄ 'x'λ‘ λλλμ§ νμΈ
str.endsWith('x'); // -> false
// λ¬Έμμ΄ strμ μ²μλΆν° 5μ리κΉμ§('Hello')κ° 'lo'λ‘ λλλμ§ νμΈ
str.endsWith('lo', 5); // -> true
charAt λ©μλλ λμ λ¬Έμμ΄μμ μΈμλ‘ μ λ¬λ°μ μΈλ±μ€μ μμΉν λ¬Έμλ₯Ό κ²μνμ¬ λ°ννλ€.
const str = 'Hello';
for (let i = 0; i < str.length; i++) {
console.log(str.charAt(i)); // H e l l o
}
substring λ©μλλ λμ λ¬Έμμ΄μμ 첫 λ²μ§Έ μΈμλ‘ μ λ¬λ°μ μΈλ±μ€μ μμΉνλ λ¬ΈμλΆν° λ λ²μ§Έ μΈμ(μλ΅ κ°λ₯) λ‘ μ λ¬λ°μ μΈλ±μ€μ μμΉνλ λ¬Έμμ λ°λ‘ μ΄μ λ¬ΈμκΉμ§μ λΆλΆ λ¬Έμμ΄μ λ°ννλ€.
const str = 'Hello World';
// μΈλ±μ€ 1λΆν° μΈλ±μ€ 4 μ΄μ κΉμ§μ λΆλΆ λ¬Έμμ΄μ λ°ννλ€.
str.substring(1, 4); // -> ell
const str = 'Hello World'; // str.length == 11
// 첫 λ²μ§Έ μΈμ > λ λ²μ§Έ μΈμμΈ κ²½μ° λ μΈμλ κ΅νλλ€.
str.substring(4, 1); // -> 'ell'
// μΈμ < 0 λλ NaNμΈ κ²½μ° 0μΌλ‘ μ·¨κΈλλ€.
str.substring(-2); // -> 'Hello World'
// μΈμ > λ¬Έμμ΄μ κΈΈμ΄(str.length)μΈ κ²½μ° μΈμλ λ¬Έμμ΄μ κΈΈμ΄(str.length)μΌλ‘ μ·¨κΈλλ€.
str.substring(1, 100); // -> 'ello World'
str.substring(20); // -> ''
const str = 'Hello World';
// μ€νμ΄μ€λ₯Ό κΈ°μ€μΌλ‘ μμ μλ λΆλΆ λ¬Έμμ΄ μ·¨λ
str.substring(0, str.indexOf(' ')); // -> 'Hello'
// μ€νμ΄μ€λ₯Ό κΈ°μ€μΌλ‘ λ€μ μλ λΆλΆ λ¬Έμμ΄ μ·¨λ
str.substring(str.indexOf(' ') + 1, str.length); // -> 'World'
slice λ©μλλ substring λ©μλμ λμΌνκ² λμ₯νλ€. λ¨, slice λ©μλμλ μμμΈ μΈμλ₯Ό μ λ¬ν μ μλ€. μμμΈ μΈμλ₯Ό μ λ¬νλ©΄ λμ λ¬Έμμ΄μ κ°μ₯ λ€μμλΆν° μμνμ¬ λ¬Έμμ΄μ μλΌλ΄μ΄ λ°ννλ€.
const str = 'hello world';
// substringκ³Ό slice λ©μλλ λμΌνκ² λμνλ€.
// 0λ²μ§ΈλΆν° 5λ²μ§Έ μ΄μ λ¬ΈμκΉμ§ μλΌλ΄μ΄ λ°ν
str.substring(0, 5); // -> 'hello'
str.slice(0, 5); // -> 'hello'
// μΈλ±μ€κ° 2μΈ λ¬ΈμλΆν° λ§μ§λ§ λ¬ΈμκΉμ§ μλΌλ΄μ΄ λ°ν
str.substring(2); // -> 'llo world'
str.slice(2); // -> 'llo world'
// μΈμ < 0 λλ NaNμΈ κ²½μ° 0μΌλ‘ μ·¨κΈλλ€.
str.substring(-5); // -> 'hello world'
// slice λ©μλλ μμμΈ μΈμλ₯Ό μ λ¬ν μ μλ€. λ€μμ 5μ리λ₯Ό μλΌλ΄μ΄ λ°ννλ€.
str.slice(-5); // βΆ 'world'
toUpperCase λ©μλλ λμ λ¬Έμμ΄μ λͺ¨λ λλ¬Έμλ‘ λ³κ²½ν λ¬Έμμ΄μ λ°ννλ€.
const str = 'Hello World!';
str.toUpperCase(); // -> 'HELLO WORLD!'
toLowerCase λ©μλλ λμ λ¬Έμμ΄μ λͺ¨λ μλ¬Έμλ‘ λ³κ²½ν λ¬Έμμ΄μ λ°ννλ€.
const str = 'Hello World!';
str.toLowerCase(); // -> 'hello world!'
trim λ©μλλ λμ λ¬Έμμ΄ μλ€μ 곡백 λ¬Έμκ° μμ κ²½μ° μ΄λ₯Ό μ κ±°ν λ¬Έμμ΄μ λ°ννλ€.
const str = ' foo ';
str.trim(); // -> 'foo'
String.prototype.trimStart, String.prototype.trimEnd λ₯Ό μ¬μ©νκ±°λ μ κ· ννμμ μ¬μ©ν μλ μλ€.
const str = ' foo ';
// String.prototype.{trimStart,trimEnd} : Proposal stage 4
str.trimStart(); // -> 'foo '
str.trimEnd(); // -> ' foo'
// 첫 λ²μ§Έ μΈμλ‘ μ λ¬ν μ κ· ννμμ 맀μΉνλ λ¬Έμμ΄μ λ λ²μ§Έ μΈμλ‘ μ λ¬ν λ¬Έμμ΄λ‘ μΉννλ€.
str.replace(/\s/g, ''); // -> 'foo'
str.replace(/^\s+/g, ''); // -> 'foo '
str.replace(/\s+$/g, ''); // -> ' foo'
repeat λ©μλλ λμ λ¬Έμμ΄μ μΈμλ‘ μ λ¬λ°μ μ μλ§νΌ λ°λ³΅ν΄ μ°κ²°ν μλ‘μ΄ λ¬Έμμ΄μ λ°ννλ€.
const str = 'abc';
str.repeat(); // -> ''
str.repeat(0); // -> ''
str.repeat(1); // -> 'abc'
str.repeat(2); // -> 'abcabc'
str.repeat(2.5); // -> 'abcabc' (2.5 β 2)
str.repeat(-1); // -> RangeError: Invalid count value
replace λ©μλλ λμ λ¬Έμμ΄μμ 첫 λ²μ§Έ μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄ λλ μ κ· ννμμ κ²μνμ¬ λ λ²μ§Έ μΈμλ‘ μ λ¬ν λ¬Έμμ΄λ‘ μΉνν λ¬Έμμ΄μ λ°ννλ€.
const str = 'Hello world';
// strμμ 첫 λ²μ§Έ μΈμ 'world'λ₯Ό κ²μνμ¬ λ λ²μ§Έ μΈμ 'Lee'λ‘ μΉννλ€.
str.replace('world', 'Lee'); // -> 'Hello Lee'
κ²μλ λ¬Έμμ΄μ΄ μ¬λΏ μ‘΄μ¬ν κ²½μ° μ²« λ²μ§Έλ‘ κ²μλ λ¬Έμμ΄λ§ μΉννλ€.
const str = 'Hello world world';
str.replace('world', 'Lee'); // -> 'Hello Lee world'
replace λ©μλμ λ λ²μ§Έ μΈμλ‘ μΉν ν¨μλ₯Ό μ λ¬ν μ μλ€. replace λ©μλλ 첫 λ²μ§Έ μΈμλ‘ μ λ¬ν λ¬Έμμ΄ λλ μ κ· ννμμ 맀μΉν κ²°κ³Όλ₯Ό λ λ²μ§Έ μΈμλ‘ μ λ¬ν μΉν ν¨μμ μΈμλ‘ μ λ¬νλ©΄μ νΈμΆνκ³ μΉν ν¨μκ° λ°νν κ²°κ³Όμ λ§€μΉ κ²°κ³Όλ₯Ό μΉννλ€.
λ€μμ μΉ΄λ© μΌμ΄μ€λ₯Ό μ€λ€μ΄ν¬ μΌμ΄μ€λ‘, μ€λ€μ΄ν¬ μΌμ΄μ€λ₯Ό μΉ΄λ© μΌμ΄μ€λ‘ λ³κ²½νλ ν¨μλ€.
// μΉ΄λ© μΌμ΄μ€λ₯Ό μ€λ€μ΄ν¬ μΌμ΄μ€λ‘ λ³ννλ ν¨μ
function camelToSnake(camelCase) {
// /.[A-Z]/gλ μμμ ν λ¬Έμμ λλ¬Έμλ‘ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ 맀μΉνλ€.
// μΉν ν¨μμ μΈμλ‘ λ§€μΉ κ²°κ³Όκ° μ λ¬λκ³ , μΉν ν¨μκ° λ°νν κ²°κ³Όμ λ§€μΉ κ²°κ³Όλ₯Ό μΉννλ€.
return camelCase.replace(/.[A-Z]/g, match => {
console.log(match); // 'oW'
return match[0] + '_' + match[1].toLowerCase();
});
}
const camelCase = 'helloWorld';
camelToSnake(camelCase); // -> 'hello_world'
// μ€λ€μ΄ν¬ μΌμ΄μ€λ₯Ό μΉ΄λ© μΌμ΄μ€λ‘ λ³ννλ ν¨μ
function snakeToCamel(snakeCase) {
// /_[a-z]/gλ _μ μλ¬Έμλ‘ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ 맀μΉνλ€.
// μΉν ν¨μμ μΈμλ‘ λ§€μΉ κ²°κ³Όκ° μ λ¬λκ³ , μΉν ν¨μκ° λ°νν κ²°κ³Όμ λ§€μΉ κ²°κ³Όλ₯Ό μΉννλ€.
return snakeCase.replace(/_[a-z]]/g, match => {
console.log(match); // '_w'
return match[1].toUpperCase();
});
}
const snakeCase = 'hello_world';
snakeToCamel(snakeCase); // -> 'helloWorld'
split λ©μλλ λμ λ¬Έμμ΄μμ 첫 λ²μ§Έ μΈμλ‘ μ λ¬ν λ¬Έμμ΄ λλ μ κ· ννμμ κ²μνμ¬ λ¬Έμμ΄μ ꡬλΆν ν λΆλ¦¬λ κ° λ¬Έμμ΄λ‘ μ΄λ£¨μ΄μ§ λ°°μ΄μ λ°ννλ€. μΈμλ‘ λΉ λ¬Έμμ΄μ μ λ¬νλ©΄ κ° λ¬Έμλ₯Ό λͺ¨λ λΆλ¦¬νκ³ , μΈμλ₯Ό μλ΅νλ©΄ λμ λ¬Έμμ΄ μ 체λ₯Ό λ¨μΌ μμλ‘ νλ λ°°μ΄μ λ°ννλ€. λ λ²μ§Έ μΈμλ‘ λ°°μ΄μ κΈΈμ΄λ₯Ό μ μ₯ν μ μλ€.
const str = 'How are you doing?';
// 곡백μΌλ‘ ꡬλΆ(λ¨μ΄λ‘ ꡬλΆ)νμ¬ λ°°μ΄λ‘ λ°ννλ€.
str.split(' '); // -> ["How", "are", "you", "doing?"]
// \sλ μ¬λ¬ κ°μ§ 곡백 λ¬Έμ(μ€νμ΄μ€, ν λ±)λ₯Ό μλ―Ένλ€. μ¦, [\t\r\n\v\f]μ κ°μ μλ―Έλ€.
str.split(/\s/); // -> ["How", "are", "you", "doing?"]
// μΈμλ‘ λΉ λ¬Έμμ΄μ μ λ¬νλ©΄ κ° λ¬Έμλ₯Ό λͺ¨λ λΆλ¦¬νλ€.
str.split(''); // -> ["H", "o", "w", " ", "a", "r", "e", " ", "y", "o", "u", " ", "d", "o", "i", "n", "g", "?"]
// μΈμλ₯Ό μλ΅νλ©΄ λμ λ¬Έμμ΄ μ 체λ₯Ό λ¨μΌ μμλ‘ νλ λ°°μ΄μ λ°ννλ€.
str.split(); // -> ["How are you doing?"]
// 곡백μΌλ‘ ꡬλΆνμ¬ λ°°μ΄λ‘ λ°ννλ€. λ¨, λ°°μ΄μ κΈΈμ΄λ 3μ΄λ€
str.split(' ', 3); // -> ["How", "are", "you"]
split λ©μλλ λ°°μ΄μ λ°ννλ€. λ°λΌμ Array.prototype.reverse, Array.prototype.join λ©μλμ ν¨κ» μ¬μ©νλ©΄ λ¬Έμμ΄μ μμμΌλ‘ λ€μ§μ μ μλ€.
// μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄μ μμμΌλ‘ λ€μ§λλ€.
function reverseString(str) {
return str.split('').reverse().join('');
}
reverseString('Hello world!'); // -> '!dlrow olleH'