?? JS里的"數(shù)組"不是數(shù)組诸尽,而是對象
js里的數(shù)組和其他語言中的數(shù)組是不同的骤肛,實際它并不是數(shù)組,而是一種array-like 特性的對象加酵。
它只是把索引轉(zhuǎn)化成字符串速种,用作其屬性(鍵)姜盈。
例如:
var arr = ['a','b','c']
// 實際上 等價于
var obj = {
'0': 'a',
'1': 'b',
'2': 'c'
}
這也正是為什么 typeof arr = object 的原因。
js 里的 數(shù)組 操作起來和其他語言中的數(shù)組 操作相似配阵,比如Java馏颂。
但是同時js里的數(shù)組還能做到像Java這樣強類型語言里的數(shù)組 做不到的地方。
// js 單個數(shù)組中的元素可以有多種數(shù)據(jù)類型
var arr = [1,'2',false,[1]]; // 數(shù)據(jù)類型同時包括數(shù)字棋傍,字符串救拉,布爾值,數(shù)組
而Java 里的單個數(shù)組里的元素只能是同一種數(shù)據(jù)類型瘫拣,例如如果聲明了int 數(shù)組亿絮,那么里面的元素就全是int類型的數(shù)據(jù)
毫無疑問,JS里的“數(shù)組”操作起來更加方便麸拄,但是這是犧牲性能換來的派昧。
真正的數(shù)組是一段線性分配的內(nèi)存,所以它操作起來速度更加快拢切。
?? 聲明數(shù)組的方法
// 1. 直接創(chuàng)建
var arr = []; //[] 空數(shù)組
// 2. new
var arr = new Array(); //[] 空數(shù)組
var arr = new Array(1,2,3); //[1,2,3]
對于數(shù)據(jù)中沒有初始化的元素蒂萎,它的值是undefined;
var arr = [1,2]; //[1,2]
console.log(arr[2]); // undefined
?? 數(shù)組中的length屬性
Js“數(shù)組”中l(wèi)ength是一個奇怪的屬性
它的結(jié)果并不完全可信。一般數(shù)據(jù)里的length指的是數(shù)組中有值元素的個數(shù)
而js里的length并不是淮椰。
var arr = []; //[]
console.log(arr.length); // 0
arr[5] = 1000;
console.log(arr.length); // 1? 6?
答案是6五慈,但數(shù)組 arr 實際有值的就一個。
js里的length 指的是 這個數(shù)組的最大整數(shù)屬性名加上1主穗,它不一定等于數(shù)組里屬性的個數(shù)泻拦。
此外,js里的length忽媒,你還可以隨意的把它變大變小争拐,(簡稱隨地大小變)
var arr = [1,2,3];
arr.length = 1;
console.log(arr); // 猜一下arr現(xiàn)在等于什么
對,你沒有猜錯猾浦,arr 此時只剩下一個元素了陆错,[1]
通過將length變小灯抛,可以去掉所有屬性名大于等于length的值
通過這一點金赦,我們可以更加方便的刪除元素。
arr.length = 0; //清空數(shù)組
arr.length = arr.length-1; //去除掉末尾元素
?? 如何判定一個對象是數(shù)組
通過前面的講解对嚼,我們已經(jīng)知道了Js里的數(shù)組實際是一個對象夹抗,
通過 typeof 來判斷也是對象
那我們怎么判定一個數(shù)組是我們想要的js數(shù)組呢。
function isArray(obj){
return Object.prototype.toString.apply(obj) === '[object Array]';
//這個可以直接拿去用纵竖,可確保是正確的
}
?? 數(shù)組的枚舉
let arr = [1,2,3];
// 1. 普通for循環(huán)
for (let i = 0 ; i<arr.length ; i++){
console.log(arr[i]);
}
// 2. for in 循環(huán) (獲取到的是索引)
for (let index in arr){
console.log(arr[index]);
}
// 3. ES6新增 增強for循環(huán) (獲取到的是元素的值)
for(let item of arr){
console.log(item);
}
// 4. forEach 循環(huán)
arr.forEach(function(item,index){
console.log(index,item);
})
?? 數(shù)組的方法
任何語言對于數(shù)據(jù)的操作少不了增刪改查漠烧,我們就先從這四個角度去看杏愤。
查
根據(jù)屬性名去訪問就好了 arr[index]
刪
//arr.shift() 刪除第一個元素并返回
let arr = [1,2,3];
let element = arr.shift(); //element 是 1
console.log(element);
//arr.pop() 刪除最后一個元素并返回
arr = [1,2,3];
element = arr.pop(); //element 是 3
console.log(element);
增
// 和刪除相對應,增加也有從頭部增加和尾部增加
// 插入單個元素
// 1. 從頭部插入 arr.unshift(item...)
let arr = [1,2,3];
arr.unshift(0);
console.log(arr); //[0,1,2,3]
// 2. 從尾部插入 arr.push(item...)
arr = [1,2,3];
arr.push(4);
console.log(arr); //[1,2,3,4]
// 插入多個元素
// 顯然如果插入多個元素已脓,我們一個個去push是很麻煩的珊楼,所以提供了一個方法
// arr.concat(item...) concat 這個單詞的含義是合并數(shù)組;
arr1 = [1,2];
arr2 = [3,4];
arr = arr1.concat(arr2);
console.log(arr); //[1,2,3,4] & arr1 沒有改變 還是[1,2]
// 關于從任意位置插入,在修改里面會講
改
// 根據(jù)索引修改
arr[index] = value;
// 數(shù)組修改其實要記一個 arr.splice(start,deleteCount,item...)
/**
* 參數(shù) start:開始的索引
* deleteCount : 刪除元素的個數(shù)
* item: 要插入的元素值
* 返回值 被刪除的元素數(shù)組
*/
let arr = [1,2,3];
let a = arr.splice(0,1,'test'); //從0開始刪除一個元素度液,并在這個位置插入元素'test'
console.log(arr); //["test",1,2]
console.log(a); // [1]
額外
- 數(shù)組轉(zhuǎn)字符串
/**
* arr.join(separator)
* 數(shù)組轉(zhuǎn)字符串 把數(shù)組的每個元素拿出來厕宗,用separator將他們分隔開來
* 參數(shù) separator 分隔符
*/
let arr = [1,2,3];
let c = arr.join(','); //1,2,3 將arr數(shù)組中的元素用逗號分割,并轉(zhuǎn)換成字符串
console.log(c);
//其實等價于
let str = "";
for (item of arr){
str += (item+',');
}
str = str.substr(0,str.length-1); //去除掉最后一個逗號
console.log(str);
- 數(shù)組復制
/**
* 有的時候我們想復制數(shù)組中的一段元素堕担,但是我們不想改變原數(shù)組
* 就用 arr.slice(start,end)
* 參數(shù) start 開始索引
* end 結(jié)束索引
* 實際獲取的元素是 [start,end) 左閉,右開 R崖!霹购!
* 基本上所有語言佑惠,(start,end)都是這樣的規(guī)定
*/
let arr = [1,2,3];
let temp = arr.slice(0,2);
console.log(temp); //[1,2]
- 數(shù)組反轉(zhuǎn)
/**
* 使用arr.reverse()反轉(zhuǎn)數(shù)組
*/
let arr = [1,2,3];
arr.reverse() // 直接改變原數(shù)組
console.log(arr); // [3,2,1]
本文中,因為js里的數(shù)組實際就是對象齐疙,所以所有數(shù)組的索引都叫做屬性名膜楷。