一.數(shù)組
? ? ? ? 1>數(shù)組就是存儲(chǔ)一系列值的饰迹,任何類型的數(shù)據(jù)再扭,都可以放入數(shù)組
????????????var?arr?=?[2,?'2',?false,{a:1},?[1,2,3],function(){return true;},undefined,null]
????????????console.log(arr)
? ? ? ? ? ?2>多維數(shù)組:
????????????????????????? var?arr=[[22,33],[45,54]]
? ? ? ? ? ? ? ? ? ? ? ? ? var?arr=[[[232],[32]],[[2342],[232]]]
? ? ? ? ? ? ? ? ? ? ? ? ? ?console.log(arr[0][0][0])//232
? ? ? ? ? ? 3>數(shù)組類型其實(shí)是一個(gè)object
????????????????????????????var?arr=[112,23,3,4]
????????????????????????????console.log(typeof?arr)//object
? ??????????????????????????console.log(Object.keys(arr))//?["0", "1", "2", "3"]
? ? ? ? ? ? ? ? 1)Object.keys返回?cái)?shù)組中的所有鍵值
? ??????????????????????????arr['0']// 112
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arr[0]//112
? ? ? ? ? ? ? ? ? ?在這里字符串0和數(shù)字0都能獲取數(shù)組中對(duì)應(yīng)的數(shù)據(jù),鍵名其實(shí)是string類型励背,如果你寫的是number類型,它可以自動(dòng)轉(zhuǎn)化為string類型
? ??????????????????????????var?arrKeys=Object.keys(arr)
????????????????????????????console.log(typeof?arrKeys[0])//string
? ? ? ? ? ? ? ? ?2)如果想獲取數(shù)組中某個(gè)元素
? ??????????????????????????var?arr=[112,23,3,4];
????????????????????????????arr.0// 報(bào)錯(cuò)-----因?yàn)閿?shù)值型不能單獨(dú)作為標(biāo)識(shí)符
二、數(shù)組屬性
? ? ? ? ? ? 1>length獲取數(shù)組長度
????????????????????????var?arr=[112,23,3,4];? ??????????????
????????????????????????console.log(arr.length)//4
? ? ? ? ? ? ? ? ? ? ? ? 1)
?????????????????????????????var?arr=[112,23,3,4]
?????????????????????????????arr[7]=7//添加修改元素
???????????????????????????? console.log(arr,arr.length)
? ? ? ? ? ? ? ? ? ? ? ?2)將數(shù)組長度改成比當(dāng)前數(shù)組長度小的值日缨,那么arr會(huì)自動(dòng)刪除arr長度后面的值。如果修改的length比當(dāng)前數(shù)組長度長掖看,那么則自動(dòng)添加匣距,只不過添加的都是empty(空位)
? ??????????????????????????????var?arr=[112,23,3,4]//arr.length是4
?????????????????????? ? ? ? ???arr.length=2
????????????????????????????????console.log(arr)//[112,?23]---數(shù)組后面的3、4元素都被刪了
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??arr.length=10
? ??????????????????????????????console.log(arr)//[112, 23, empty × 8]//添加了8個(gè)空位
????????????????????????????????console.log(arr[5])//undefined
? ? ? ? ? ? ? ? ? ? ? ? 注意:如果length不合法哎壳,報(bào)錯(cuò)
? ? ? ? ? ? ? ? ? ? ? 3)
? ????????????????????????????var?arr?=[1,23,5]
??????????????????? ? ? ? ? ?arr[0.03]=3
???????????????????????????? arr['xiaoming']='xm'
?????????????????? ? ? ? ? ??console.log(arr,'arr')
? ? ? ? ? ? ? ? ? ? ? ? ? ?看到上圖? length是3毅待。為什么我們添加了鍵名0.03、xiaoming兩個(gè)鍵名归榕,但length是3呢尸红?length屬性的值就是等于最大的數(shù)字鍵加1,這里面最大的數(shù)字鍵是2刹泄,所以length是2+1是3外里。
三、in 運(yùn)算符:檢查某個(gè)鍵名是否存在特石,可用于對(duì)象和數(shù)組盅蝗。? ? ? ? ? ? ? ? ? ??
????????????????????var?arr?=[1,23,5]
? ??????????????????console.log(1?in?arr)//true
? ??????????????????console.log(2?in?arr)//true
? ??????????????????console.log('2'?in?arr)//true
????????????????????console.log(6?in?arr)//false----因?yàn)閍rr鍵名只有0,1姆蘸,2所以輸出false
? ? ? ? ? ? ? ? ? ? arr.lenght=10
????????????????????console.log(8?in?arr)//false----因?yàn)?這里是空位(empty)
四墩莫、數(shù)組空位:
? ? ? ? 1>數(shù)組中兩個(gè)逗號(hào)之間沒有值。不影響length逞敷,獲取空位上的元素時(shí)是undefined狂秦,但實(shí)際上是沒有值,可以讀到length但是獲取不到鍵名
????????var?arr=[23,,,89]
????????console.log(arr.length)//4
? ??????console.log(arr[1])//undefined
? ? ? ?2> 使用delete命令刪除一個(gè)數(shù)組成員推捐,會(huì)形成空位故痊,并且不會(huì)影響length屬性。
????????var?arr?=[1,,23,5]
????????delete?arr[1]//[1,?empty,?23,?5]玖姑,arr.length還是4
????????delete?arr[2]//[1,?empty?×?2,?5]愕秫,arr.length還是4
? ? ? ? delete對(duì)象中的成員
????????var?obj={
????????????a:'222',
????????????b:'333',
????????????c:'44'
????????}
????????delete?obj.a
? ? ? ? 這時(shí)候obj就變成了{(lán)b: "333", c: "44"}
? ? ? ? 3>空位和undefined的區(qū)別
? ? ? ? ? ?1)空位
????????????? ????var?arr?=?[,?,?,];
?????????????????arr.forEach(function?(x,?i)?{
????????????????????console.log(i?+'-------------'+?x);//?沒有產(chǎn)生任何輸出
??????????????????})
? ? ? ? ? ????? ?for?(var?key?in?arr)?{
??????????????????????console.log(key);?//?沒有產(chǎn)生任何輸出
??????????????????}
??????????????????let?keys=Object.keys(arr)
??????????????????console.log(keys)//?[]
? ? ? ? ? ? 2)undefined
? ??????????????????var?arr?=?[111,221,undefined,444];
????????????????????arr.forEach(function?(x,?i)?{
????????????????????????console.log(i?+?'-------------'?+?x);
????????????????????})
????????????????????//0-------------111
????????????????????// 1-------------221
????????????????????//2-------------undefined
????????????????????//3-------------444
????????????????????for?(var?key?in?arr)?{
????????????????????????console.log(key);
????????????????????}
????????????????????//0
? ? ? ? ? ? ? ? ? ? //1
? ? ? ? ? ? ? ? ? ? //2
? ? ? ? ? ? ? ? ? ? //3
????????????????????let?keys=Object.keys(arr)
? ? ? ? ? ? ? ? ? ? ?//["0", "1", "2", "3"]
? ? ? ? ? ? ?總結(jié):空位,使用數(shù)組的forEach方法焰络、for...in結(jié)構(gòu)戴甩、以及Object.keys方法進(jìn)行遍歷,空位都會(huì)被跳過遍歷闪彼。而鍵值是undefined則不會(huì)跳過遍歷
五甜孤、類似數(shù)組的對(duì)象
? ? 1>????var obj = {0:'a',1:'b',2:'c',length:3}
????????????obj[0]// 'a'
????????????obj[1]// 'b'
????????????obj.length// 3
????????????obj.push('d')// error
? ????????? 這個(gè)obj就是一個(gè)類似數(shù)組的對(duì)象协饲,但他不是數(shù)組,因?yàn)樗痪邆鋽?shù)組特有的方法
? ????????? “類似數(shù)組的對(duì)象”的根本特征缴川,就是具有l(wèi)ength屬性茉稠。只要有l(wèi)ength屬性,就可以認(rèn)為這個(gè)對(duì)象類似于數(shù)組把夸。但是有一個(gè)問題而线,這種length屬性不是動(dòng)態(tài)值,不會(huì)隨著成員的變化而變化恋日。
? ? 2>有哪些常見的‘類似數(shù)組對(duì)象’
????????1).函數(shù)的arguments對(duì)象
? ? ? ??????function?args()?{?return?arguments?}
????????????var?arrayLike?=?args('str1',?'str2');
? ? ? ? ? ? console.log(arrayLike)//2
????????????console.log(arrayLike?instanceof?Array)//false
? ? ? ? 2).大多數(shù) DOM 元素集
? ???????????var?domArray?=?document.querySelectorAll('div');
????????????console.log(domArray.length)//4
? ? ? ? ? ? console.log(domArray?instanceof?Array)//false
? ? ? ? 3).字符串
? ??????????var?str='aedtee'
????????????str?instanceof?Array?//?false
????????????console.log(str.length)//6
????????????console.log(str)//false
? ? 3>“類似數(shù)組對(duì)象”怎么使用Array上的方法
? ? ? ? 1)數(shù)組的slice方法膀篮,讓“類似數(shù)組對(duì)象”變成真正數(shù)組
? ??????????????var arr =Array.prototype.slice.call(arrayLike);
? ??????????????console.log(arr?instanceof?Array)//true
? ? ? ? 2)call()把數(shù)組的方法放到對(duì)象上面
? ??????????????Array.prototype.forEach.call(arrayLike,?function(value,?index){
????????????????????console.log(index?+?'?:?'?+?value);
????????????????});
? ? ? ? ? ? ????通過call(),把forEach()繼承到arrayLike上面岂膳。
? ? ? ? ? ? ? ? 注意誓竿,這種從Array中繼承的forEach比數(shù)組forEach要慢。建議先將“類似數(shù)組對(duì)象“轉(zhuǎn)化為真正的數(shù)組谈截,再使用筷屡。