摘要:數組的本質數組屬于一種特殊的對象。運算符會返回數組的類型是對象的鍵名一律為字符串,所以,數組的鍵名其實也是字符串。數組的空位讀取遍歷無兩個逗號之間沒有任何值,我們稱該數組存在空位。數組的方法可以將類似數組的對象變成真正的數組。
定義
數組的本質
length 屬性
in 運算符
for...in 循環和數組的遍歷
數組的空位
類似數組的對象
參考鏈接
1.定義
任何類型的數據,都可以放入數組。
var arr = [
{a: 1},
[1, 2, 3],
function() {return true;}
];
arr[0] // Object {a: 1}
arr[1] // [1, 2, 3]
arr[2] // function (){return true;
如果數組的元素還是數組,就形成了多維數組。
var a = [[1, 2], [3, 4]];
a0 // 2
a1 // 4
2.數組的本質
數組屬于一種特殊的對象。typeof運算符會返回數組的類型是object
var arr = ["a", "b", "c"];
Object.keys(arr)
// ["0", "1", "2"]
對象的鍵名一律為字符串,所以,數組的鍵名其實也是字符串。之所以可以用數值讀取,是因為非字符串的鍵名會被轉為字符串。
var arr = ["a", "b", "c"];
arr["0"] // "a"
arr[0] // "a"
對象的鍵名一律為字符串,所以,數組的鍵名其實也是字符串。之所以可以用數值讀取,是因為非字符串的鍵名會被轉為字符串。
var arr = ["a", "b", "c"];
arr["0"] // "a"
arr[0] // "a"
3.length 屬性
只要是數組,就一定有length屬性。該屬性是一個動態的值,等于鍵名中的最大整數加上1。
var arr = ["a", "b"];
arr.length // 2
arr[2] = "c";
arr.length // 3
arr[9] = "d";
arr.length // 10
arr[1000] = "e";
arr.length // 1001
清空數組的一個有效方法,就是將length屬性設為0。
var arr = [ "a", "b", "c" ];
arr.length = 0;
arr // []
讀取新增的位置都會返回undefined。
值得注意的是,由于數組本質上是一種對象,所以可以為數組添加屬性,但是這不影響length屬性的值。
var a = [];
a["p"] = "abc";
a.length // 0
a[2.1] = "abc";
a.length // 0
上面代碼將數組的鍵分別設為字符串和小數,結果都不影響length屬性。因為,length屬性的值就是等于最大的數字鍵加1,而這個數組沒有整數鍵,所以length屬性保持為0。
如果數組的鍵名是添加超出范圍的數值,該鍵名會自動轉為字符串。
var arr = [];
arr[-1] = "a";
arr[Math.pow(2, 32)] = "b";
arr.length // 0
arr[-1] // "a"
arr[4294967296] // "b"
4.in 運算符
檢查某個鍵名是否存在的運算符in,適用于對象,也適用于數組。
注意,如果數組的某個位置是空位,in運算符返回false。
var arr = [];
arr[100] = "a";
100 in arr // true
1 in arr // false
上面代碼中,數組arr只有一個成員arr[100],其他位置的鍵名都會返回false。
5.for...in 循環和數組的遍歷
得到建值
var a = [1, 2, 3];
for (var i in a) {
console.log(a[i]);
}
// 1
// 2
// 3
但是,for...in不僅會遍歷數組所有的數字鍵,還會遍歷非數字鍵。
var a = [1, 2, 3];
a.foo = true;
for (var key in a) {
console.log(key);
}
// 0
// 1
// 2
// foo
上面代碼在遍歷數組時,也遍歷到了非整數鍵foo。所以,不推薦使用for...in遍歷數組。
數組的遍歷可以考慮使用for循環或while循環。
var a = [1, 2, 3];
// for循環
for(var i = 0; i < a.length; i++) {
console.log(a[i]);
}
// while循環
var i = 0;
while (i < a.length) {
console.log(a[i]);
i++;
}
var l = a.length;
while (l--) {
console.log(a[l]);
}
上面代碼是三種遍歷數組的寫法。最后一種寫法是逆向遍歷,即從最后一個元素向第一個元素遍歷。
var colors = ["red", "green", "blue"];
colors.forEach(function (color) {
console.log(color);
});
// red
// green
// blue
6.數組的空位delete length 讀取un 遍歷無
兩個逗號之間沒有任何值,我們稱該數組存在空位(hole)。
var a = [1, , 1];
a.length // 3但是非數字的不影響length 用delete也不影響
var a = [1, 2, 3];
delete a[1];
a[1] // undefined
a.length // 3
上面代碼用delete命令刪除了數組的第二個元素,這個位置就形成了空位,但是對length屬性沒有影響。也就是說,length屬性不過濾空位。所以,使用length屬性進行數組遍歷,一定要非常小心
數組的空位是可以讀取的,返回undefined。但是
如果是空位,使用數組的forEach方法、for...in結構、以及Object.keys方法進行遍歷,空位都會被跳過。
空值為undefined
如果某個位置是undefined,遍歷的時候就不會被跳過。
var a = [undefined, undefined, undefined];
a.forEach(function (x, i) {
console.log(i + ". " + x);
});
// 0. undefined
// 1. undefined
// 2. undefined
for (var i in a) {
console.log(i);
}
// 0
// 1
// 2
Object.keys(a)
// ["0", "1", "2"]
這就是說,空位就是數組沒有這個元素,所以不會被遍歷到,而undefined則表示數組有這個元素,值是undefined,所以遍歷不會跳過。
7.類似數組的對象
如果一個對象的所有鍵名都是正整數或零,并且有length屬性,那么這個對象就很像數組,語法上稱為“類似數組的對象
var obj = {
0: "a",
1: "b",
2: "c",
length: 3
};
obj[0] // "a"
obj[1] // "b"
obj.length // 3
obj.push("d") // TypeError: obj.push is not a function
沒有push方法
length靜態的
典型的“類似數組的對象”是函數的arguments對象,以及大多數 DOM 元素集,還有字符串。
// arguments對象
function args() { return arguments }
var arrayLike = args("a", "b");
arrayLike[0] // "a"
arrayLike.length // 2
arrayLike instanceof Array // false
// DOM元素集
var elts = document.getElementsByTagName("h3");
elts.length // 3
elts instanceof Array // false
// 字符串
"abc"[1] // "b"
"abc".length // 3
"abc" instanceof Array // false
上面代碼包含三個例子,它們都不是數組(instanceof運算符返回false),但是看上去都非常像數組。
數組的slice方法可以將“類似數組的對象”變成真正的數組。
var arr = Array.prototype.slice.call(arrayLike);
除了轉為真正的數組,“類似數組的對象”還有一個辦法可以使用數組的方法,就是通過call()把數組的方法放到對象上面。
function print(value, index) {
console.log(index + " : " + value);
}
Array.prototype.forEach.call(arrayLike, print);
上面代碼中,arrayLike代表一個類似數組的對象,本來是不可以使用數組的forEach()方法的,但是通過call(),可以把forEach()嫁接到arrayLike上面調用。
下面的例子就是通過這種方法,在arguments對象上面調用forEach方法。
// forEach 方法
function logArgs() {
Array.prototype.forEach.call(arguments, function (elem, i) {
console.log(i + ". " + elem);
});
}
// 等同于 for 循環
function logArgs() {
for (var i = 0; i < arguments.length; i++) {
console.log(i + ". " + arguments[i]);
}
}
字符串也是類似數組的對象,所以也可以用Array.prototype.forEach.call遍歷。
Array.prototype.forEach.call("abc", function (chr) {
console.log(chr);
});
// a
// b
// c
注意,這種方法比直接使用數組原生的forEach要慢,所以最好還是先將“類似數組的對象”轉為真正的數組,然后再直接調用數組的forEach方法。
var arr = Array.prototype.slice.call("abc");
arr.forEach(function (chr) {
console.log(chr);
});
// a
// b
// c
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106049.html
摘要:空指針異常原因數組已經不在指向堆內存了。當訪問數組不存在的索引時,就會出現數組索引越界異常數組的操作遍歷掌握案例演示數組遍歷就是依次輸出數組中的每一個元素。內循環控制的是一維數組的長度。 1.數組概述和定義格式說明 A:為什么要有數組(容器): 為了存儲同種數據類型的多個值 B:數組概念: 數組是存儲同一種數據類型多個元素的集合。也可以看成是一個容器;數組既可以存儲基本數據類型,也可...
摘要:下文統一稱為數組是存儲單一數據類型的多維數組同語言數組直接保存數值而則是能夠對數組進行處理的函數。動態數據類型與的數組和的這些不可變數據類型的適用場景等可變數據類型適用于需要不斷對原始數據進行修改的場景。 showImg(https://segmentfault.com/img/remote/1460000018925396);Numpy,是python中的一個矩陣計算包,功能類似ma...
變量 正如你在上一課中所了解到的,對象將其狀態存儲在字段中。 int cadence = 0; int speed = 0; int gear = 1; 什么是對象?討論向你介紹了字段,但你可能還有一些問題,例如:命名字段的規則和約定是什么?除了int之外,還有哪些其他數據類型?在聲明字段時是否必須初始化字段?如果未明確初始化字段,是否為字段分配了默認值?我們將在本課中探討這些問題的答案,但在我們...
摘要:在位機器上,指針變量的大小為個字節。指針類型的強制類型轉換對指針變量進行強制類型轉換的一般形式將保存的類型指針強制轉換為類型指針后賦值給,其中還是為,沒有改變。 前言 大家好,我是努力學習的少年,今天這篇文章是專門寫關于指針的知識點,因為指針內容比較多,所以我將指針的這篇文章我將它分為...
摘要:如下所示第一小組銷售額為萬元第二小組銷售額為萬元第三小組銷售額為萬元。 01switch語句解構 * A:switch語句解構 * a:switch只能針對某個表達式的值作出判斷,從而決定程序執行哪一段代碼。 * b:格式如下: swtich(表達式){ case 常量1 : 要執行的...
閱讀 1748·2021-10-13 09:39
閱讀 1317·2019-08-30 13:58
閱讀 1412·2019-08-29 16:42
閱讀 3561·2019-08-29 15:41
閱讀 2991·2019-08-29 15:11
閱讀 2470·2019-08-29 14:10
閱讀 3406·2019-08-29 13:29
閱讀 2087·2019-08-26 13:27