亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

ES6+ includes()

1. 前言

字符串查找一直都是程序中的常用操作,在 ES5 中查找一個字符串是否包含另一個字符串,一般有兩種思維。一是使用正則的方式來匹配,二是使用 ES5 的方式,如 indexOf、lastIdexOf、search。使用正則比較簡單,但是需要對正則語法有一定的了解。一般使用 indexOf() 來進行字符串的查找 ,它會返回查詢后第一次出現的指定值的索引,如果未找到該值,則返回 -1。

ES6 新增方法 includes() 方法,來替代 indexOf() 彌補它的不足。而 ES6 提供了新的方法 includes() 可以更好地進行判斷,而不需要根據返回的索引進行判斷。

2. 方法詳情

includes() 方法主要用于查詢字符串,判斷一個字符串是否包含另外一個字符串,其返回值是如果包含該字符串則返回 true 否則返回 false。

使用語法:

str.includes(searchString[, position])

參數說明:

參數 描述
searchString 需要查找的目標字符串
position (可選) 從當前字符串的哪個索引位置開始搜尋子字符串,默認值為 0

實例:

var str = 'hello world';

console.log(str.includes('hello'));     // true
console.log(str.includes('hello', 3));  // false

在沒有傳入確切的查詢字符串時,searchString 會被強制設置成 “undefined”,然后在當前字符串中查找這個值。

'undefined'.includes('');			// 返回 true
'undefined'.includes(); 	  	// 返回 true
'undefine'.includes();		  	// 返回 false
'imooc ES6 wiki'.includes();	// 返回 false

上面的代碼最容易在面試中出現,考察你對 includes() 方法的理解程度。第 1 行返回 true 很容易理解,查詢一個空字符串嘛這個沒問題,但第 2 行返回的結果也是 true,這說明查詢的字符串在 “undefined” 字符串中,還不能說被設置成了字符串 “undefined” 。
第 3 、 4 行代碼中也沒有傳值,但返回的結果為 false,從而證明了在沒有傳值時,第一個參數的值被設置成字符串 “undefined”。

在沒傳值時和 indexOf() 的查詢結果是一致的。下面我們看 indexOf() 在沒有參數時是一個什么樣的結果。

'undefined'.indexOf();		// 返回 0
'undefine'.indexOf();		  // 返回 -1

上面的代碼中,第 1 行返回的結果是 0,是查詢結果的位置,第 2 行返回的是 -1,說明沒有查詢到。雖然返回的結果不一樣,但是意義是一樣的。includes() 可以替換 indexOf() 使用,includes() 好處在于它可以直接判斷,而 indexOf() 還需要對結果進行對比,如下實例:

const str = 'imooc ES6 wiki';
if (str.includes('ES6')) {
  // todo

if (str.indexOf('ES6') !== -1) {
  // todo
}

上面代碼中的兩個 if 判斷是一個意思,但是使用 includes() 很簡潔,這也是 ES6 設計的初衷。

3. 使用場景

includes() 方法的引入是為了代替 indexOf() 作為字符串的查詢的方法使用。

3.1 區分大小寫

includes() 方法是區分大小寫的。

'imooc es6'.includes('imooc');  // true
'imooc es6'.includes('Imooc');  // false

3.2 一個參數

includes() 在只有一個參數時,會從字符串的第一個字符開始查找。

var str = "I love imooc.";

console.log(str.includes("I love"));    // true
console.log(str.includes("imooc"));     // true
console.log(str.includes("eimooc"));    // false

3.3 兩個參數

includes() 有第二個參數的時候,會從第二個參數作為索引的位置開始。

var str = "I love imooc.";

console.log(str.includes("love", 3));  // false
console.log(str.includes("ove", 3));   // true

第二個參數的意思是,查找字符串開始的位置,例子中的 3 就是查找的位置,所以查找的目標字符串是 ove imooc.。

當第二個參數是負數時,只要查找的字符串在目標字符串里,無論是多少,都會返回 true。

var str = "I love imooc.";

console.log(str.includes("love", -1));    // true
console.log(str.includes("ove", -100));   // true
console.log(str.includes("Love", -1));    // false

4. 注意事項

在使用 includes() 時需要注意類型轉換的一些問題:

4.1 includes 會做類型轉換

let numStr = '2020';
 
numStr.includes('2');  // true
numStr.includes(2);    // true

在這個例子中 numStr 是一個字符串,判斷字符串 2 和數字 2 都是能返回正確的結果,這里 includes() 會把數字轉換成字符串 ‘2’ 然后再執行查詢操作。

4.2 不能對 Number 類型直接使用

let numStr = 2020;

numStr.includes(2);    // Uncaught TypeError: numStr.includes is not a function

從這個例子可以看出,includes 是字符串上的方法,而這里直接使用在數值類型上所以會報語法錯誤。如果要使用 includes 來查詢,就必須把數字轉化成字符串,然后進行查詢。

let numStr = 2020;
("" + numStr).includes(0) // true

這里對 numStr 前加一個空字符串可以進行類型轉換。

5. 小結

本節講解了字符串的 includes() 方法的使用,總結以下幾點:

  1. 在沒有傳參時,查詢字符串會被設置成 “undefined”;
  2. includes() 區分大小寫;
  3. 當有第二個參數時,則會從第二個參數作為索引的位置開始查找,并包含當前位置的字符;
  4. 當第二個參數是負數時,只要查找的字符串在目標字符串里,無論是多少,都會返回 true;
  5. 判斷數字時,需要把數字轉換成字符串類型才能查詢。