JS.next

JavaScriptの最新実装情報を追うブログ

String.prototype.{startsWith,endsWith,includes} が正規表現を受け付けなくなった

概要

これらは文字列を期待するメソッドだが、splitの用に正規表現も受け付けると思われて解決しづらいバグの元になってしまわないように、正規表現オブジェクトが渡された時は専用のエラーを出すことになり、V8の実装も追従した。


メソッドの説明

文字列str1が文字列str2で始まっているかどうかを『str1.startsWith(str2)』、
文字列str1が文字列str2で終わっているかどうかを『str1.endsWith(str2)』、
文字列str1が文字列str2を含んでいるかどうかを 『str1.includes(str2)』で得ることができる。
【注意】「includes」は当初「contains」という名前でしたが改名されました。

'123abc789'.startsWith('123')  // true

'123abc789'.startsWith(/\d{3}/)
  // TypeError: First argument to String.prototype.startsWith must not be a regular expression


範囲を持たせたいときは RegExp.prototype.testString.prototype.match と「^」や「$」を使おう

// startsWith
/^\d{3}/.test('123abc789')     // true
!!'123abc789'.match(/^\d{3}/)  // true

// endsWith
/\d{3}$/.test('123abc789')     // true
!!'123abc789'.match(/\d{3}$/)  // true

// contains
/[a-z]{3}/.test('123abc789')     // true
!!'123abc789'.match(/[a-z]{3}/)  // true


変更が加えられたバージョン

V8 3.24.26(startsWith,endsWith) 3.26.8(contains) 3.31.15(contains→includes)