ES6 字符串擴展html
ES6 增強了對 Unicode 的支持,而且擴展了字符串對象數組
容許採用 \uxxxx 形式表示一個字符,函數
其中 xxxx 表示字符的 Unicode 碼點測試
console.log('\z' === 'z'); // true
console.log('\172' === 'z'); // true
console.log('\x7A' === 'z'); // true
console.log('\u007A' === 'z'); // true
console.log('\u{7A}' === 'z'); // true
codePointAt
方法,可以正確處理 4 個字節儲存的字符,返回一個字符的碼點let s = '𠮷a'; s.codePointAt(0); // 134071 s.codePointAt(1); // 57271 s.codePointAt(2); // 97
總之,codePointAt
方法會正確返回 32 位的 UTF-16 字符的碼點。this
對於那些兩個字節儲存的常規字符,它的返回結果與 charCodeAt
方法相同spa
let s = '𠮷a'; s.codePointAt(0).toString(16); // "20bb7" s.codePointAt(2).toString(16); // "61"
function is32Bit(c) { return c.codePointAt(0) > 0xFFFF; } is32Bit("𠮷"); // true is32Bit("a"); // false
String.fromCodePoint(0x20BB7); // "𠮷" console.log(String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y'); // true
let str = 'Hello world!'; str.startsWith('Hello'); // true 是否以 'Hello' 開頭 str.endsWith('!'); // true 是否以 '!' 結尾 str.includes('o'); // true 是否包含 'o'
支持 兩個參數code
let str = 'Hello World!'; str.startsWith('world', 6); // true 從第 n 個開始,以後字符串 是否以 world' 開頭 str.endsWith('Hello', 5); // true 從第 n 個開始,以前的字符串 是否以 'Hello' 結尾 str.includes('Hello', 6); // false 從第 n 個開始,以後的字符串 是否包含 'Hello'
若是傳入參數爲小數,則向下取整htm
'na'.repeat(2.9); // "nana" 等同於 'na'.repeat(2) // 負數, 或者 infinity 會報錯 'na'.repeat(Infinity); // RangeError 'na'.repeat(-1); // RangeError
若是是字符串,則轉換爲 Number 類型對象
'na'.repeat('na'); // "" 'na'.repeat('3'); // "nanana" 'na'.repeat(NaN); // "" 至關於 0 'na'.repeat(-0.9); // "" -1 到 0 之間,至關於 0
第一個參數 指定最大字符串長度,第二個參數用於補全的字符串blog
'x'.padStart(5, 'ab'); // 'ababx' 'x'.padStart(4, 'ab'); // 'abax' 'x'.padEnd(5, 'ab'); // 'xabab' 'x'.padEnd(4, 'ab'); // 'xaba'
若是 最大長度 大於 原字符串,則補全不生效,返回原字符串
'abc'.padStart(2, 'ab'); // 'abc' 'ccc'.padEnd(2, 'ab'); // 'ccc'
若是省略第二個用於補全的字符串,則 默認以空格補全
'a'.padStart(4); // ' a' 'b'.padEnd(4); // 'b '
'1'.padStart(10, '0'); // "0000000001" '12'.padStart(10, '0'); // "0000000012" '123456'.padStart(10, '0'); // "0000123456"
'12'.padStart(10, 'YYYY-MM-DD'); // "YYYY-MM-12" '09-12'.padStart(10, 'YYYY-MM-DD'); // "YYYY-09-12"
模板字符串(template string)是加強版的字符串,用反引號(`)標識。
它能夠看成普通字符串使用,也能夠用來定義多行字符串,或者在字符串中嵌入變量
模板字符串的大括號內部,就是執行 JavaScript 代碼,所以若是大括號內部是一個字符串,將會原樣輸出
// 普通字符串 `In JavaScript '\n' is a line-feed.` // 多行字符串 `In JavaScript this is not legal.` console.log(`string text line 1 string text line 2`); // 字符串中嵌入變量 let name = "Bob", time = "today"; `Hello ${name}, how are you ${time}?` // 變量必須寫在 `${}` 裏面
若是在模板字符串中須要使用反引號,則前面要用反斜槓轉義
let greeting = `\`Yo\` World!`;
模板字符串表示多行字符串,全部的空格和縮進都會被保留在輸出之中
$('#list').html(`
<ul>
<li>first</li>
<li>second</li>
</ul>
`);
花括號內 能夠放入表達式,進行計算
let x = 1; let y = 2; console.log(`${x} + ${y} = ${x + y}`); // "1 + 2 = 3" console.log(`${x} + ${y * 2} = ${x + y * 2}`); // "1 + 4 = 5" let obj = {x: 1, y: 2}; console.log(`${obj.x + obj.y}`); // "3"
模板字符串之中還能調用函數
function fn() { return "Hello World"; } console.log(`foo ${fn()} bar`); // foo Hello World bar
let a = 5; let b = 10; function tag(s, v1, v2) { console.log(s[0]); console.log(s[1]); console.log(s[2]); console.log(s[3]); console.log(v1); console.log(v2); return "OK"; } console.log(tag`Hello ${ a + b } world ${ a * b}RyenToretto`); // "Hello " // " world " // RyenToretto" // "" // 15 // 50 // "OK"
應用:
let message = SaferHTML`<p>${sender} has sent you a message.</p>`; function SaferHTML(templateData) { let s = templateData[0]; for (let i = 1; i < arguments.length; i++) { let arg = String(arguments[i]); // Escape special characters in the substitution. s += arg.replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">"); // Don't escape special characters in the template. s += templateData[i]; }; return s; };
ES6 還爲原生的 String 對象,提供了一個 raw
方法——模板字符串的處理函數
將全部變量替換,並且對斜槓進行轉義,方便下一步做爲字符串來使用
String.raw`Hi\n${2+3}!`; // 返回 "Hi\\n5!" String.raw`Hi\u000A!`; // 返回 "Hi\\u000A!"
即便 原字符串的斜槓已經轉義,String.raw() 仍是
會進行再次轉義