為JS擴充Array.prototype.indexOf引發的問題探討及解決_javascript技巧
Array沒有indexOf方法,這樣在一個陣列中查找某個元素的索引時比較麻煩,為了呼叫方便,於是透過prototype原型擴展了Array.prototype.indexOf(),這樣用起來就比較方便了。但是這個自訂的indexOf在對陣列進行遍歷的時候卻出現了問題。
Array沒有indexOf方法,這樣在一個數組中查找某個元素的索引時比較麻煩,為了調用方便,於是透過prototype原型擴展了Array.prototype.indexOf(),這樣用起來就比較方便了。
Array.prototype.indexOf = function(item) { 🎜>for (var i = 0; i if (this[i] == item)
return i;
}
return -1;
}
程式碼如下:
var index=arr.indexOf(1); //index==0
代碼如下:
var a=["張飛","關羽" ,"劉備","呂布"];
for(var p in a){
");
}
本來想輸出這四個人的名字,結果輸出的是什麼?
輸出的居然是:
//0=張飛
//1=關羽
//2=劉備
//3=呂布
//indexOf=function( item) { for (var i = 0; i 除了把名字打出來以外,還額外輸出了自己擴充的方法indexOf,但是令人瘋狂的是,firefox卻是「正常」的,只有四個人的人名,為什麼會這樣?
輸出indexOf,自己擴充的,可以理解,畢竟for..in是遍歷一個物件的所有使用者定義的屬性或一個陣列的所有元素。
那麼firefox為什麼不會呢?
後來查了資料才明白,
Array在javascript1.6版本已經支援Array.indexOf(),而我用的firefox是3.5版本,已經支援javascript1.8了,indexOf是其Array本身固有的方法了。
而IE,即使我用的是IE8,也才支援到javascript1.3版本。
所以IE8認為indexOf是“使用者定義的屬性”,而firefox認為是自己原生支援的固有的屬性。
真的是這樣嗎?
做個實驗,把indexOf更名為myIndexOf,再試試,結果IE和firefox都輸出myIndexOf,證明前面的觀點是正確。
那麼又來了個問題,我擴充indexOf很久了,現在不少專案的程式碼都已經在使用這個方法,而現在我非要使用for..in輸出陣列本身的元素,不要其他我自己擴充到俄羅斯方法,怎麼辦?
好在javascript提供了hasOwnProperty方法。
看一下其描述:
Every object descended from Object inherits the hasOwnProperty method. This method can be used to determine whether an object has the specified property as a direct property of that obke inject the like in object property of that inobject like in object, 片片does not check down the object's prototype chain
程式碼如下:
if(a.hasOwnProperty(p)){
");
}
程式碼如下:
function Book(title, author) {
this.title = title;
this.author = author;
}
Book.prototype.price = 9.99;
Object.prototype.copyright = "herongyang.com";
var myBook = new Book("JavaScript Tutorials", "Herong Yang");
// Dumping built-in properties at the base prototype level
document.writeln("/nObject.prototype's built-in properties:");
dumpProperty(Object.prototype, "constructor");
dumpProperty(Object.prototype, "hasOwnProperty");
dumpProperty(Object.prototype, "isPrototypeOf");
dumpProperty(Object.prototype, "toString");
dumpProperty(Object.prototype, "valueOf");
dumpProperty(Object.prototype, "copyright");
// Dumping built-in properties at the my prototype level
document.writeln("/n==================/nBook.prototype's built-in properties:");
dumpProperty(Book.prototype, "constructor");
dumpProperty(Book.prototype, "hasOwnProperty");
dumpProperty(Book.prototype, "isPrototypeOf");
dumpProperty(Book.prototype, "toString");
dumpProperty(Book.prototype, "valueOf");
dumpProperty(Book.prototype, "copyright");
// Dumping built-in properties at the object level
document.writeln("/n==================/nmyBook's built-in properties:");
dumpProperty(myBook, "constructor");
dumpProperty(myBook, "hasOwnProperty");
dumpProperty(myBook, "isPrototypeOf");
dumpProperty(myBook, "toString");
dumpProperty(myBook, "valueOf");
dumpProperty(myBook, "copyright");
function dumpProperty(object, property) {
var inheritance;
if (object.hasOwnProperty(property))
inheritance = "Local";
else
inheritance = "Inherited";
document.writeln(property ": " inheritance ": "
object[property]);
}
查看浏览器支持javascript到哪个版本:

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

