ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptの配列・文字列に対するlastIndexOf()メソッドの使い方を詳しく解説_基礎知識

JavaScriptの配列・文字列に対するlastIndexOf()メソッドの使い方を詳しく解説_基礎知識

WBOY
WBOYオリジナル
2016-05-16 15:10:552213ブラウズ

Array.prototype.lastIndexOf と String.prototype.lastIndexOf は非常に実用的なメソッドですが、多くの人は実際に 2 つのパラメーターを渡すことができることを知りません。2 番目のパラメーターは検索の開始位置を決定します。

文法

str.lastIndexOf(searchValue[, fromIndex])
lastIndexOf() メソッドは、このメソッドを呼び出した文字列内で指定された値が最後に出現した値を返します。見つからない場合は -1 を返します。 fromIndex から開始して、文字列の末尾から前方検索します。

パラメータ

1.searchValue

検索する値を表す文字列。
2.fromIndex
メソッドが呼び出された文字列内の位置から検索を開始します。任意の整数を指定できます。デフォルト値は str.length です。負の場合は0として扱われます。 fromIndex > str.length の場合、fromIndex は str.length として扱われます。

大文字と小文字を区別します

lastIndexOf メソッドでは大文字と小文字が区別されます。たとえば、次の式は -1 を返します:

"Blue Whale, Killer Whale".lastIndexOf("blue"); // returns -1

lastIndexOf の使用法

// Create an array.
var ar = ["ab", "cd", "ef", "ab", "cd"];

// 找到最后一个CD的位置
document.write(ar.lastIndexOf("cd") + "<br/>");
// 输出: 4

// 从正数第二个位置,搜索倒数第一个CD的位置
document.write(ar.lastIndexOf("cd", 2) + "<br/>");
// 输出: 1

// 从倒数第三个搜索最后一个ab的位置
document.write(ar.lastIndexOf("ab", -3) + "<br/>");
// 输出: 0

String.lastIndexOf の使用法も同様です

"canal".lastIndexOf("a") // returns 3
"canal".lastIndexOf("a",2) // returns 1
"canal".lastIndexOf("a",0) // returns -1 从第0个往前搜,不存在'a',返回-1
"canal".lastIndexOf("x") // returns -1

lastIndexOf の IE8 実装

ただし、Microsoft の IE8 以下は Array.lastIndexOf をサポートしていないため、互換性のある実装が必要です。参照できます:

if (!Array.prototype.lastIndexOf) {
 Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) {
 'use strict';

 if (this === void 0 || this === null) {
  throw new TypeError();
 }

 var n, k,
  t = Object(this),
  len = t.length >>> 0;
 if (len === 0) {
  return -1;
 }

 n = len - 1;
 if (arguments.length > 1) {
  n = Number(arguments[1]);
  if (n != n) {
  n = 0;
  }
  else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) {
  n = (n > 0 || -1) * Math.floor(Math.abs(n));
  }
 }

 for (k = n >= 0
   &#63; Math.min(n, len - 1)
   : len - Math.abs(n); k >= 0; k--) {
  if (k in t && t[k] === searchElement) {
  return k;
  }
 }
 return -1;
 };
}

ES5-Slim を使用すると、古いブラウザを ES5 構文と完全に互換にすることができます。

for の使用を避けるべき理由

ただし、Array.prototype にメソッドを追加した後は、for in 構文で lastIndexOf メソッドも列挙されることに注意してください。

for (var idx in [1,3,5,7,9]) {
 console.log(idx)
}

>> 0 1 2 3 4 lastIndexOf

代わりに for ループを使用する必要があります

for (var idx = 0; idx < [1,3,5,7,9].length; idx++) {
 console.log(idx)
}

この問題は、列挙型の for の lastIndexOf メソッドを回避するために、Object.defineProperty を使用して実装できます。

Object.defineProperty(Array, "lastIndexOf", { enumerable: false })

ただし、一般的に互換性のある実装を必要とするブラウザは、defineProperty メソッドをまったくサポートしません。また、ほとんどのブラウザでは、for in は for ループよりもはるかに遅いため、for in の使用は避ける必要があります。しかし、オブジェクトのプロパティのキーを列挙するにはどうすればよいでしょうか? Object.keys({ a:1 }) を使用してキーの配列を返します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。