首頁 web前端 js教程 jquery中length屬性的使用方法詳解

jquery中length屬性的使用方法詳解

Jun 17, 2017 pm 01:16 PM
jquery length 使用方法 詳解

本文中,將會透過類別數組物件(array like object),探索javascript中的length屬性的一些秘密。

範例1: 

var obj={0:'a',1:'b'} 
alert(obj.length); //undefined 
var arr=['a','b'] 
alert(arr.length); // 2
登入後複製

從上面的範例看,類別陣列物件中的length屬性並不和它儲存的資料數量直接掛鉤,無論是索引屬性(0,1)還是length屬性都作為物件的普通屬性存在,它們之間並沒有任何關係,js引擎並不會根據儲存資料的數量來自動計算類別數組物件的長度。
但是類別數組物件的length所確實和儲存的資料量沒有任何關係麼?範例2說明並非如此:
範例2: 

function myarr(){} 
var m=new myarr(); 
Array.prototype.push.apply(m,['cson','lai','xiaoc']); 
alert(m.length);//IE8以下:undefined 其他浏览器:3 
alert(m[2]);//IE8以下:undefined 其他浏览器:‘xiaoc'
登入後複製

從範例2可以看到,除了IE8以下版本,在透過強制使用陣列方法為類別陣列物件新增元素時,物件的length屬性也會被計算。而IE8以下版本貌似不支援強制使用陣列方法為類別數組物件新增元素。
範例3:
此範例在範例2的myarr建構子中加入一個初始化操作,在類別陣列物件初始化時加入一個元素,怪異的事情發生了:

function myarr(){this[0]='cc';} 
var m=new myarr(); 
Array.prototype.push.apply(m,['cson','lai','xiaoc']); 
alert(m.length);//ie8以下:undefined 其他:3 
alert(m[2]);//ie8以下:undefined 其他:xiaoc
登入後複製

ie8以下版本瀏覽器繼續看似不支援強制使用陣列方法,這個再下一個例子中會作討論。而對於其他瀏覽器,length屬性輸出為3,而索引為2的元素是'xiaoc‘,顯然js引擎完全忽略了類別數組物件原來所存在的索引為0的元素‘cc'!馬上我們再看下一個例子,這個例子在例子3的基礎上多加一個對length屬性的初始化: 

function myarr(){this[0]='cc'; this.length=1;}//多加一个length的初始化 
var m=new myarr(); 
Array.prototype.push.apply(m,['cson','lai','xiaoc']); 
alert(m.length);//输出4 
alert(m[2]);//输出'lai‘
登入後複製

奇怪的事再次發生,這次所有瀏覽器(包括ie6 7)都正確輸出4,索引為2的元素正確輸出為'lai',可見IE 6 7加入了length屬性的初始化之後,可以正常使用陣列方法了。
現在再試試把length屬性初始化為不合法類型:
範例4: 

function myarr(){this[0]='cc'; this.length="bo";}//length设置为不能转换为number的不合法类型 
var m=new myarr(); 
Array.prototype.push.apply(m,['cson','lai','xiaoc']); 
alert(m.length);//输出 3 
alert(m[2]);// 输出'xiaoc‘
登入後複製
function myarr(){this[0]='cc'; this.length="1";}//length设置为能转换为数字的不合法类型 
Array.prototype.push.apply(m,['cson','lai','xiaoc']); 
alert(m.length);//输出4 
alert(m[2]);//输出'lai‘
登入後複製

從上面的所有例子來看,我們可以做出一個推斷,在使用陣列方法時(這裡以push為例),大概是這樣的流程:
IE6 7:
可見IE6 7並非不支強制持使用數組方法添加元素,但是會先判斷length屬性是否存在,如果不存在,則返回,不做任何操作。如果length屬性為不合法值,則嘗試轉換為number類型,如果轉換失敗則length設定為0,這就可以解析範例2,3裡輸出的undefined和範例4的正確輸出。

其他瀏覽器:
其他瀏覽器會根據length屬性作不同操作,如果length屬性不存在,則設定length為0,如果length屬性為不合法值,則嘗試轉換為number類型,如果轉換失敗則也length設定為0。

正因為length屬性對於陣列方法有如此決定性的作用,因此js引擎禁止了對length屬性寫入不合法值: 

var arr=['1','2','3']; 
arr.length='undefined';//报错invalid array length
登入後複製

從上面的例子中,我們可以得出一個結論:當我們使用類別數組物件時,為了避各種length計算不正確引起的怪異問題,我們應該在初始化類別數組物件時初始化length屬性的值,如果在初始化時添加了元素但卻沒有設定length屬性的值,使用陣列方法時,IE6 7會忽略所有操作,其他瀏覽器則會忽略初始化時所新增的元素。

