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