標題:C#中使用Array.Sort函數對陣列進行排序的範例正文:在C#中,陣列是一種常用的資料結構,經常需要對陣列進行排序運算。 C#提供了Array類,其中有Sort方法可以方便地對陣列進行排序。本文將示範如何使用C#中的Array.Sort函數對陣列進行排序,並提供具體的程式碼範例。首先,我們要先了解Array.Sort函數的基本用法。 Array.So

在進行PHP編程時,我們常常需要將數組合併。 PHP提供了array_merge()函數來完成數組合併的工作,但是當數組中存在相同的鍵時,函數會覆寫原來的值。為了解決這個問題,PHP在語言中還提供了一個array_merge_recursive()函數,該函數可以合併數組並保留相同鍵的值,使得程式的設計變得更加靈活。 array_merge

在PHP中,有許多強大的陣列函數可以讓陣列的操作更加方便和快速。當我們需要將兩個陣列拼成一個關聯數組時,可以使用PHP的array_combine函數來實現這一操作。這個函數其實是用來將一個陣列的鍵當作另一個陣列的值,合併成一個新的關聯數組。接下來,我們將會講解如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組。了解array_comb

在PHP程式設計中,陣列是一種非常重要的資料結構,能夠輕鬆處理大量資料。 PHP中提供了許多陣列相關的函數,array_fill()就是其中之一。本篇文章將詳細介紹array_fill()函數的用法,以及在實際應用上的一些技巧。一、array_fill()函數概述array_fill()函數的作用是建立一個指定長度的、由相同的值組成的陣列。具體來說,該函數的語法

Java是一種非常強大的程式語言,廣泛應用於各種開發領域。但是,在Java程式設計過程中,開發人員常會遇到ArrayIndexOutOfBoundsException異常。那麼,這個異常的常見原因是什麼呢? ArrayIndexOutOfBoundsException是Java中常見的一個執行時期例外。它表示在存取資料時,數組下標超出了數組的範圍。常見的原因包括以

在PHP程式設計中,陣列是一個常用到的資料型別。而關於陣列的運算子也是相當多的,其中包含了array_change_key_case()函數。這個函數可以將數組中鍵名的大小寫轉換,從而方便我們進行資料的處理。本文就來介紹PHP中array_change_key_case()函數的使用方法。一、函數語法及參數array_change_ke

Python中的array模組是一個預先定義的數組,因此其在記憶體中佔用的空間比標準列表小得多,同時也可以執行快速的元素級別操作,例如添加、刪除、索引和切片等操作。此外,數組中的所有元素都是同一種類型,因此可以使用數組提供的高效數值運算函數,例如計算平均值、最大值和最小值等。另外,array模組還支援將數組物件直接寫入和讀取到二進位檔案中,這使得在處理大量數值資料時更加有效率。因此,如果您需要處理大量同質數據,可以考慮使用Python的array模組來優化程式碼的執行效率。要使用array模組,首先需要

在Java的開發中,我們經常使用陣列來儲存一系列的數據,因為陣列的便利性和效能優勢。但是,在使用陣列的過程中,會出現一些異常情況,其中一個常見的異常就是ArrayStoreException。當我們向數組中儲存不相容的資料類型時,就會拋出這個異常。這篇文章將介紹什麼是ArrayStoreException異常、它的產生原因,以及如何解決這個例外。一、Arr