另外再介紹length屬性帶來的另一個問題:
請看範例5: 

function myarr(){} 
myarr.prototype=new Array(); 
var m=new myarr(); 
m.push('cson','lai','xiaoc'); 
alert(m.length);//IE6 7:0 其他:3 
alert(m[2]);//所有浏览器:'xiaoc‘
登入後複製

當使用原型繼承陣列時,IE 6 7下length會永遠是0,無論你有多少個元素,其他瀏覽器則正常。
即使強制設定length屬性,IE6 7 下死活為0: 

function myarr(){} 
myarr.prototype=new Array(); 
var m=new myarr(); 
m.length=10; 
alert(m.length);//IE6 7:0 其他:10
登入後複製

因此得出結論:IE6 7下物件原型繼承數組時length屬性會一直為0,因此如果類別陣列物件需要使用數組的方法,不要去繼承數組,而應該使用Array.prototype.xxx.apply(obj,[]);的方法,並且記得正確初始化length屬性的值。

取得Object物件的length

  所有JS程式猿(甚至不只JS)都知道,陣列(Array)是有length的,透過length屬性,可以很方便的獲取數組的長度。可以說,只要使用到了數組,就必會使用到其length屬性。

  而Object物件是沒有length屬性或方法的,它確實沒有存在的必要,因為人們只會在乎該物件能提供什麼樣的方法,而沒有必要知道它到底有多少方法。的確,這確實不是一個普遍性的需求,

因此ECMAScript中也不會為自己增加額外的負擔。

  之前一直沒有考慮過這個問題,我們透過CGI取得數據,對於一條一條的數據,後台將其做成數組並以json返回。如下圖所示:

 try{callback({   
 data:[{a:1},{a:2}]    
 }); 
}catch(e){}
登入後複製

 这是非常合理的,因为我在前端可以用length得到数据的长度,并逐条将其插入表格,或者是通过其他的方式表现出来。但是你永远也不能用一成不变的思维方式来解决所有问题。

  某天写后台接口的同事决定换一种数据格式,改用object来表示数据,并为每个数据添加一个索引,如下所示:

try{callback({     
data:{1:{a:1},2:{a:2}}    
 });  
}catch(e){}
登入後複製

面对这样的数据,我就犯愁了,因为object不能获取对象长度。当然我可以叫后台同事改一下接口返回的格式,但是既然他可以写出以这样格式返回的代码,那其他的后台同事也同样

可以写出。为了不影响到更多的人,就需要我在前端来做处理了。其实要获取对象的长度也不难,用for in 语句就能实现,如下代码所示:

var a = {a:1,b:2,c:3,d:4};
function length(o) {
    var count = 0;
    for(var i in o){
        count ++;
    }
    return count;
};
alert(length(a));    //5
登入後複製

至于为什么是5而不是4那是因为每个对象都有一个内部属性(proto指向原型)。

  为了更方便的使用这个方法,可以把它写到Object原型里面去,如下代码所示:

var a = {a:1,b:2,c:3,d:4};
Object.prototype.length = function() {
    var count = 0;
    for(var i in this){
        count ++;
    }
    return count;
};
alert(a.length());    //5
登入後複製

  这样用起来会更直观,跟接近Array的使用习惯。

以上是jquery中length屬性的使用方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1324
25
PHP教程
1272
29
C# 教程
1251
24
DirectX修復工具怎麼用? DirectX修復工具詳細使用方法 DirectX修復工具怎麼用? DirectX修復工具詳細使用方法 Mar 15, 2024 am 08:31 AM

  DirectX修復工具是專業的系統工具,主要功能是偵測目前系統的DirectX狀態,如果發現異常就可以直接修復。可能還有很多用戶不清楚DirectX修復工具怎麼用吧,以下就來看看詳細教學。  1、使用修復工具軟體進行修復檢測。  2、如果修復完成後提示C++元件有異常的問題,請點選取消按鈕,然後點選工具選單列。  3、點選選項按鈕,選擇擴展,點選開始擴展按鈕。  4、擴展完成後再重新進行檢測修復即可。  5、如果修復工具操作完成後仍未解決問題,可以嘗試卸載重新安裝報錯的程序。

Win11管理員權限取得詳解 Win11管理員權限取得詳解 Mar 08, 2024 pm 03:06 PM

Windows作業系統是全球最受歡迎的作業系統之一,其新版本Win11備受矚目。在Win11系統中,管理員權限的取得是一個重要的操作,管理員權限可以讓使用者對系統進行更多的操作和設定。本文將詳細介紹在Win11系統中如何取得管理員權限,以及如何有效地管理權限。在Win11系統中,管理員權限分為本機管理員和網域管理員兩種。本機管理員是指具有對本機電腦的完全管理權限

