1. Unicode 핸들링 개선
const illFormed = "https://example.com/search?q=\uD800";
console.log(illFormed.isWellFormed()); // false
try {
encodeURI(illFormed);
} catch (e) {
console.log(e); // URIError: URI malformed
}
console.log(encodeURI(illFormed.toWellFormed()));
// "https://example.com/search?q=%EF%BF%BD"
Well formed ?? (클릭)
문자열은 기본적으로 UTF-16 코드 단위의 시퀀스로 표현됩니다. UTF-16 인코딩에서 모든 코드 단위는 정확히 16비트 길이입니다. 즉, 단일 UTF-16 코드 단위로 표현할 수 있는 문자는 최대 216개 또는 65536개입니다. 이 문자 집합을 기본 다국어 평면(BMP – Basic Multilingual Plane)이라고 하며, 라틴, 그리스, 키릴 문자와 같은 가장 일반적인 문자와 많은 동아시아 문자가 포함됩니다. 각 코드 단위는 \u 뒤에 정확히 4개의 16진수 숫자가 오는 문자열로 작성할 수 있습니다.
그러나 전체 유니코드 문자 집합은 65536보다 훨씬 훨씬 큽니다. 추가 문자는 UTF-16에 서로게이트 쌍으로 저장되며, 이는 단일 문자를 나타내는 16비트 코드 단위 쌍입니다. 모호성을 피하기 위해 쌍의 두 부분은 0xD800과 0xDFFF 사이여야 하며 이러한 코드 단위는 단일 코드 단위 문자를 인코딩하는 데 사용되지 않습니다. (더 정확히 말해서, 선행 서로게이트, 즉 High surrogate 코드 단위는 0xD800과 0xDBFF 사이의 값을 갖는 반면, 후행 서로게이트, 즉 low surrogate 코드 단위는 0xDC00과 0xDFFF 사이의 값을 갖습니다.) 하나 또는 두 개의 UTF-16 코드 단위로 구성된 각 유니코드 문자는 유니코드 코드 포인트라고도 합니다. 각 유니코드 코드 포인트는 \u{xxxxxx}로 문자열에 작성할 수 있습니다. 여기서 xxxxxx는 1~6자리 16진수를 나타냅니다.
“단독 서로게이트”는 아래 설명 중 하나를 만족하는 16비트 코드 단위입니다.
0xD800~0xDBFF 범위에 있지만(즉, 선행 서로게이트임) 문자열의 마지막 코드 단위이거나 다음 코드 단위가 후행 서로게이트가 아닙니다.
0xDC00–0xDFFF 범위에 있지만(즉, 후행 서로게이트임) 문자열의 첫 번째 코드 단위이거나 이전 코드 단위가 선행 서로게이트가 아닙니다.
단독 서로게이트는 유니코드 문자를 나타내지 않습니다. 대부분의 JavaScript 내장 메서드는 모두 UTF-16 코드 단위를 기반으로 작동하기 때문에 이를 올바르게 처리하지만 단독 서로게이트는 다른 시스템과 상호 작용할 때 종종 유효한 값이 아닙니다. 예를 들어, encodeURI()는 단독 서로게이트에 대해 URIError를 발생시킵니다. URI 인코딩은 단독 서로게이트에 대한 인코딩이 없는 UTF-8 인코딩을 사용하기 때문입니다. 단독 서로게이트를 포함하지 않는 문자열을 잘 구성된 문자열이라고 하며 UTF-16을 처리하지 않는 함수(예: encodeURI() 또는 TextEncoder)와 함께 사용해도 안전합니다. isWellFormed() 메서드로 문자열이 잘 형성되었는지 확인하거나 toWellFormed() 메서드로 단독 서로게이트를 정리할 수 있습니다.
유니코드 문자 위에는 문자소 클러스터라고 알려진 하나의 시각적 단위로 처리해야 하는 특정 유니코드 문자 시퀀스가 있습니다. 가장 일반적인 경우는 이모지입니다. 다양한 변형이 있는 많은 이모지는 실제로 여러 이모지로 형성되며 일반적으로 (U+200D) 문자로 결합됩니다.
반복하는 문자 수준에 주의해야 합니다. 예를 들어 split(“”)은 UTF-16 코드 단위로 분할하고 서로게이트 쌍을 분리합니다. 문자열 인덱스는 또한 각 UTF-16 코드 단위의 인덱스를 참조합니다. 반면에 [Symbol.iterator]()는 유니코드 코드 포인트로 반복합니다. 문자소 클러스터를 반복하려면 일부 사용자 지정 코드가 필요합니다.
2. 정규식 v
플래그
유니코드 검색을 좀 더 명확하게 할 수 있다.
const re = /…/v;
multiple codepoints 에서 사용 (주로 emoji)
const re = /^\p{RGI_Emoji}$/v;
// Match an emoji that consists of just 1 code point:
re.test('⚽'); // '\u26BD'
// → true
// Match an emoji that consists of multiple code points:
re.test('👨🏾⚕️'); // '\u{1F468}\u{1F3FE}\u200D\u2695\uFE0F'
// → true
그 외 여러가지 properties 추가.
// difference/subtraction
[A--B]
// intersection
[A&&B]
// nested character class
[A--[0-9]]
참조 : https://v8.dev/features/regexp-v-flag
3. 최상위 await
async
함수 바깥에서 await 사용가능.
4. Pipeline operator |>
함수 체이닝.
const calculatedValue = Math.ceil(Math.pow(Math.max(0, -10), 1/3));
const calculatedValue = -10
|> (n => Math.max(0, n))
|> (n => Math.pow(n, 1/3))
|> Math.ceil;
함수 자체를 인자로 넘겨줘서 좀더 알아보기 쉬운 코드 생성 가능.
아직 draft 단계임.
4. Record
와 Tuple
각각 Object
와 Array
와 비슷하지만 immutable
이다.
// an immutable record
const profile = #{
name: "John Doe",
age: 40,
};
// an immutable tuple
const numbers = #[1, 2, 3];
5. Decorator
function logMethod(target, key, descriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args) {
console.log(`Calling ${key} with arguments: ${args.join(', ')}`);
const result = originalMethod.apply(this, args);
console.log(`${key} returned: ${result}`);
return result;
};
return descriptor;
}
class Calculator {
@logMethod // decorator added
add(a, b) {
return a + b;
}
}
const calculator = new Calculator();
calculator.add(2, 3);
// Calling add with arguments: 2, 3
// add returned: 5
예상 사용처 : logging, validating, hooking, …
정리되는 대로 추가…
0개의 댓글