js基础(数组)--数组类型、类数组对象、作为数组的字符串
生活随笔
收集整理的這篇文章主要介紹了
js基础(数组)--数组类型、类数组对象、作为数组的字符串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.數組類型
我們到處都可以看見數組是具有特殊行為的對象。給定一個未知的對象,判定它是否為數組通常非常 有用。在ECMAScript 5中,可以使用Array.isArray()函數來做這件事情:Array.isArray([])//=>true Array.isArray({})//=>false但是,在ECMAScript 5以前,要區分數組和非數組對象卻很困難。instanceof操作符只能用于簡單的情形:[]instanceof Array//=>true ({})instanceof Array//=>false解決方案是檢查對象的類屬性。對數組而言該屬性的值總是"Array",因此在ECMAScript 3中 isArray()函數的代碼可以這樣書寫:var isArray=Function.isArray||function(o){return typeof o==="object"&& Object.prototype.toString.call(o)==="[object Array]"; };實際上,此處類屬性的檢測就是ECMAScript 5中Array.isArray()函數所做的事情。獲得對象類屬 性的技術使用了Object.prototype.toString()方法。復制代碼2.類數組對象
我們已經看到,JavaScript數組的有一些特性是其他對象所沒有的:1·當有新的元素添加到列表中時,自動更新length屬性。2·設置length為一個較小值將截斷數組。3·從Array.prototype中繼承一些有用的方法。4·其類屬性為"Array"。這些特性讓JavaScript數組和常規的對象有明顯的區別。但是它們不是定義數組的本質特性。一 種常常完全合理的看法把擁有一個數值length屬性和對應非負整數屬性的對象看做一種類型的數組。以下代碼為一個常規對象增加了一些屬性使其變成類數組對象,然后遍歷生成的偽數組的“元素”:var a={};//從一個常規空對象開始 //添加一些屬性,稱為"類數組" var i=0; while(i<10){a[i]=i*i;i++; }a.length=i;//現在,當做真正的數組遍歷它 var total=0; for(var j=0;j<a.length;j++) total+=a[j];例如Arguments對象就是一個類數組對象。在客戶端JavaScript中,一些DOM方法(如 document.getElementsByTagName())也返回類數組對象。下面有一個函數可以用來檢測類數 組對象://判定o是否是一個類數組對象 //字符串和函數有length屬性,但是它們 //可以用typeof檢測將其排除。在客戶端JavaScript中,DOM文本節點 //也有length屬性,需要用額外判斷o.nodeType!=3將其排除function isArrayLike(o){if(o&&//o非null、undefined等typeof o==="object"&&//o是對象isFinite(o.length)&&//o.length是有限數值o.length>=0&&//o.length為非負值o.length===Math.floor(o.length)&&//o.length是整數o.length<4294967296)//o.length<2^32return true;//o是類數組對象 elsereturn false;//否則它不是 }JavaScript數組方法是特意定義為通用的,因此它們不僅應用在真正的數組而且在類數組對象上 都能正確工作。在ECMAScript 5中,所有的數組方法都是通用的。在ECMAScript 3中,除了 toString()和toLocaleString()以外的所有方法也是通用的。(concat()方法是一個特例: 雖然可以用在類數組對象上,但它沒有將那個對象擴充進返回的數組中。)既然類數組對象沒有 繼承自Array.prototype,那就不能在它們上面直接調用數組方法。盡管如此,可以間接地使用 Function.call方法調用:var a={"0":"a","1":"b","2":"c",length:3};//類數組對象 Array.prototype.join.call(a,"+")//=>"a+b+c" Array.prototype.slice.call(a,0)//=>["a","b","c"]:真正數組的副本 Array.prototype.map.call(a,function(x){ return x.toUpperCase(); })//=>["A","B","C"]:ECMAScript 5數組方法是在Firefox 1.5中引入的。由于它們的寫法的一般性,Firefox還將這 些方法的版本在Array構造函數上直接定義為函數。使用這些方法定義的版本,上述例子就可以 這樣重寫:var a={"0":"a","1":"b","2":"c",length:3};//類數組對象 Array.join(a,"+") Array.slice(a,0) Array.map(a,function(x){return x.toUpperCase();})當用在類數組對象上時,數組方法的靜態函數版本非常有用。但既然它們不是標準的,不能期望 它們在所有的瀏覽器中都有定義。可以這樣書寫代碼來保證使用它們之前是存在的:Array.join=Array.join||function(a,sep){return Array.prototype.join.call(a,sep); }; Array.slice=Array.slice||function(a,from,to){return Array.prototype.slice.call(a,from,to); }; Array.map=Array.map||function(a,f,thisArg){return Array.prototype.map.call(a,f,thisArg); }復制代碼3.作為數組的字符串
在ECMAScript 中,字符串的行為類似于只讀的數組。除了用charAt()方法來訪問單個的字符以 外,還可以使用方括號:var s=test; s.charAt(0)//=>"t" s[1]//=>"e"當然,針對字符串的typeof操作符仍然返回"string",但是如果給Array.isArray()傳遞字符串, 它將返回false。可索引的字符串的最大的好處就是簡單,用方括號代替了charAt()調用,這樣更加簡潔、可讀并且 可能更高效。不僅如此,字符串的行為類似于數組的事實使得通用的數組方法可以應用到字符串上。 例如:s="JavaScript" Array.prototype.join.call(s,"")//=>"JavaScript" Array.prototype.filter.call(s,//過濾字符串中的字符 function(x){ return x.match(/[^aeiou]/);//只匹配非元音字母 }).join("")//=>"JvScrpt"請記住,字符串是不可變值,故當把它們作為數組看待時,它們是只讀的。如push()、sort()、 reverse()和splice()等數組方法會修改數組,它們在字符串上是無效的。不僅如此,使用數組方 法來修改字符串會導致錯誤:出錯的時候沒有提示。復制代碼總結
以上是生活随笔為你收集整理的js基础(数组)--数组类型、类数组对象、作为数组的字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于大数据的用户行为预测
- 下一篇: ES6 - let、const与作用