2023.06.16
const name = 'Fred';
console.log(`My name is ${name}`); // My name is Fred
console.log(`Say it loud! ${name.toUpperCase()}!`); // Say it loud! FRED!
console.log(`Line 1
Line 2`);
// Line1
// Line2
const a = ['one', 'two', 'three'];
console.log(`Complex: ${a.reverse().join().toUpperCase()}`); // "Complex: THREE,TWO,ONE"
function example(template, ...values) {
console.log(template);
console.log(values);
}
const a = 1,
b = 2,
c = 3;
example`Testing ${a} ${b} ${c}.`;
// =>
// ["Testing ", " ", " ", "."]
// [1, 2, 3]
function emulateUntagged(template, ...values) {
return template.reduce((acc, str, index) => acc + values[index - 1] + str);
}
const a = 1,
b = 2,
c = 3;
console.log(emulateUntagged`Testing ${a} ${b} ${c}.`);
// "Testing 1 2 3."
function example(template) {
const first = template.raw[0];
console.log(first);
console.log(first.length);
console.log(first[0]);
}
example`\u000A\x0a\n`;
const createRegex = (template, ...values) => {
// Build the source from the raw text segments and values
// (in a later section, you'll see something that can replace
// this reduce call)
const source = template.raw.reduce((acc, str, index) => acc + values[index - 1] + str);
// Check it's in /expr/flags form
const match = /^\/(.+)\/([a-z]*)$/.exec(source);
if (!match) {
throw new Error('Invalid regular expression');
}
// Get the expression and flags, create
const [, expr, flags = ''] = match;
return new RegExp(expr, flags);
};
// From the TC39 proposal: https://github.com/benjamingr/RegExp.escape
const escapeRegExp = (s) => String(s).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
const alternatives = ['this', 'that', 'the other'];
const rex = createRegex`/\b(?:${alternatives.map(escapeRegExp).join('|')})\b/i`;
const test = (str, expect) => {
const result = rex.test(str);
console.log(str + ':', result, '=>', !result == !expect ? 'Good' : 'ERROR');
};
test("doesn't have either", false);
test('has_this_but_not_delimited', false);
test('has this ', true);
test('has the other ', true);
fs.open(String.raw`C:\nifty\stuff.json`);
new RegExp(String.raw`^\d+${separator}\d+$`);
const createRegex = (template, ...values) => {
const source = String.raw(template, ...values);
// do something
};
const formatUser = (firstName, lastName, handle) => `${firstName} ${lastName} (${handle})`;
console.log(formatUser('Joe', 'Bloggs', '@joebloggs'));
(
나, [
줄을 시작하는 것을 피하는 데 익숙할 것이다. 이것은 잘못된 함수 호출이나 배열의 시작을 의미하는 속성 접근자와 같이 의도하지 않은 동작을 유발할 수 있다.(
처럼 )“문자” | 코드 포인트 | UTF-16 코드 단위 |
---|---|---|
영어 “a” | U+0061 | 0061 |
데바나가리 नि | U+0928 U+093F | 0928 093F |
스마일 이모지 😊 | U+1F60A | D83D DE0A |
console.log('a'.length); // 1
console.log('नि'.length); // 2
console.log('😊'.length); // 2
// UTF-16 값을 파악한 다음 작성
console.log('\uD83D\uDE0A'); // 😊
// 유니코드 코드 포인트 이스케이프 시퀀스 사용
console.log('\u{1F60A}'); // 😊
console.log(String.fromCodePoint(0x1f60a)); //😊
console.log('😊'.codePointAt(0).toString(16).toUpperCase()); // 1F60A
const charToHex = (str, i) => '0x' + str.codePointAt(i).toString(16).toUpperCase().padStart(6, '0');
const str = '😊😊'; // Two identical smiling face emojis
for (let i = 0; i < str.length; ++i) {
console.log(charToHex(str, i));
}
// =>
// 0x01F60A
// 0x00DE0A
// 0x01F60A
// 0x00DE0A
const f1 = 'Français';
const f2 = 'Franc\u0327ais';
console.log(f1); // Français
console.log(f2); // Français
console.log(f1 === f2); // false
console.log(f1.normalize() === f2.normalize()); // true
for (const ch of '>😊<') {
console.log(`${ch} (${ch.length})`);
}
// =>
// > (1)
// 😊 (2)
// < (1)
const charToHex = (ch) => '0x' + ch.codePointAt(0).toString(16).toUpperCase().padStart(6, '0');
const show = (array) => {
console.log(array.map(charToHex));
};
const str = '>😊<';
show(str.split('')); // ["0x00003E", "0x00D83D", "0x00DE0A", "0x00003C"]
show(Array.from(str)); // ["0x00003E", "0x01F60A", "0x00003C"]
console.log('n'.repeat(3)); // nnn
console.log('testing'.startsWith('test')); // true
console.log('testing'.endsWith('ing')); // true
console.log('testing'.endsWith('foo')); // false
console.log('now testing'.startsWith('test')); // false
console.log('now testing'.startsWith('test', 4)); // true
// Index 4 ------^
console.log('now testing'.endsWith('test')); // false
console.log('now testing'.endsWith('test', 8)); // true
// Index 8 ----------^
console.log('testing'.includes('test')); // true
console.log('testing'.includes('test', 1)); // false
const s = 'example';
console.log(`|${s.padStart(10, '-')}|`);
// => "|---example|"
console.log(`|${s.padEnd(10, '-')}|`);
// => "|example---|"
const s = 'example';
console.log(`|${s.padStart(10, '-*')}|`);
// => "|-*-example|"
console.log(`|${s.padEnd(10, '-*')}|`);
// => "|example-*-|"
console.log(`|${s.padStart(14, '...oooOOO')}|`);
// => "|...oooOexample|"
const s = ' testing ';
const startTrimmed = s.trimStart();
const endTrimmed = s.trimEnd();
console.log(`|${startTrimmed}|`);
// => |testing |
console.log(`|${endTrimmed}|`);
// => | testing|
// String.prototype 내부
split(separator) {
if (separator !== undefined && separator !== null) {
if (separator[Symbol.split] !== undefined) {
return separator[Symbol.split](this);
}
}
const s = String(separator);
const a = [];
// ... `s`에서 문자열을 분할하고 `a`에 추가...
return a;
}
const formatUserName = user => {
return `${user.firstName} ${user.lastName} (${user.handle});
};