Comment your JavaScript Code
JavaScript中的注釋方式有以下兩種:
使用 // 來告訴JavaScript來忽略當(dāng)前行的代碼
// This is an in-line comment.
你也可以使用多行注釋來注釋你的代碼,以/開始凯沪,用/來結(jié)束高氮,就像下面這樣:
/* This is a
multi-line comment */
良好的注釋能夠清晰地傳達(dá)你寫的代碼的意圖—對于那些讀你的代碼的人來說以及未來你看到它的時候航瞭,還能理解這段代碼的意圖孟害。
Declare JavaScript Variables
在計算機(jī)科學(xué)中, data(數(shù)據(jù))就是一切,因為它對于計算機(jī)的意義重大。
JavaScript提供七種不同的data types(數(shù)據(jù)類型):
undefined(未定義)
null(空)
boolean(布爾型)
string(字符串)
symbol(符號)
number(數(shù)字)
object(對象)
Variables(變量)允許計算機(jī)以一種動態(tài)的形式來存儲和操作數(shù)據(jù)虑乖,通過操作指向數(shù)據(jù)的指針而不是數(shù)據(jù)本身來避免了內(nèi)存泄露,以上的七種數(shù)據(jù)類型都可以存儲到一個變量(variable)中晾虑。
Variables 非常類似于你在數(shù)學(xué)中使用的x,y變量, 這意味著它們都是以一個簡單命名的名字來代替我們賦值給它的數(shù)據(jù)疹味。計算機(jī)中的variables(變量)與數(shù)學(xué)中的變量不同的是,計算機(jī)可以在不同的時間存儲不同類型的變量帜篇。
通過在變量的前面使用關(guān)鍵字var糙捺,我們告訴 JavaScript 來創(chuàng)建或者 declare(聲明)一個變量,就像這樣:
var ourName;
上面代碼的意思是創(chuàng)建一個名為ourName的variable(變量),在JavaScript中我們使用分號來結(jié)束一段聲明笙隙。Variable (變量)的名字可以由數(shù)字洪灯、字母、$ 或者 _組成竟痰,但是不能包含空格或者以數(shù)字為首签钩。
Storing Values with the Equal Operator
在JavaScript中,你可以通過assignment(分配)操作符把一個值存儲到變量中坏快。
myVariable = 5;
賦值過程是從右到左進(jìn)行的铅檩。所有 = 操作符右邊的值都會被賦到左邊的變量。
Initializing Variables with the Equal Operator
- 通常地我們會在initialize開始聲明變量的時候就會給變量賦一個初始值假消。
var myVar = 0;
Understanding Uninitialized Variables
當(dāng) JavaScript 中的變量被聲明的時候柠并,程序內(nèi)部會給它一個初始值 undefined。
當(dāng)你對一個值為 undefined 的變量進(jìn)行運算操作的時候富拗,算出來的結(jié)果將會是 NaN臼予,NaN 的意思是 "Not a Number"。
當(dāng)你用一個沒有 定義 的變量來做字符串連接操作的時候啃沪,它會如實的輸出"undefined"粘拾。
Understanding Case Sensitivity in Variables
在 JavaScript 中所有的變量都是大小寫敏感的。這意味著你要區(qū)別對待大寫字母和小寫字母创千。
MYVAR與MyVar和myvar 是截然不同的變量缰雇。這就有可能導(dǎo)致多個截然不同的變量卻有著有相似的名字。正是由于以上原因所以強(qiáng)烈地建議你, 不要 使用這一特性追驴。(以免給自己帶來麻煩)
使用 駝峰命名法(camelCase) 來書寫一個 Javascript 變量械哟,在 駝峰命名法 中,變量名的第一個單詞的首寫字母小寫殿雪,后面的單詞的第一個字母大寫暇咆。
舉個栗子:
var someVariable;
var anotherVariableName;
var thisVariableNameIsTooLong;
Add Two Numbers with JavaScript
- JavaScript 中使用 + 號來讓兩個數(shù)字執(zhí)行加法運算。
- 舉例
myVar = 5 + 10; // 等于 15
Subtract One Number from Another with JavaScript
- JavaScript 中使用 - 來做減法運算。
- 舉例
myVar = 12 - 6; // 等于 6
Multiply Two Numbers with JavaScript
- JavaScript 使用這個 * 符號來讓兩個數(shù)字相乘爸业。
- 舉例
myVar = 13 * 13; // assigned 169
Divide One Number by Another with JavaScript
- JavaScript 中使用 / 符號做除法運算其骄。
- 舉例
myVar = 16 / 2; // assigned 8
Increment a Number with JavaScript
- 使用 ++ ,我們可以很容易地對變量進(jìn)行自增或者+1運算扯旷。
i++;
等效于
i = i + 1;//省去了書寫=符號的必要拯爽。
Decrement a Number with JavaScript
- 使用自減符號 -- ,你可以很方便地對一個變量執(zhí)行 自減 或者減一操作钧忽。
i--;
等效于
i = i - 1;//省去了書寫=符號的必要毯炮。
Create Decimal Numbers with JavaScript
- 我們也可以把小數(shù)存儲到變量中。小數(shù)也被稱作浮點數(shù) 惰瓜。
提示:不是所有的實數(shù)都可以用 浮點數(shù) 來表示否副。因為可能存在四舍五入的錯誤汉矿。
Multiply Two Decimals with JavaScript
- 在 JavaScript 中崎坊,你也可以用小數(shù)進(jìn)行計算,就像整數(shù)一樣洲拇。
Finding a Remainder in JavaScript
- 我們用%運算符來取余奈揍。
- %運算符有時被錯誤的稱為取模運算符
兩者區(qū)別: - 取余運算遵循盡可能讓余數(shù)小的原則
- 取模運算盡可能讓商小的原則
例如:
7=(-3)×(-2)+1
7=(-3)×(-3)+(-2)
因此,
7rem(-3)=1
7mod(-3)=(-2)
Assignment with Plus Equals
- 有一類操作符是一步到位既做運算也賦值的赋续。
- 這類操作符的其中一種就是 += 運算符男翰。
myVar += 5;
Assignment with Minus Equals
- 與 += 操作符類似,-= 操作符用來對一個變量進(jìn)行減法賦值操作纽乱。
myVar = myVar - 5;
Assignment with Times Equals
-
*=
操作符是讓變量與一個數(shù)相乘并賦值蛾绎。
myVar = myVar * 5;
Assignment with Divided by Equals
-
/=
操作符是讓變量與另一個數(shù)相除并賦值。
myVar = myVar / 5;
Convert Celsius to Fahrenheit
- 從Celsius攝氏度轉(zhuǎn)換為Fahrenheit華氏度的算法是:攝氏度的溫度乘于9除于5鸦列,再加上32租冠。
function convert(celsius) {
// Only change code below this line
fahrenheit = celsius * 9 / 5 + 32;
// Only change code above this line
return fahrenheit;
}
// Change the inputs below to test your code
convert(30);
Declare String Variables
- 先前我們使用過的代碼:
var myName = "your name";
- "your name" 被稱作字符串。 字符串是用單或雙引號包裹起來的一連串的零個或多個字符薯嗤。
Escaping Literal Quotes in Strings
當(dāng)你定義一個字符串必須要用單引號或雙引號來包裹它顽爹。那么當(dāng)你需要在字符串中使用一個: " 或者 ' 時該怎么辦呢?
- 在 JavaScript 中,你可以通過在引號前面使用 反斜杠 () 來轉(zhuǎn)義引號骆姐。
var sampleStr = "Alan said, \"Peter is learning JavaScript\".";
這標(biāo)志著提醒 JavaScript 單引號或雙引號并不是字符串的結(jié)尾镜粤,而是出現(xiàn)在字符串內(nèi)的字符。所以玻褪,如果你要打印字符串到控制臺肉渴,你將得到:
Alan said, "Peter is learning JavaScript".
Quoting Strings with Single Quotes
在 JavaScript 中的 字符串 要用單引號或雙引號來包裹它,只要你在開始和結(jié)束都使用相同類型的引號带射,單引號和雙引號的功能在JavaScript中是相同的同规。
"This string has \"double quotes\" in it"
當(dāng)我們需要在字符串中使用與開頭結(jié)尾相同的引號時,我們需要對引號進(jìn)行 轉(zhuǎn)義 庸诱。如果你有很多雙引號的字符串捻浦,使用轉(zhuǎn)義字符可能導(dǎo)致難以閱讀晤揣。這時候可以使用單引號。
'This string has "double quotes" in it. And "probably" lots of them.'
Escape Sequences in Strings
引號不是字符串中唯一的可以被轉(zhuǎn)義字符朱灿。下面是常見的轉(zhuǎn)義序列列表:
Concatenating Strings with Plus Operator
- 在 JavaScript 中昧识,當(dāng) + 操作符與 字符串 一起使用的時候,它被稱作 連接 操作符盗扒。你可以通過和其他字符串連接 來創(chuàng)建一個新的字符串跪楞。
舉個例子:
'My name is Alan,' + ' I concatenate.'
注意:當(dāng)心空格。連接操作不會添加兩個字符串之外的空格侣灶,所以想加上空格的話甸祭,你需要自己在字符串里面添加。
Concatenating Strings with the Plus Equals Operator
- 我們還可以使用 += 運算符來連接字符串到現(xiàn)有字符串的結(jié)尾褥影。對于那些非常長的字符串來說池户,這一操作是非常有用的。
Constructing Strings with Variables
有時候需要創(chuàng)建一個填字風(fēng)格的字符串凡怎。
- 通過使用連接運算符 + 校焦,你可以插入一個或多個變量來組成一個字符串。
var ourName = "Free Code Camp";
var ourStr = "Hello, our name is " + ourName + ", how are you?";
var myName = "9aoyang";
var myStr = "My name is " + myName + " and I am well!";
Appending Variables to Strings
- 不僅可以追加字符串统倒,還可以使用加等號(+=)運算符直接來追加變量到字符串上寨典。
var anAdjective = "awesome!";
var ourStr = "Free Code Camp is ";
ourStr += anAdjective;
Find the Length of a String
- 可以通過在字符串變量或字符串后面寫上 .length 來獲得字符串變量 字符串 值的長度。
"Alan Peter".length; // 10
Use Bracket Notation to Find the First Character in a String
JavaScript中只有字符串類型房匆,沒有字符類型耸成。那么如何獲取到字符串中的某個字符呢?
- 我們通過[索引] 來獲得對應(yīng)的字符浴鸿。
大多數(shù)現(xiàn)代編程語言井氢,如JavaScript,不同于人類從1開始計數(shù)赚楚。它們是從0開始計數(shù)毙沾,這被稱為 基于零 (Zero-based indexing) 的索引。 - 例如, 在單詞 "Charles" 中索引0上的字符為 "C"宠页,所以在 var firstName = "Charles" 中左胞,你可以使用 firstName[0] 來獲得第一個位置上的字符。
Understand String Immutability
理解字符串的不可變性举户!當(dāng)你搞懂不可變性后immutable.js對于你就是小菜一碟了烤宙。
- 在 JavaScript 中,字符串的值是不可變的俭嘁,這意味著一旦字符串被創(chuàng)建就不能被改變躺枕。
例如,下面的代碼:
var myStr = "Bob";
myStr[0] = "J";
是不會把變量 myStr 的值改變成 "Job" 的,因為變量 myStr 是不可變的拐云。注意罢猪,這并不意味著 myStr 永遠(yuǎn)不能被改變,只是字符串字面量 string literal 的各個字符不能被改變叉瘩。改變 myStr 中的唯一方法是重新給它賦一個值膳帕,就像這樣:
var myStr = "Bob";
myStr = "Job";
Use Bracket Notation to Find the Nth Character in a String
也可以使用 [索引]來獲得一個字符串中的其他位置的字符。
請記住薇缅,程序是從 0 開始計數(shù)危彩,所以獲取第一個字符實際上是[0]。
Use Bracket Notation to Find the Last Character in a String
- 為了得到一個字符串的最后一個字符泳桦,你可以用[字符串的長度減去一]汤徽。
- 例如,在
var firstName = "Charles"
中灸撰,你可以這樣操作firstName[firstName.length - 1]
來得到字符串的最后的一個字符谒府。
Use Bracket Notation to Find the NthtoLast Character in a String
- 我們既可以獲取字符串的最后一個字符,也可以用獲取字符串的倒數(shù)第N個字符梧奢。
- 例如狱掂,你可以這樣
firstName[firstName.length - 3]
操作來獲得var firstName = "Charles"
字符串中的倒數(shù)第三個字符演痒。
Store Multiple Values in one Variable using JavaScript Arrays
- 使用數(shù)組亲轨,我們可以在一個地方存儲多個數(shù)據(jù)。
- 以左方括號[開始定義一個數(shù)組鸟顺,以右方括號]結(jié)束定義惦蚊,并把每個條目之間用逗號隔開,就像這樣:
var sandwich = ["peanut butter", "jelly", "bread"]讯嫂。
Nest one Array within Another Array
- 你也可以在數(shù)組中包含其他數(shù)組蹦锋,就像這樣:
[["Bulls", 23], ["White Sox", 45]]
。這被稱為一個 多維數(shù)組欧芽。
Access Array Data with Indexes
- 我們可以像操作字符串一樣通過數(shù)組索引[index]來訪問數(shù)組中的數(shù)據(jù)莉掂。
- 數(shù)組索引的使用與字符串索引一樣,不同的是千扔,通過字符串的索引得到的是一個字符憎妙,通過數(shù)組索引得到的是一個條目。與字符串類似曲楚,數(shù)組也是 基于零 的索引厘唾,因此數(shù)組的第一個元素的索引是 0。
例如
var array = [1,2,3];
array[0]; // 等于 1
var data = array[1]; // 等于 2
Modify Array Data With Indexes
- 與字符串的數(shù)據(jù)不可變不同龙誊,數(shù)組的數(shù)據(jù)是可變的抚垃,并且可以自由地改變。
例如
var ourArray = [3,2,1];
ourArray[0] = 1; // ourArray等于 [1,2,1]
Access MultiDimensional Arrays With Indexes
- 可以把 多維 數(shù)組看作成是一個 數(shù)組中的數(shù)組。當(dāng)使用[]去訪問數(shù)組的時候鹤树,第一個[index]訪問的是第N個子數(shù)組铣焊,第二個[index]訪問的是第N個子數(shù)組的第N個元素。
例如
var arr = [
[1,2,3],
[4,5,6],
[7,8,9],
[[10,11,12], 13, 14]
];
arr[0]; // 等于 [1,2,3]
arr[1][2]; // 等于 6
arr[3][0][1]; // 等于 11
Manipulate Arrays With push
- 一個簡單的方法將數(shù)據(jù)追加到一個數(shù)組的末尾是通過 push() 函數(shù)罕伯。
- .push() 接受把一個或多個參數(shù)粗截,并把它“推”入到數(shù)組的末尾。
var arr = [1,2,3];
arr.push(4);
// 現(xiàn)在arr的值為 [1,2,3,4]
Manipulate Arrays With pop
改變數(shù)組中數(shù)據(jù)的另一種方法是用 .pop() 函數(shù)捣炬。
.pop() 函數(shù)用來“拋出”一個數(shù)組末尾的值熊昌。我們可以把這個“拋出”的值賦給一個變量存儲起來。
數(shù)組中任何類型的條目(數(shù)值湿酸,字符串婿屹,甚至是數(shù)組)可以被“拋出來” 。
舉個例子, 對于這段代碼
var oneDown = [1, 4, 6].pop();
現(xiàn)在 oneDown 的值為 6 推溃,數(shù)組變成了 [1, 4]昂利。
Manipulate Arrays With shift
- pop() 函數(shù)用來移出數(shù)組中最后一個元素。如果想要移出第一個元素要怎么辦呢铁坎?
- 這就是 .shift() 的用武之地蜂奸。它的工作原理就像 .pop(),但它移除的是第一個元素硬萍,而不是最后一個扩所。
Manipulate Arrays With unshift
- 你不僅可以 shift(移出)數(shù)組中的第一個元素,你也可以 unshift(移入)一個元素到數(shù)組的頭部朴乖。
- .unshift() 函數(shù)用起來就像 .push() 函數(shù)一樣, 但不是在數(shù)組的末尾添加元素祖屏,而是在數(shù)組的頭部添加元素。
Write Reusable JavaScript with Functions
在 JavaScript 中买羞,我們可以把代碼的重復(fù)部分抽取出來袁勺,放到一個函數(shù)(functions)中。
這是一個函數(shù)(function)的例子:
function functionName() {
console.log("Hello World");
}
你可以通過函數(shù)名稱functionName加上后面的小括號來調(diào)用這個函數(shù)(function)畜普,就像這樣:functionName();
每次調(diào)用函數(shù)時它會打印出消息的“Hello World”到開發(fā)的控制臺上期丰。所有的大括號之間的代碼將在每次函數(shù)調(diào)用時執(zhí)行。
Passing Values to Functions with Arguments
函數(shù)的參數(shù)parameters在函數(shù)中充當(dāng)占位符(也叫形參)的作用吃挑,參數(shù)可以為一個或多個钝荡。調(diào)用一個函數(shù)時所傳入的參數(shù)為實參,實參決定著形參真正的值儒鹿。簡單理解:形參即形式化撕、實參即內(nèi)容。
這是帶有兩個參數(shù)的函數(shù)约炎, param1 和 param2:
function testFun(param1, param2) {
console.log(param1, param2);
}
接著我們調(diào)用 testFun:
testFun("Hello", "World");
我們傳遞了兩個參數(shù)植阴, "Hello" 和 "World"蟹瘾。在函數(shù)內(nèi)部,param1 等于“Hello”掠手,param2 等于“World”憾朴。請注意,testFun 函數(shù)可以多次調(diào)用喷鸽,每次調(diào)用時傳遞的參數(shù)會決定形參的實際值众雷。
Global Scope and Functions
在 JavaScript 中哗讥, 作用域 涉及到變量的作用范圍峡捡。在函數(shù)外定義的變量具有 全局 作用域。這意味著场勤,具有全局作用域的變量可以在代碼的任何地方被調(diào)用混槐。
這些沒有使用var關(guān)鍵字定義的變量编兄,會被自動創(chuàng)建在全局作用域中,形成全局變量声登。當(dāng)在代碼其他地方無意間定義了一個變量狠鸳,剛好變量名與全局變量相同,這時會產(chǎn)生意想不到的后果悯嗓。因此你應(yīng)該總是使用var關(guān)鍵字來聲明你的變量件舵。
Local Scope and Functions
- 在一個函數(shù)內(nèi)聲明的變量,以及該函數(shù)的參數(shù)都是局部變量脯厨,意味著它們只在該函數(shù)內(nèi)可見铅祸。
- 這是在函數(shù) myTest內(nèi)聲明局部變量loc 的最佳例子:
function myTest() {
var loc = "foo";
console.log(loc);
}
myTest(); // "foo"
console.log(loc); // "undefined"
Global vs Local Scope in Functions
- 一個程序中有可能具有相同名稱的 局部 變量 和 全局 變量。在這種情況下俄认,局部 變量將會優(yōu)先于 全局 變量个少。
- 下面為例:
var someVar = "Hat";
function myFun() {
var someVar = "Head";
return someVar;
}
函數(shù) myFun 將會返回 "Head",因為 局部變量 優(yōu)先級更高眯杏。
Return a Value from a Function with Return
- 我們可以把數(shù)據(jù)通過函數(shù)的 參數(shù) 來傳入函數(shù),也可以使用 return 語句把數(shù)據(jù)從一個函數(shù)中傳出來壳澳。
- 例如
function plusThree(num) {
return num + 3;
}
var answer = plusThree(5); // 8
plusThree 帶有一個為 num 的 參數(shù) 并且返回(returns)一個等于 num + 3 的值岂贩。
Assignment with a Returned Value
如果你還記得我們在這一節(jié) Storing Values with the Equal Operator 的討論,賦值之前巷波,先完成等號右邊的操作萎津。這意味著我們可把一個函數(shù)的返回值,賦值給一個變量抹镊。
-
假設(shè)我們預(yù)先定義的函數(shù)sum其功能就是將兩個數(shù)字相加锉屈,那么:
ourSum = sum(5, 12);
將調(diào)用sum函數(shù),返回return了一個數(shù)值17垮耳,然后把它賦值給了ourSum變量颈渊。
Stand in Line
在計算機(jī)科學(xué)中 隊列(queue)是一個抽象的數(shù)據(jù)結(jié)構(gòu)遂黍,隊列中的條目都是有秩序的。新的條目會被加到 隊列 的末尾俊嗽,舊的條目會從 隊列 的頭部被移出雾家。
寫一個函數(shù) queue ,用一個數(shù)組arr和一個數(shù)字item作為參數(shù)绍豁。數(shù)字item添加到數(shù)組的結(jié)尾芯咧,然后移出數(shù)組的第一個元素,最后隊列函數(shù)應(yīng)該返回被刪除的元素竹揍。
function queue(arr, item) {
// Your code here
arr.push(item);
item = arr.shift();
return item; // Change this line
}
Understanding Boolean Values
- 另一種數(shù)據(jù)類型是布爾(Boolean)敬飒。布爾 值要么是true 要么是false。它非常像電路開關(guān)芬位, true 是“開”驶拱,false 是“關(guān)”。這兩種狀態(tài)是互斥的晶衷。
注意:Boolean 值絕不會寫作被引號包裹起來的形式蓝纲。字符串 的 "true" 和 "false" 不是 布爾值,在 JavaScript 中也沒有特殊含義晌纫。
Use Conditional Logic with If Statements
If 語句用于在代碼中做條件判斷税迷。關(guān)鍵字 if 告訴 JavaScript 在小括號中的條件為真的情況下去執(zhí)行定義在大括號里面的代碼。這種條件被稱為 Boolean 條件锹漱,因為他們只可能是 true(真)或 false(假)箭养。
當(dāng)條件的計算結(jié)果為 true,程序執(zhí)行大括號內(nèi)的語句哥牍。當(dāng)布爾條件的計算結(jié)果為 false毕泌,大括號內(nèi)的代碼將不會執(zhí)行。
偽代碼
if(條件為真){
語句被執(zhí)行
}
示例
function test (myCondition) {
if (myCondition) {
return "It was true";
}
return "It was false";
}
test(true); // returns "It was true"
test(false); // returns "It was false"
當(dāng) test 被調(diào)用嗅辣,并且傳遞進(jìn)來的參數(shù)值為 true撼泛,if 語句會計算 myCondition 的結(jié)果,看它是真還是假澡谭。如果條件為 true愿题,函數(shù)會返回 "It was true"。當(dāng) test 被調(diào)用蛙奖,并且傳遞進(jìn)來的參數(shù)值為 false潘酗,myCondition 不 為 true,并且不執(zhí)行大括號后面的語句雁仲,函數(shù)返回 "It was false"仔夺。
Comparison with the Equality Operator
在 JavaScript 中,有很多 相互比較的操作攒砖。所有這些操作符都返回一個 true 或 false 值缸兔。
- 最基本的運算符是相等運算符:==日裙。相等運算符比較兩個值,如果它們是同等灶体,返回 true阅签,如果它們不等,返回 false蝎抽。值得注意的是相等運算符不同于賦值運算符(=)政钟,賦值運算符是把等號右邊的值賦給左邊的變量。
function equalityTest(myVal) {
if (myVal == 10) {
return "Equal";
}
return "Not Equal";
}
如果 myVal 等于 10樟结,相等運算符會返回 true养交,因此大括號里面的代碼會被執(zhí)行,函數(shù)將返回 "Equal"瓢宦。否則碎连,函數(shù)返回 "Not Equal"。
在 JavaScript 中驮履,為了讓兩個不同的 數(shù)據(jù)類型(例如 數(shù)字 和 字符串)的值可以作比較鱼辙,它必須把一種類型轉(zhuǎn)換為另一種類型。然而一旦這樣做玫镐,它可以像下面這樣來比較:
1 == 1 // true
1 == 2 // false
1 == '1' // true
"3" == 3 // true
Comparison with the Strict Equality Operator
- 全等(===)是相對于相等操作符(==)的一種操作符倒戏。與相等操作符不同的是全等比較嚴(yán)格,它會同時比較元素的值和 數(shù)據(jù)類型恐似。
舉個例子
3 === 3 // true
3 === '3' // false
3 是一個 數(shù)字 類型的杜跷,而'3' 是一個 字符 類型的,所以3不全等于'3'矫夷。
Comparison with the Inequality Operator
- 不相等運算符(!=)與相等運算符是相反的葛闷。這意味著不相等運算符中,如果“不為真”并且返回 false 的地方双藕,在相等運算符中會返回true淑趾,反之亦然(vice versa)。與相等運算符類似蔓彩,不相等運算符在比較的時候也會轉(zhuǎn)換值的數(shù)據(jù)類型治笨。
Examples
1 != 2 // true
1 != "1" // false
1 != '1' // false
1 != true // false
0 != false // false
Comparison with the Strict Inequality Operator
- 不全等運算符(!==)與全等運算符是相反的。這意味著“不全等”并返回 false 的地方赤嚼,用全等運算會返回 true,反之亦然顺又。全等運算符不會轉(zhuǎn)換值的數(shù)據(jù)類型更卒。
例如
3 !== 3 // false
3 !== '3' // true
4 !== 3 // true
Comparison with the Greater Than Operator
- 使用大于運算符(>)來比較兩個數(shù)字。如果大于運算符左邊的數(shù)字大于右邊的數(shù)字稚照,將會返回 true蹂空。否則俯萌,它返回 false。與相等運算符一樣上枕,大于運算符在比較的時候咐熙,會轉(zhuǎn)換值的數(shù)據(jù)類型。
例如
5 > 3 // true
7 > '3' // true
2 > 3 // false
'1' > 9 // false
Comparison with the Greater Than Or Equal To Operator
- 使用 大于等于 運算符(>=)來比較兩個數(shù)字的大小辨萍。如果大于等于運算符左邊的數(shù)字比右邊的數(shù)字大或者相等棋恼,它會返回 true。否則锈玉,它會返回 false爪飘。與相等運算符相似,大于等于 運算符在比較的時候會轉(zhuǎn)換值的數(shù)據(jù)類型拉背。
例如
6 >= 6 // true
7 >= '3' // true
2 >= 3 // false
'7' >= 9 // false
Comparison with the Less Than Operator
- 使用 小于 運算符(<)比較兩個數(shù)字的大小师崎。如果小于運算符左邊的數(shù)字比右邊的數(shù)字小,它會返回 true椅棺。否則犁罩,他會返回 false。與相等運算符類似两疚,小于 運算符在做比較的時候會轉(zhuǎn)換值的數(shù)據(jù)類型床估。
例如
2 < 5 // true
'3' < 7 // true
5 < 5 // false
3 < 2 // false
'8' < 4 // false
Comparison with the Less Than Or Equal To Operator
- 使用 小于等于 運算符(<=)比較兩個數(shù)字的大小。如果在小于等于運算符鬼雀,左邊的數(shù)字小于或者等于右邊的數(shù)字顷窒,它會返回 true。如果在小于等于運算符源哩,左邊的數(shù)字大于或者等于右邊的數(shù)字鞋吉,它會返回 false。與相等運算符類型励烦,小于等于 運算符會轉(zhuǎn)換數(shù)據(jù)類型谓着。
例如
4 <= 5 // true
'7' <= 7 // true
5 <= 5 // true
3 <= 2 // false
'8' <= 4 // false
Comparisons with the Logical And Operator
- 有時你需要在一次判斷中做多個操作。當(dāng)且僅當(dāng)運算符的左邊和右邊都是 true坛掠,邏輯與 運算符(&&)才會返回 true赊锚。
同樣的效果可以通過if語句的嵌套來實現(xiàn):
if (num > 5) {
if (num < 10) {
return "Yes";
}
}
return "No";
只有當(dāng) num 的值在6和9之間(包括6和9)才會返回 "Yes"。相同的邏輯可被寫為:
if (num > 5 && num < 10) {
return "Yes";
}
return "No";
Comparisons with the Logical Or Operator
- 如果任何一個操作數(shù)是true屉栓,邏輯或 運算符 (||) 返回 true舷蒲。反之,返回 false友多。
舉個例子:
if (num > 10) {
return "No";
}
if (num < 5) {
return "No";
}
return "Yes";
只有當(dāng)num大于等于5或小于等于10時牲平,函數(shù)返回"Yes"。相同的邏輯可以簡寫成:
if (num > 10 || num < 5) {
return "No";
}
return "Yes";
Introducing Else Statements
- 當(dāng)if語句的條件為真域滥,大括號里的代碼執(zhí)行纵柿,那如果條件為假呢蜈抓?
正常情況下什么也不會發(fā)生。 - 寫一個else語句昂儒,當(dāng)條件為假時執(zhí)行相應(yīng)的代碼沟使。
if (num > 10) {
return "Bigger than 10";
} else {
return "10 or Less";
}
ntroducing Else If Statements
- 如果你有多個條件語句,你可以通過else if語句把 if語句鏈起來渊跋。
if (num > 15) {
return "Bigger than 15";
} else if (num < 5) {
return "Smaller than 5";
} else {
return "Between 5 and 15";
}
Logical Order in If Else Statements
- if腊嗡、else if語句中代碼的執(zhí)行順序是很重要的。
- 在條件判斷語句中刹枉,代碼的執(zhí)行順序是從上到下叽唱,所以你需要考慮清楚先執(zhí)行哪一句,后執(zhí)行哪一句微宝。
這有兩個例子棺亭。
第一個例子:
function foo(x) {
if (x < 1) {
return "Less than one";
} else if (x < 2) {
return "Less than two";
} else {
return "Greater than or equal to two";
}
}
第二個例子更改了代碼的執(zhí)行順序:
function bar(x) {
if (x < 2) {
return "Less than two";
} else if (x < 1) {
return "Less than one";
} else {
return "Greater than or equal to two";
}
}
這兩個函數(shù)看起來幾乎一模一樣,我們傳一個值進(jìn)去看看它們有什么區(qū)別蟋软。
foo(0) // "Less than one"
bar(0) // "Less than two"
Chaining If Else Statements
- if/else 語句串聯(lián)在一起可以實現(xiàn)復(fù)雜的邏輯镶摘,這是多個if/else if 語句串聯(lián)在一起的偽代碼:
if (condition1) {
statement1
} else if (condition2) {
statement2
} else if (condition3) {
statement3
. . .
} else {
statementN
}
Selecting from many options with Switch Statements
- 如果你有非常多的選項需要選擇,可以使用switch語句岳守。根據(jù)不同的參數(shù)值會匹配上不同的case分支凄敢,語句會從第一個匹配的case分支開始執(zhí)行,直到碰到break就結(jié)束湿痢。
這是一個偽代碼案例:
switch (num) {
case value1:
statement1;
break;
case value2:
statement2;
break;
...
case valueN:
statementN;
break;
}
測試case 值使用嚴(yán)格等于涝缝,break關(guān)鍵字告訴javascript停止執(zhí)行語句。如果沒有break關(guān)鍵字譬重,下一個語句會繼續(xù)執(zhí)行拒逮。
Adding a default option in Switch statements
- 在switch 語句中你可能無法用case來指定所有情況,這時你可以添加default語句臀规。當(dāng)再也找不到case匹配的時候default語句會執(zhí)行滩援,非常類似于if/else組合中的else語句。
default語句應(yīng)該是最后一個case塔嬉。
switch (num) {
case value1:
statement1;
break;
case value2:
statement2;
break;
...
default:
defaultStatement;
}
Multiple Identical Options in Switch Statements
- 如果switch語句中的case分支的break 語句漏掉了玩徊,后面的 case語句會一直執(zhí)行直到遇到break。如果你有多個輸入值和輸出值一樣谨究,可以試試下面的switch語句:
switch(val) {
case 1:
case 2:
case 3:
result = "1, 2, or 3";
break;
case 4:
result = "4 alone";
}
分支1恩袱、2、3將會產(chǎn)生相同的輸出結(jié)果胶哲。
Replacing If Else Chains with Switch
- 如果你有多個選項需要選擇憎蛤,switch 語句寫起來會比多個串聯(lián)的if/if else語句容易些,譬如:
if (val === 1) {
answer = "a";
} else if (val === 2) {
answer = "b";
} else {
answer = "c";
}
可以被下面替代:
switch (val) {
case 1:
answer = "a";
break;
case 2:
answer = "b";
break;
default:
answer = "c";
}
Returning Boolean Values from Functions
- 你可能會回想起Comparison with the Equality Operator 纪吮,所有的比較操作符返回的都是一個boolean值俩檬,要么是true
要么是false。 - 使用if/else語句來做比較然后返回true或false已經(jīng)成為大家的共識:
function isEqual(a,b) {
if (a === b) {
return true;
} else {
return false;
}
}
因為=== 總是返回 true 或 false碾盟,所以我們可以直接返回比較的結(jié)果:
function isEqual(a,b) {
return a === b;
}
Return Early Pattern for Functions
- 當(dāng)代碼執(zhí)行到return語句時棚辽,函數(shù)返回一個結(jié)果就結(jié)束運行了,return后面的語句根本不會執(zhí)行冰肴。
舉例
function myFun() {
console.log("Hello");
return "World";
console.log("byebye")
}
myFun();
上面的代碼輸出"Hello"到控制臺屈藐、返回 "World",但沒有輸出"byebye"熙尉,因為函數(shù)遇到return語句就退出了联逻。
Build JavaScript Objects
你之前可能聽說過對象 object 。
- 對象和數(shù)組很相似检痰,數(shù)組是通過索引來訪問和修改數(shù)據(jù)包归,對象是通過屬性來訪問和修改數(shù)據(jù)的。
這是一個示例對象:
var cat = {
"name": "Whiskers",
"legs": 4,
"tails": 1,
"enemies": ["Water", "Dogs"]
};
對象適合用來存儲結(jié)構(gòu)化數(shù)據(jù)铅歼,就和真實世界的對象一模一樣公壤,比如一只貓。
Accessing Objects Properties with the Dot Operator
- 有兩種方式訪問對象屬性椎椰,一個是點操作符(.)厦幅,一個是中括號操作符([])。
- 當(dāng)你知道屬性的名稱的時候慨飘,使用點操作符确憨。
這是一個使用點操作符讀取對象屬性的例子:
var myObj = {
prop1: "val1",
prop2: "val2"
};
var prop1val = myObj.prop1; // val1
var prop2val = myObj.prop2; // val2
Accessing Objects Properties with Bracket Notation
- 第二種訪問對象的方式就是中括號操作符([]),如果你想訪問的屬性的名稱有一個空格瓤的,這時你只能使用中括號操作符([])休弃。
這是一個使用中括號操作符([])讀取對象屬性的例子:
var myObj = {
"Space Name": "Kirk",
"More Space": "Spock"
};
myObj["Space Name"]; // Kirk
myObj['More Space']; // Spock
提示:屬性名稱中如果有空格,必須把屬性名稱用單引號或雙引號包裹起來堤瘤。
Accessing Objects Properties with Variables
- 中括號操作符的另一個使用方式是用變量來訪問一個屬性玫芦。當(dāng)你需要遍歷對象的屬性列表或查表時,這種方式極為有用本辐。
這有一個使用變量來訪問屬性的例子:
var someProp = "propName";
var myObj = {
propName: "Some Value"
}
myObj[someProp]; // "Some Value"
還有更多:
var myDog = "Hunter";
var dogs = {
Fido: "Mutt",
Hunter: "Doberman",
Snoopie: "Beagle"
}
var breed = dogs[myDog]; // "Hunter"
console.log(breed)// "Doberman"
提示:當(dāng)我們通過變量名訪問屬性的時候桥帆,不需要給變量名包裹引號。因為實際上我們使用的是變量的值慎皱,而不是變量的名稱老虫。
Updating Object Properties
- 當(dāng)你創(chuàng)建了一個對象后,你可以用點操作符或中括號操作符來更新對象的屬性茫多。
舉個例子祈匙,讓我們看看 ourDog:
var ourDog = {
"name": "Camper",
"legs": 4,
"tails": 1,
"friends": ["everything!"]
};
讓我們更改它的名稱為 "Happy Camper",這有兩種方式來更新對象的name屬性:
ourDog.name = "Happy Camper";
ourDog["name"] = "Happy Camper";
Add New Properties to a JavaScript Object
- 你也可以像更改屬性一樣給對象添加屬性。
看看我們是如何給ourDog添加 "bark"屬性:
ourDog.bark = "bow-wow";
or
ourDog["bark"] = "bow-wow";
Delete Properties from a JavaScript Object
- 我們同樣可以刪除對象的屬性夺欲,例如:
delete ourDog.bark;
Using Objects for Lookups
- 對象和字典一樣跪帝,可以用來存儲鍵/值對。如果你的數(shù)據(jù)跟對象一樣些阅,你可以用對象來查找你想要的值伞剑,而不是使用switch或if/else語句。當(dāng)你知道你的輸入數(shù)據(jù)在某個范圍時市埋,這種查找方式極為有效黎泣。
這是簡單的反向字母表:
var alpha = {
1:"Z",
2:"Y",
3:"X",
4:"W",
...
24:"C",
25:"B",
26:"A"
};
alpha[2]; // "Y"
alpha[24]; // "C"
var value = 2;
alpha[value]; // "Y"
Testing Objects for Properties
- 有時檢查一個對象屬性是否存在是非常有用的,我們可以用.hasOwnProperty(propname)方法來檢查對象是否有該屬性缤谎。如果有返回true抒倚,反之返回 false。
舉例
var myObj = {
top: "hat",
bottom: "pants"
};
myObj.hasOwnProperty("top"); // true
myObj.hasOwnProperty("middle"); // false
Introducing JavaScript Object Notation JSON
- JavaScript Object Notation 簡稱 JSON坷澡,它使用JavaScript對象的格式來存儲數(shù)據(jù)托呕。JSON是靈活的,因為它允許 數(shù)據(jù)結(jié)構(gòu) 是 字符串洋访,數(shù)字镣陕,布爾值,數(shù)組姻政,函數(shù)呆抑,和 對象 的任意組合。
這里是一個JSON對象的示例:
var ourMusic = [
{
"artist": "Daft Punk",
"title": "Homework",
"release_year": 1997,
"formats": [
"CD",
"Cassette",
"LP" ],
"gold": true
}
];
這是一個對象數(shù)組汁展,并且對象有各種關(guān)于專輯的 詳細(xì)信息鹊碍。它也有一個嵌套的 formats 的數(shù)組。附加專輯記錄可以被添加到數(shù)組的最上層食绿。
注:你應(yīng)該在每個對象后添加一個逗號侈咕,除非這個對象是數(shù)組中的最后一個。
Accessing Nested Objects in JSON
- 通過串聯(lián)起來的點操作符或中括號操作符來訪問JSON對象的嵌套屬性器紧。
下面是一個嵌套的JSON對象:
var ourStorage = {
"desk": {
"drawer": "stapler"
},
"cabinet": {
"top drawer": {
"folder1": "a file",
"folder2": "secrets"
},
"bottom drawer": "soda"
}
}
ourStorage.cabinet["top drawer"].folder2; // "secrets"
ourStorage.desk.drawer; // "stapler"
Accessing Nested Arrays in JSON
- 正如我們在前面的例子所見耀销,JSON對象可以嵌套對象和數(shù)組。與訪問嵌套對象一樣铲汪,用中括號操作符同樣可以訪問嵌套數(shù)組熊尉。
下面是如何訪問嵌套數(shù)組的例子:
var ourPets = {
"cats": [
"Meowzer",
"Fluffy",
"Kit-Cat"
],
"dogs": [
"Spot",
"Bowser",
"Frankie"
]
};
ourPets.cats[1]; // "Fluffy"
ourPets.dogs[0]; // "Spot"
Iterate with JavaScript For Loops
- 一個條件語句只能執(zhí)行一次代碼,而一個循環(huán)語句可以多次執(zhí)行代碼掌腰。
- JavaScript 中最常見的循環(huán)就是“for循環(huán)”狰住。
- for循環(huán)中的三個表達(dá)式用分號隔開:
for ([初始化]; [條件判斷]; [計數(shù)器])
初始化語句只會在執(zhí)行循環(huán)開始之前執(zhí)行一次。它通常用于定義和設(shè)置你的循環(huán)變量齿梁。
條件判斷語句會在每一輪循環(huán)的開始執(zhí)行催植,只要條件判斷為 true 就會繼續(xù)執(zhí)行循環(huán)肮蛹。當(dāng)條件為 false的時候,循環(huán)將停止執(zhí)行创南。這意味著伦忠,如果條件在一開始就為 false,這個循環(huán)將不會執(zhí)行扰藕。
計數(shù)器是在每一輪循環(huán)結(jié)束時執(zhí)行缓苛,通常用于遞增或遞減。
在下面的例子中邓深,先初始化i = 0,條件 i < 5 為真笔刹,進(jìn)入第一次循環(huán)芥备,執(zhí)行大括號里的代碼,第一次循環(huán)結(jié)束舌菜。遞增i的值萌壳,條件判斷,就這樣依次執(zhí)行下去日月,直到條件判斷為假袱瓮,整個循環(huán)結(jié)束。
var ourArray = [];
for (var i = 0; i < 5; i++) {
ourArray.push(i);
}
最終 ourArray 的值為 [0,1,2,3,4]
Iterate Odd Numbers With a For Loop
- for循環(huán)可以按照我們指定的順序來迭代爱咬,通過更改我們的 計數(shù)器尺借,我們可以按照偶數(shù)順序來迭代。
初始化 i = 0精拟,當(dāng) i < 10 的時候繼續(xù)循環(huán)燎斩。
i += 2 讓 i 每次循環(huán)之后增加2。
var ourArray = [];
for (var i = 0; i < 10; i += 2) {
ourArray.push(i);
}
循環(huán)結(jié)束后蜂绎,ourArray 的值為 [0,2,4,6,8]栅表。
Count Backwards With a For Loop
for循環(huán)也可以逆向迭代,只要我們定義好合適的條件师枣。
為了能夠從后往前兩兩倒數(shù)怪瓶,我們需要改變我們的 初始化,條件判斷 和 計數(shù)器践美。
我們讓 i = 10洗贰,并且當(dāng) i > 0 的時候才繼續(xù)循環(huán)。我們使用 i-=2 來讓 i 每次循環(huán)遞減 2拨脉。
var ourArray = [];
for (var i=10; i > 0; i-=2) {
ourArray.push(i);
}
循環(huán)結(jié)束后哆姻,ourArray 的值為 [10,8,6,4,2].
Iterate Through an Array with a For Loop
- 迭代輸出一個數(shù)組的每個元素是 JavaScript 中的常見需求, for 循環(huán)可以做到這一點玫膀。
下面的代碼將輸出數(shù)組 arr 的每個元素到控制臺:
var arr = [10,9,8,7,6];
for (var i=0; i < arr.length; i++) {
console.log(arr[i]);
}
記住數(shù)組的索引從零開始的矛缨,這意味著數(shù)組的最后一個元素的下標(biāo)是:數(shù)組的長度 - 1。我們這個循環(huán)的 條件 是 i < arr.length,當(dāng) i 的值為 長度-1 的時候循環(huán)就停止了箕昭。
Nesting For Loops
如果你有一個二維數(shù)組灵妨,可以使用相同的邏輯,先遍歷外面的數(shù)組落竹,再遍歷里面的子數(shù)組泌霍。下面是一個例子:
var arr = [
[1,2], [3,4], [5,6]
];
for (var i=0; i < arr.length; i++) {
for (var j=0; j < arr[i].length; j++) {
console.log(arr[i][j]);
}
}
一次輸出 arr 中的每個子元素。提示述召,對于內(nèi)部循環(huán)朱转,我們可以通過 arr[i] 的 .length 來獲得子數(shù)組的長度,因為 arr[i] 的本身就是一個數(shù)組积暖。
Iterate with JavaScript While Loops
- 另一種類型的 JavaScript 循環(huán)被稱為while循環(huán)藤为,因為它規(guī)定,當(dāng)(while)條件為真夺刑,循環(huán)才會執(zhí)行缅疟,反之不執(zhí)行。
var ourArray = [];
var i = 0;
while(i < 5) {
ourArray.push(i);
i++;
}
Generate Random Fractions with JavaScript
計算機(jī)的行為只有兩種:確定性和隨機(jī)性遍愿。當(dāng)你一步步地闖關(guān)來到這里就是確定行為存淫,當(dāng)你隨意點了個鏈接就來到這里就是隨機(jī)行為。
而隨機(jī)數(shù)最適合用來創(chuàng)建這種隨機(jī)行為沼填。
Math.random()用來生成一個在0(包括0)到1(不包括1)之間的隨機(jī)小數(shù)桅咆,因此Math.random()可能返回0但絕不會返回1。
提示:隨后的函數(shù)都會在return執(zhí)行前調(diào)用倾哺,所以我們可以直接返回Math.random()的值轧邪。
Generate Random Whole Numbers with JavaScript
生成隨機(jī)小數(shù)很棒,但隨機(jī)數(shù)更有用的地方在于生成隨機(jī)整數(shù)羞海。
用 Math.random() 生成一個隨機(jī)小數(shù)忌愚。
把這個隨機(jī)小數(shù)乘以 20。
用 Math.floor() 向下取整 獲得它最近的整數(shù)却邓。
記住 Math.random() 永遠(yuǎn)不會返回 1硕糊。同時因為我們是在用 Math.floor() 向下取整,所以最終我們獲得的結(jié)果不可能有 20腊徙。這確保了我們獲得了一個在0到19之間的整數(shù)简十。
把操作連綴起來,代碼類似于下面:
Math.floor(Math.random() * 20);
我們先調(diào)用 Math.random()撬腾,把它的結(jié)果乘以20螟蝙,然后把上一步的結(jié)果傳給 Math.floor(),最終通過向下取整獲得最近的整數(shù)民傻。
Generate Random Whole Numbers within a Range
我們之前生成的隨機(jī)數(shù)是在0到某個數(shù)之間胰默,現(xiàn)在我們要生成的隨機(jī)數(shù)是在兩個指定的數(shù)之間场斑。
我們需要定義一個最小值和一個最大值。
下面是我們將要使用的方法牵署,仔細(xì)看看并嘗試?yán)斫膺@行代碼到底在干嘛:
Math.floor(Math.random() * (max - min + 1)) + min
- Math.random() * (max - min + 1) 的取值范圍[0, max - min]
- Math.random() * (max - min + 1) + min的取值范圍[min, max]
Sift through Text with Regular Expressions
- Regular expressions 正則表達(dá)式被用來根據(jù)某種匹配模式來尋找strings中的某些單詞漏隐。
舉例:如果我們想要找到字符串The dog chased the cat中單詞 the,我們可以使用下面的正則表達(dá)式: /the/gi
我們可以把這個正則表達(dá)式分成幾段:
/
是這個正則表達(dá)式的頭部
the
是我們想要匹配的模式
/
是這個正則表達(dá)式的尾部
g
代表著 global(全局)奴迅,意味著返回所有的匹配而不僅僅是第一個青责。
i
代表著忽略大小寫,意思是當(dāng)我們尋找匹配的字符串的時候忽略掉字母的大小寫取具。
Find Numbers with Regular Expressions
我們可以在正則表達(dá)式中使用特殊選擇器來選取特殊類型的值脖隶。
- 特殊選擇器中的一種就是數(shù)字選擇器
\d
,意思是被用來獲取一個字符串的數(shù)字者填。
在JavaScript中, 數(shù)字選擇器類似于: /\d/g
- 在選擇器后面添加一個加號標(biāo)記(+)浩村,例如:
/\d+/g
,它允許這個正則表達(dá)式匹配一個或更多數(shù)字占哟。此時,一個單詞也只會使計數(shù)器加1.
尾部的g
是'global'的簡寫酿矢,意思是允許這個正則表達(dá)式 找到所有的匹配而不是僅僅找到第一個匹配榨乎。
Find Whitespace with Regular Expressions
- 我們也可以使用正則表達(dá)式選擇器 \s 來選擇一個字符串中的空白。
空白字符有" "
(空格符 space)瘫筐、\r
(回車符 the carriage return)蜜暑、\n
(換行符 newline)、\t (
制表符 tab) 和\f
(換頁符 the form feed)策肝。
空白正則表達(dá)式類似于:
/\s+/g
Invert Regular Expression Matches with JavaScript
- 你可以用正則表達(dá)式選擇器的大寫版本來轉(zhuǎn)化任何匹配肛捍。
舉個例子:\s
匹配任何空白字符,\S
匹配任何非空白字符之众。