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()
方法的使用,總結以下幾點:
- 在沒有傳參時,查詢字符串會被設置成 “undefined”;
includes()
區分大小寫;- 當有第二個參數時,則會從第二個參數作為索引的位置開始查找,并包含當前位置的字符;
- 當第二個參數是負數時,只要查找的字符串在目標字符串里,無論是多少,都會返回 true;
- 判斷數字時,需要把數字轉換成字符串類型才能查詢。