淺談Javascript indexOf的用法

關於JavaScript IndexOf的問題

樣例

朋友偶然問到這麼一個問題:

var person={name:"Nicholas"};var people=[{name:"Nicholas"}];var morepeople=[person];console.log(people.indexOf(person));// -1console.log(morepeople.indexOf(person));// 0

運行結果如圖所示:

查詢

經查詢w3school中定義indexOf的用法

定義

indexOf()方法可返回某個指定的字元串值在字元串中首次出現的位置

語法

stringObject.indexOf(searchvalue,fromindex)
參數描述
searchvalue必需。規定需檢索的字元串值。
fromindex可選的整數參數。規定在字元串中開始檢索的位置。它的合法取值是 0 到 stringObject.length - 1。如省略該參數,則將從字元串的首字元開始檢索。

說明

該方法將從頭到尾地檢索字元串 stringObject,看它是否含有子串 searchvalue。開始檢索的位置在字元串的 fromindex 處或字元串的開頭(沒有指定 fromindex 時)。如果找到一個 searchvalue,則返回 searchvalue 的第一次出現的位置。stringObject 中的字元位置是從 0 開始的。

Advertisements

解釋

W3cschool只是表述了通常的用法,那實際還是並不知曉indexOf的具體原理和用法。

猜測舉例

根據上圖的返回結果,列印輸出兩個數組對象。

數組對象的內容相同。

那麼如何判斷相等呢?

一般是假如兩者內容相同的話,可以將二者轉換成字元串。

(注意:此方法存在問題,如果是二者的元素名字順序不同,則轉換的字元串將不相同)

據上面猜測,二者的內容相同,那麼只可能是比較的是二者的引用地址了。

以下舉例證明:

官方文檔MDN

參考鏈接:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf

Advertisements

Array.prototype.indexOf()解釋:

語法

arr.indexOf(searchElement)

arr.indexOf(searchElement[, fromIndex = 0])

參數

searchElement

要查找的元素

fromIndex

開始查找的位置。如果該索引值大於或等於數組長度,意味著不會在數組裡查找,返回-1。如果參數中提供的索引值是一個負值,則將其作為數組末尾的一個抵消,即-1表示從最後一個元素開始查找,-2表示從倒數第二個元素開始查找 ,以此類推。 注意:如果參數中提供的索引值是一個負值,並不改變其查找順序,查找順序仍然是從前向後查詢數組。如果抵消后的索引值仍小於0,則整個數組都將會被查詢。其默認值為0.

描述

indexOf 使用strict equality (無論是 ===, 還是 triple-equals操作符都基於同樣的方法)進行判斷 searchElement與數組中包含的元素之間的關係。

拓展

Ie8不支持Array的indexOf方法,為了讓數組支持indexOf,可以書寫pollyfill支持。

可以參考谷歌V8引擎如何實現的:

https://github.com/v8/v8/blob/master/src/js/array.js

if (!Array.prototype.indexOf) {

Array.prototype.indexOf = function(item) {

for (var i = 0; i < this.length; i++) {

if(this[i]==item){

return i;

}

}

return -1;

}

}

Advertisements

你可能會喜歡