深刻理解ES6--2.字符串與正則表達式

主要知識點:新增的字符串處理方法、模板字面量以及正則表達式上的改動正則表達式

字符串與正則表達式的知識點

1. 字符串處理方法

codePointAt()方法數組

ES6 爲全面支持 UTF-16 而新增的方法之一是 codePointAt() ,它能夠在給定字符串中按位 置提取 Unicode 代碼點。該方法接受的是碼元位置而非字符位置,並返回一個整數值。函數

String.fromCodePoint()方法ui

可使用codePointAt() 來提取字符串內中某個字符的代碼點,也能夠藉助 String.fromCodePoint()用給定的代碼點來產生包含單個字符的字符串spa

normalize()方法3d

Unicode 另外一個有趣之處是,不一樣的字符在排序或其它一些比較操做中可能會被認爲是相同 的。有兩種方式能夠定義這種關聯性:第一種是規範相等性(canonical equivalence ) , 意味着兩個代碼點序列在全部方面都被認爲是可互換的。例如,兩個字符的組合能夠按規範 等同於另外一個字符。第二種關聯性是兼容性(compatibility ) ,兩個兼容的代碼點序列看起 來有差異,但在特定條件下可互換使用。code

ES6 給字符串提供了** normalize()** 方法,以支持 Unicode 標準形式。所以,在比較字符時,能夠先將字符用同一種標準化方法,讓它們標準化,再進行比較,例如,比較字符數組中的大小:orm

let compare = function(values=[]){
	values.sort((first,second)=>{
		let firstNormalized = first.normalize();
		let secondNormalized = second.normalize();

		if (firstNormalized < secondNormalized) {
			return -1;
		} else if (firstNormalized === secondNormalized) {
			return 0;
		} else {
			return 1;
		}
	})

}

let arr = ['a','z','c','g'];
compare(arr);
console.log(arr);//["a", "c", "g", "z"]
複製代碼

識別子字符串的方法cdn

爲了識別字符串是否存在於其餘字符串中,ES6提供了相應的方法來知足這類需求:blog

  • includes()方法:在給定文本存在於字符串中的任意位置時會返回 true,不然會返回 false
  • startsWith() 方法:在給定文本出如今字符串起始處時返回 true ,不然返回 false
  • endsWith() 方法:在給定文本出如今字符串結尾處時返回 true ,不然返回 false

每一個方法都接受兩個參數:須要搜索的文本,以及可選的搜索起始位置索引。當提供了第二 個參數時, includes()startsWith()方法會從該索引位置開始嘗試匹配;當第二個參數未提供時, includes()startsWith() 方法會從字符串起始處開始查找,而 endsWith()方法則從尾部減去第二個參數後的位置做爲起始位置。

repeat()方法

ES6 還爲字符串添加了一個 repeat() 方法,它接受一個參數做爲字符串的重複次數,返回一個將初始字符串重複指定次數的新字符串。例如:

//repeat()方法

console.log('x'.repeat(3)); //xxx
console.log('hello world'.repeat(2)); //hello worldhello world
複製代碼

2. 模板字面量

基本語法

模板字面量的最簡單語法,是使用反引號來包裹普通字符串,而不是用雙引號或單引號,例如:

//模板字面量

let  message = `hello world`;
console.log(message); //hello world
console.log(typeof message); //string
console.log(message.length); //1
複製代碼

若想字符串中包含反引號,可使用反斜槓(\)進行轉義便可:

let  message = `\`hello world\``;
console.log(message); //`hello world`
複製代碼

多行字符串

使用模板字面量能夠輕鬆建立多行字符串,例如:

let message = `hello

world`;
console.log(message);
輸出:
hello

		world
複製代碼

替換位

**替換位能夠嵌入到模板字面量中,替換位最終能夠轉換爲字符串的一部分輸出。替換位能夠是任意的js表達式。**替換位的語法採用 ${} 表示。

例如,替換位爲變量:

let msg = 'hello';
let message = `${msg} world`;
console.log(message); //hello world
複製代碼

替換位不單單能夠是簡單的變量,還能夠嵌入計算表達式、函數調用等,甚至還能夠將模板字面量做爲替換位嵌入到另外一個模板字面量中。

3. 模板標籤

一個模板標籤(template tag ) 能對模板字面量進行轉換並返回最終的字符串值,標籤在模板的起始處被指定,即在第一個 ` 以前。例如:

let message = tag`Hello world`;
複製代碼

tag 就是會被應用到 Hello world 模板字面量上的模板標籤。

定義標籤

一個標籤(tag ) 僅是一個函數,它被調用時接收須要處理的模板字面量數據。標籤所接收的數據被劃分爲獨立片斷,而且必須將它們組合起來以建立結果。第一個參數是個數組,包含被 JS 解釋過的字面量字符串,隨後的參數是每一個替換位的解釋值。

標籤函數的參數通常定義爲剩餘參數形式,以便更容易處理數據,以下:

function tag(literals, ...substitutions) {
// 返回一個字符串
}
複製代碼

使用模板字面量中的原始值

模板標籤也能訪問字符串的原始信息,主要指的是能夠訪問字符在轉義以前的形式。獲取原始字符串值的最簡單方式是使用內置的 String.raw() 標籤。例如:

let message1 = `Multiline\nstring`,
message2 = String.raw`Multiline\nstring`;
console.log(message1); // "Multiline
					   // string"
console.log(message2); // "Multiline\nstring"
複製代碼

4. 正則表達式的改動

  1. 正則表達式u標識:你可使用正則表達式來完成字符串的不少通用操做。但要記住,正則表達式假定單個字符使用一個 16 位的碼元來表示。爲了解決這個問題, ES6 爲正則表達式定義了用於處理Unicode 的 u 標誌。當一個正則表達式設置了 u標誌時,它的工做模式將切換到針對字符,而不是針對碼元。

  2. 正則表達的y標誌: y 標誌影響正則表達式搜索時的粘連( sticky ) 屬性,它表示從正則表達式的 lastIndex 屬性值的位置開始檢索字符串中的匹配字符。若是在該位置沒有匹配成功,那麼正則表達式將中止檢索;

  3. 複製正則表達式:使用RegExp構造器時容許使用第二個參數,而且讓它覆蓋第一個參數中的標誌;

  4. flag屬性:ES6 新增了 flags 屬性用於配合 source 屬性,讓標誌的獲取變得更容易。例如:

    var re = /ab/g;
     console.log(re.source); // ab
     console.log(re.flags); // g
    複製代碼

    本例查找了 re 的全部標誌並將其打印到控制檯,所用的代碼量要比 toString() 方式少得多。同時使用 sourceflags 容許你直接提取正則表達式的組成部分,而沒必要將正則表達式轉換爲字符串。

相關文章
相關標籤/搜索