Oracle SQL中的除法運算詳解 Oracle SQL中的除法運算詳解 Mar 10, 2024 am 09:51 AM

OracleSQL中的除法運算詳解在OracleSQL中,除法運算是一種常見且重要的數學運算運算,用來計算兩個數相除的結果。除法在資料庫查詢中經常用到,因此了解OracleSQL中的除法運算及其用法是資料庫開發人員必備的技能之一。本文將詳細討論OracleSQL中除法運算的相關知識,並提供具體的程式碼範例供讀者參考。一、OracleSQL中的除法運算

百度網盤怎麼用-百度網盤的使用方法 百度網盤怎麼用-百度網盤的使用方法 Mar 04, 2024 pm 09:28 PM

有很多朋友還不知道百度網盤怎麼用,所以下面小編就講解了百度網盤的使用方法,有需要的小伙伴趕緊來看一下吧,相信對大家一定會有所幫助哦。第一步:安裝好百度網盤後直接登入(如圖);第二步:接著可依頁面提示選擇「我的分享」與「傳輸清單」(如圖);第三步:在「好友分享」裡可以把圖片和檔案直接分享給好友(如圖所示);第四步:接著選擇「分享」後可勾選電腦檔案或是網盤檔案(如圖所示);第五步:然後就可以尋找好友(如圖所示);第六步:還可以在「功能寶箱」中尋找自己需要的功能(如圖所示)。上面就是小編為大

KMS啟動工具是什麼? KMS啟動工具怎麼用? KMS啟動工具使用方法? KMS啟動工具是什麼? KMS啟動工具怎麼用? KMS啟動工具使用方法? Mar 18, 2024 am 11:07 AM

KMS啟動工具是一種用來啟動微軟Windows和Office產品的軟體工具。 KMS是KeyManagementService的縮寫,即金鑰管理服務。 KMS啟動工具透過模擬KMS伺服器的功能,使得電腦可以連接到這個虛擬的KMS伺服器,從而實現對Windows和Office產品的啟動。 KMS激活工具體積小巧,功能強大,可以一鍵永久激活,無需聯網狀態就可以激活任何版本的window系統和任何版本的Office軟體,是目前最成功的且經常更新的Windows激活工具,今天小編就跟大家介紹一下kms激活工

potplayer怎麼用-potplayer的使用方法 potplayer怎麼用-potplayer的使用方法 Mar 04, 2024 pm 06:10 PM

potplayer是一款非常強大的媒體播放器,但不少夥伴還不知道potplayer怎麼用,今天小編就來詳細介紹一下potplayer的使用方法,希望能幫助大家。 1.PotPlayer快捷鍵PotPlayer播放器預設常用快捷鍵如下:(1)播放/暫停:空格(2)音量:滑鼠滾輪,上下方向鍵(3)前進/後退:左右方向鍵(4)書籤:P-加入書籤,H-查看書籤(5)全螢幕/還原:Enter(6)倍速:C-加速,X-減速,Z-復位(按一次調整0.1倍速度,可以在0.2到12倍速之間調節)( 7)上/下一幀:D/

小馬win7啟動工具如何使用-小馬win7啟動工具使用的方法 小馬win7啟動工具如何使用-小馬win7啟動工具使用的方法 Mar 04, 2024 pm 06:16 PM

相信很多用戶都在使用小馬win7激活工具,但是你們知道小馬win7激活工具如何使用嗎?接著,小編就帶來了小馬win7激活工具使用的方法,對此感興趣的用戶快來下文看看吧。第一步,在重裝系統後,進入“”我的電腦,點擊上方選單中的“系統屬性”,查看Windows啟動狀態。第二步,點選上網下載win7啟動工具,點選打開,(資源很多哪裡都有)。第三步,開啟小馬啟動工具後,點選「一件永久啟動Windows」。第四步,等待啟動程序完成啟動。第五步,再次查看Windows啟動狀態,發現系統已啟動。

PHP模運算子的作用及用法詳解 PHP模運算子的作用及用法詳解 Mar 19, 2024 pm 04:33 PM

PHP中的模運算子(%)是用來取得兩個數值相除的餘數的。在本文中,我們將詳細討論模運算子的作用及用法,並提供具體的程式碼範例來幫助讀者更好地理解。 1.模運算子的作用在數學中,當我們將一個整數除以另一個整數時,就會得到一個商和一個餘數。例如,當我們將10除以3時,商數為3,餘數為1。模運算子就是用來取得這個餘數的。 2.模運算子的用法在PHP中,使用%符號來表示模

See all articles