淺談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;
}
}