本文是我學習《你所不知道的javaScript上卷》的讀書筆記的整理。
更多詳細內容,請微信搜索“前端愛好者
、for...in 語句
1.1 遍歷對象屬性名稱
for...in 語句常用于遍歷特定對象的屬性,包括字段名稱屬性及函數名稱屬性。在JavaScript語言中,它們均稱為屬性 (property)。
let obj={
name: 'obj',
showName() {
console.log(this.name);
}
};
for (const propName in obj) {
console.log(propName, typeof(obj[propName]));
}
顯示:
name – "string"
showName – "function"
利用這一點,可方便地查看特定對象的所有屬性或方法名稱。下面語句打印出console對象所有的屬性:
for (const propName in console) {
console.log(propName, typeof(console[propName]));
}
顯示:
debug – "function"
error – "function"
log – "function"
info – "function"
warn – "function"
clear – "function"
...
可以看出,這些屬性全部均是console的函數名稱,因為console沒有屬性名稱。
1.2 遍歷數組索引值
for...in 用于數組中,則遍歷數組索引值。
let array=['a', 'b', 'c'];
for (const index in array) {
console.log(index, array[index]);
}
顯示:
0 – "a"
1 – "b"
2 – "c"
1.3 遍歷字符串索引值
由于字符串是由字符組成的數組,因此 for...in 也可用于遍歷字符串的索引值。
let str="abc";
for (const index in str) {
console.log(index, str[index]);
}
顯示:
0 – "a"
1 – "b"
2 – "c"
2、for...of 語句
for...of 語句用于遍歷可遍歷對象 (iterable objects)的元素。這些可遍歷對象包括字符串、數組、以及類似于數組的對象,這些對象都帶有length屬性。
2.1 不能用于遍歷對象屬性名稱
for...of 語句不能用于遍歷對象的屬性名稱。因此,下面的代碼是錯誤的:
let obj={
name: 'obj',
showName() {
console.log(this.name);
}
};
for (const propName of obj) {
console.log(propName);
}
顯示:
TypeError: undefined is not a function (near '...propName of obj...')
意為,將 for...of 語句用于對象上面,無法提取具體的數值。
2.2 遍歷數組元素
for...of 語句經常用于遍歷數組中各元素的數值。
let arr=[2, 4, 6, 8, 10];
for (const value of arr) {
console.log(value);
}
顯示:
2
4
6
8
10
2.3 遍歷字符串中的字符
由于字符串是由字符組成的數組,因此 for...of 也可用于遍歷字符串的字符。
let str="abc";
for (const letter of str) {
console.log(letter);
}
顯示:
a
b
c
2.4 解包
數組元素如果是帶有特定屬性名稱的對象,可利用解包性質來快速遍歷這些屬性值。看下面例子。
function Point(x, y) {
return {x:x, y:y};
}
let points=[Point(1, 2), Point(2, 3), Point(4, 5)];
for (const point of points) {
console.log(point.x, point.y);
}
可將Point視為一個構造器 (constructor),每次調用Point(x, y)都會創建并返回該類的一個對象,且含有x及y的屬性名稱。points則是一個含有多個Point對象的數組。上面的代碼遍歷出每個Point對象后,賦值于point變量,然后打印出它們的x值及y值。
如果我們不希望每次都通過引用對象屬性的方式來訪問x及y值,則可編寫代碼如下:
for (const point of points) {
let x=point.x;
let y=point.y;
console.log(x, y);
}
這一步可利用ES6的const解包特性予以簡化:
for (const point of points) {
const {x, y}=point;
console.log(x, y);
}
更進一步,我們可以直接解包:
for (const {x, y} of points) {
console.log(x, y);
}
2.5 遍歷Map
let scoreMap=new Map([
['Mike', 75],
['Tom', 80],
['Smith', 90]
]);
for (const [key, value] of scoreMap) {
console.log(key, value);
}
與上一節不同的是,Map需要使用 [key, value] 的方式來解包。
3、forEach 方法
3.1 forEach 常見調用方式
for...in,for...of 均是語句,與它們不同的是,forEach是數組的內嵌方法。這意味著我們可以直接在數組對象上面直接調用該方法。
let arr=[1, 3, 5, 7, 9];
arr.forEach((element)=> {
console.log(element);
});
作為數組方法,forEach有一個參數,該參數的類型是函數,稱為回調函數 (callback function)。所謂回調函數,是指一旦程序員提供了這樣的函數,JavaScript引擎將負責調用此函數。
回調函數的價值在于回調函數可能存在多個參數,而這些參數將由JavaScript引擎自動提供。在回調函數中,我們可對JavaScript引擎所自動提供的參數進行進一步加工。
在上面的回調函數中,element是由JavaScript引擎自動提供的,代表每個數組元素。
上面的代碼采用了lambda匿名表達式。它等同于:
let arr=[1, 3, 5, 7, 9];
function callback(element) {
console.log(element);
}
arr.forEach(callback);
可見,lambda表達式更加簡練。
3.2 forEach 的參數
forEach共有3個參數 (上面例子只用了第1個),它們的排列順序如下:
arr.forEach((element, index, array)=> {
console.log(element);
console.log(index);
console.log(array);
});
參數element是數組元素,參數index是數組元素所在數組中的索引值,參數array是整個數組。
一般情況下,我們僅需用到element及index參數就足夠了。由于是每次迭代,因此,forEach方法中的array參數較少用到。
index每次遍歷時都會加1,且每次都會與array的長度比較。一旦超出array的界限,就會終止遍歷。如果遍歷過程中,修改了array的長度,則需特別注意這一點。
3.2 forEach 遍歷的終止
如何中止forEach的遍歷?JavaScript并未提供這樣的機制,但我們可以用一個雙重嵌套的異常來終止遍歷。
let arr=[1, 3, 5, 7, 9];
try {
arr.forEach((element, index, array)=> {
try {
console.log(index);
if (index >=3) {
throw new Error('forEach termination signal');
}
} catch (error) {
throw error;
}
});
} catch (e) {
if (e.message==='forEach termination signal') {
console.log('forEach terminated.');
}
}
console.log('This line of code should be executed.');
顯示:
0
1
2
3
forEach terminated.
This line of code should be executed.
我們設定,當index的值大于等于3時,需要終止遍歷。這樣,在第7行,當此條件滿足時,即拋出"forEach termination signal"的異常。
此時,程序流程轉入到第10行至第12行最內層的異常捕獲處理代碼:
} catch (error) {
throw error;
}
捕獲異常后,如果我們不重新拋出異常,JavaScript引擎則會認為我們已正確地處理了異常,因此會恢復中斷的遍歷進程,繼續處理下一個數組元素,這不是我們想要的。因此,我們在此重新拋出該異常,以切實終止遍歷。
這時,forEach的遍歷因異常而終止,從而達到了我們的最初的目標。但因為有異常,如果我們未作任何處理,則該異常會導致整個程序都終止運行。只有在我們處理了異常后,程序才能往下走。這就是第14行至18行最外層異常捕獲代碼的作用:
} catch (e) {
if (e.message==='forEach termination signal') {
console.log('forEach terminated');
}
}
先判斷它是不是"forEach termination signal"。如果是,則簡單地打印一行消息。由于這里未再拋出新的異常,因此JavaScript引擎認為我們已經正確地處理了異常,則繼續執行后面的代碼。這樣,最后一行第20行語句將被執行并打印出"This line of code should be executed."的文本。
一般來講,如果我們需要在數組的遍歷過程中終止遍歷,不要使用 forEach 語句,使用最傳統的方式即可:
let arr=[1, 3, 5, 7, 9];
for (let i=0; i < arr.length; i++) {
console.log(i, arr[i]);
if (i >=3) {
break;
}
}
console.log('This line of code should be executed.');
這樣即可在遍歷中訪問數組的索引值與數組元素,又可以極為方便地隨時終止遍歷。
JavaScript中的對象是擁有屬性和方法的數據,今天小編將為大家帶來大數據編程入門:JavaScript對象。
真實生活中的對象,屬性和方法
真實生活中,手機是一個對象,并且有它的屬性,如品牌和顏色等,方法有開機關機等。
比如對象為手機(phone),屬性有:
phone.name=Redmi
phone.color=black
phone.size=6.67inch
phone.processor=phegda1200
方法有:
phone.start()
phone.working()
phone.call()
phone.stop()
所有的手機都有這些屬性,但是每款手機的屬性都不一樣;以及所有手機都擁有這些方法,但是它們被執行的時間可能會不一樣。
JavaScript對象
在JavaScript中,幾乎所有的事物都是對象。
注意:在JavaScript中,對象非常重要。理解對象后,就可以理解JavaScript。
在下面的代碼中變量為phone,所設置的值為”Redmi”:
var phone=“Redmi”;
一個對象也是一個變量,但是一個對象可以包含多個值(多個變量),并且每個值都以name:value的形式呈現。
var phone={name:”Redmi”,color:”black”};
在上面的示例中,兩個值(“Redmi”,”black”)賦予變量phone。
注意:在JavaScript中的對象是變量的容器。
對象定義
可以在JavaScript中使用字符定義和創建對象:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>創建 JavaScript 對象。</p>
<p id="demo"></p>
<script>
var person={firstName:"路飛", lastName:"夢奇", age:20, eyeColor:"blue"};
document.getElementById("demo").innerHTML=
person.firstName + " 現在 " + person.age + " 歲.";
</script>
</body>
</html>
運行結果:
在JavaScript中定義對象可以跨越多行,不強制要求空格和換行:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>創建 JavaScript 對象。</p>
<p id="demo"></p>
<script>
var person={
firstName : "路飛",
lastName : "夢奇",
age : 20,
eyeColor : "black"
};
document.getElementById("demo").innerHTML=
person.firstName + " 現在 " + person.age + " 歲。";
</script>
</body>
</html>
運行結果:
對象屬性
可以說“JavaScript對象是變量的容器”。
然而,我們通常認為“JavaScript對象是鍵值對的容器”。
鍵值對通常寫為name:value(鍵和值用冒號分隔)。
鍵值對在JavaScript對象中通常稱為對象屬性。
注意:在JavaScript中的對象是屬性變量的容器。
對象鍵值對的寫法類似于:
PHP 中的關聯數組
Python 中的字典
C 語言中的哈希表
Java 中的哈希映射
Ruby 和 Perl 中的哈希表
訪問對象屬性
在JavaScript中可以通過兩種方式來訪問對象屬性:
示例1:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>
有兩種方式可以訪問對象屬性:
</p>
<p>
你可以使用 .property 或 ["property"].
</p>
<p id="demo"></p>
<script>
var person={
firstName : "索隆",
lastName : "羅羅諾亞",
id : 1
};
document.getElementById("demo").innerHTML=
person.firstName + " " + person.lastName;
</script>
</body>
</html>
運行結果:
示例2:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>
有兩種方式可以訪問對象屬性:
</p>
<p>
你可以使用 .property 或 ["property"]。
</p>
<p id="demo"></p>
<script>
var person={
firstName: "索隆",
lastName : "羅羅諾亞",
id : 5566
};
document.getElementById("demo").innerHTML=
person["firstName"] + " " + person["lastName"];
</script>
</body>
</html>
運行結果:
對象方法
對象的方法定義函數并作為對象的屬性存儲。
通過添加()調用對象方法(作為函數)。
此實例訪問person對象的fullname()方法:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>創建和使用對象方法。</p>
<p>對象方法作為一個函數定義存儲在對象屬性中。</p>
<p id="demo"></p>
<script>
var person={
firstName: "索隆",
lastName : "羅羅諾亞",
id : 5566,
fullName : function()
{
return this.firstName + " " + this.lastName;
}
};
document.getElementById("demo").innerHTML=person.fullName();
</script>
</body>
</html>
運行結果:
如果要訪問person對象的fullname屬性,它將作為定義函數的字符串返回:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Miuku</title>
</head>
<body>
<p>創建和使用對象方法。</p>
<p>對象方法是一個函數定義,并作為一個屬性值存儲。</p>
<p id="demo1"></p>
<p id="demo2"></p>
<script>
var person={
firstName: "路飛",
lastName : "夢奇",
id : 9,
fullName : function()
{
return this.firstName + " " + this.lastName;
}
};
document.getElementById("demo1").innerHTML="不加括號輸出函數表達式:" + person.fullName;
document.getElementById("demo2").innerHTML="加括號輸出函數執行結果:" + person.fullName();
</script>
</body>
</html>
運行結果:
訪問對象方法
可以使用以下語法創建對象方法:
methodName : function() {
// 代碼
}
可以使用下面的語法訪問對象:
objectName.methodName()
通常,fullname()是作為person對象的方法,而fullname是一個屬性。
如果使用fullname屬性,而不添加(),它將返回函數的定義:
objectName.methodName
有許多方法可以創建、使用和修改JavaScript對象。
同樣的,還有許多方法可以創建、使用和修改屬性和方法。
以上就是關于大數據編程入門:JavaScript對象的全部內容了,希望這篇文章可以幫助到大家~
*請認真填寫需求信息,我們會在24小時內與您取得聯系。