語法和數(shù)據(jù)類型
1.There are three kinds of declaration in JavaScript
var
Declares a variable, optionally initializing it to a value.
let
Declares a block-scoped, local variable, optionally initializing it to a value.
const
Declares a block-scoped, read-only named constant.
By simply assigning it a value. For example, x = 42. This always declares a global variable, if it is declared outside of any function. It generates a strict JavaScript warning. You shouldn't use this variant.
A variable declared using the var or let statement with no assigned value specified has the value of undefined
.
The undefined value behaves as false when used in a boolean context.
The undefined value converts to NaN when used in numeric context.
When you evaluate a null
variable, the null value behaves as 0 in numeric contexts and as false in boolean contexts.
試圖訪問一個未聲明的變量或者訪問一個使用 let 聲明的但未初始化的變量會導(dǎo)致一個 ReferenceError 異常被拋出。
4.Variable hoisting
JavaScript 變量的另一特別之處是,你可以引用稍后聲明的變量而不會引發(fā)異常。這一概念稱為變量聲明提升(hoisting);JavaScript 變量感覺上是被“提升”或移到了所有函數(shù)和語句之前。然而提升后的變量將返回 undefined 值。所以在使用或引用某個變量之后進行聲明和初始化操作,這個被提升的引用仍將得到 undefined 值。
/**
* Example 1
*/
console.log(x === undefined); // logs "true"
var x = 3;
/**
* Example 2
*/
// will return a value of undefined
var myvar = "my value";
(function() {
console.log(myvar); // undefined,其實后面的 myvar有沒有聲明都返回 undefined
var myvar = "local value";
})();
/**
* Example 1
*/
var x;
console.log(x === undefined); // logs "true"
x = 3;
/**
* Example 2
*/
var myvar = "my value";
(function() {
var myvar;
console.log(myvar); // undefined
myvar = "local value";
})();
在 ECMAScript 2015 中,let(const)將不會提升變量到代碼塊的頂部。因此,在變量聲明之前引用這個變量,將拋出錯誤ReferenceError
。這個變量將從代碼塊一開始的時候就處在一個“暫時性死區(qū)”,直到這個變量被聲明為止。
console.log(x); // ReferenceError
let x = 3;
5.函數(shù)提升(Function hoisting)
對于函數(shù),只有函數(shù)聲明會被提升到頂部,而不包括函數(shù)表達式。
/* 函數(shù)聲明 */
foo(); // "bar"
function foo() {
console.log("bar");
}
/* 函數(shù)表達式 表達式定義的函數(shù),稱為匿名函數(shù)。匿名函數(shù)沒有函數(shù)提升。*/
baz(); // TypeError: baz is not a function
//此時的"baz"相當(dāng)于一個聲明的變量,類型為undefined。
由于baz只是相當(dāng)于一個變量,因此瀏覽器認為"baz()"不是一個函數(shù)。
var baz = function() {
console.log("bar2");
};
6.數(shù)據(jù)結(jié)構(gòu)和類型
六種 原型 數(shù)據(jù)類型:
Boolean. 布爾值,true 和 false
.
null. 一個表明 null 值的特殊關(guān)鍵字。 JavaScript 是大小寫敏感的,因此 null
與Null、NULL或其他變量完全不同。
undefined. 變量未定義時的屬性。
Number. 表示數(shù)字,例如: 42 或者 3.14159。
String. 表示字符串,例如:"Howdy"
Symbol ( 在 ECMAScript 6 中新添加的類型).。一種數(shù)據(jù)類型,它的實例是唯一且不可改變的。
以及 Object 對象
Objects 和 functions 是本語言的其他兩個基本要素。你可以將對象視為存放值的命名容器,而將函數(shù)視為你的應(yīng)用程序能夠執(zhí)行的過程(procedures)。
7.數(shù)據(jù)類型的轉(zhuǎn)換
字符串轉(zhuǎn)換為數(shù)字(converting strings to numbers)
parseInt()和parseFloat()
參見:parseInt()和parseFloat()的相關(guān)頁面。
parseInt 僅能夠返回整數(shù),所以使用它會丟失小數(shù)部分。另外,調(diào)用 parseInt 時最好總是帶上進制(radix) 參數(shù),這個參數(shù)用于指定使用哪一種進制。
單目加法運算符
將字符串轉(zhuǎn)換為數(shù)字的另一種方法是使用單目加法運算符。
"1.1" + "1.1" = "1.11.1"
(+"1.1") + (+"1.1") = 2.2 // 注:加入括號為清楚起見,不是必需的。
8.字面量
在JavaScript中,你可以使用各種字面量。這些字面量是腳本中按字面意思給出的固定的值,而不是變量。(譯注:字面量是常量,其值是固定的,而且在程序腳本運行中不可更改,比如false,3.1415,thisIsStringOfHelloworld ,invokedFunction:myFunction("myArgument")。
數(shù)組字面量 (Array literals)
var coffees = ["French Roast", "Colombian", "Kona"];
var a=[3];
console.log(a.length); // 1
console.log(a[0]); // 3
如果你在元素列表的尾部添加了一個逗號,它將會被忽略。在下面的例子中,數(shù)組的長度是3,并不存在myList[3]這個元素。
var myList = ['home', , 'school', ];
整數(shù)
整數(shù) (Intergers)
(譯注:原文如此,沒寫成“整數(shù)字面量”,這里指的是整數(shù)字面量。)
整數(shù)可以用十進制(基數(shù)為10)、十六進制(基數(shù)為16)、八進制(基數(shù)為8)以及二進制(基數(shù)為2)表示。
十進制整數(shù)字面量由一串?dāng)?shù)字序列組成,且沒有前綴0。
八進制的整數(shù)以 0(或0O、0o)開頭,只能包括數(shù)字0-7。
十六進制整數(shù)以0x(或0X)開頭,可以包含數(shù)字(0-9)和字母 a~f 或 A~F。
二進制整數(shù)以0b(或0B)開頭,只能包含數(shù)字0和1。
嚴格模式下,八進制整數(shù)字面量必須以0o或0O開頭,而不能以0開頭。
0, 117 and -345 (十進制, 基數(shù)為10)
015, 0001 and -0o77 (八進制, 基數(shù)為8)
0x1123, 0x00111 and -0xF1A7 (十六進制, 基數(shù)為16或"hex")
0b11, 0b0011 and -0b11 (二進制, 基數(shù)為2)
對象字面量 (Object literals)
對象屬性名字可以是任意字符串,包括空串。如果對象屬性名字不是合法的javascript標(biāo)識符,它必須用""包裹。屬性的名字不合法,那么便不能用.訪問屬性值,而是通過類數(shù)組標(biāo)記("[]")訪問和賦值。
var unusualPropertyNames = {
"": "An empty string",
"!": "Bang!"
}
console.log(unusualPropertyNames.""); // 語法錯誤: Unexpected string
console.log(unusualPropertyNames[""]); // An empty string
console.log(unusualPropertyNames.!); // 語法錯誤: Unexpected token !
console.log(unusualPropertyNames["!"]); // Bang!
var foo = {a: "alpha", 2: "two"};
console.log(foo.a); // alpha
console.log(foo[2]); // two
//console.log(foo.2); // Error: missing ) after argument list
//console.log(foo[a]); // Error: a is not defined
console.log(foo["a"]); // alpha
console.log(foo["2"]); // two
流程控制與錯誤處理
1.語句塊
注意:在ECMAScript 6標(biāo)準(zhǔn)之前,Javascript沒有塊作用域。如果你在塊的外部聲明了一個變量,然后在塊中聲明了一個相同變量名的變量,并賦予不同的值。那么在程序執(zhí)行中將會使用塊中的值,這樣做雖然是合法的,但是這不同于JAVA與C。示例:
var x = 1;{ var x = 2;}alert(x); // 輸出的結(jié)果為 2
這段代碼的輸出是2,這是因為塊級作用域中的 var x變量聲明與之前的聲明在同一個作用域內(nèi)。在C語言或是Java語言中,同樣的代碼輸出的結(jié)果是1。
從 ECMAScript 2015 開始,使用 let 定義的變量是塊作用域的。 參閱 let
。
2.條件判斷語句
不建議在條件表達式中使用賦值操作,因為在快速查閱代碼時容易看成等值比較。不要使用下面的代碼:
if (x = y) {
/* do the right thing */
}
如果你需要在條件表達式中使用賦值,通常在賦值語句前后額外添加一對括號。例如:
if ((x = y)) {
/* do the right thing */
}
False 等效值
下面這些值將被計算出 false (also known as Falsy values):
false
undefined
null
0
NaN
空字符串 ("")
當(dāng)傳遞給條件語句時,所有其他值,包括所有對象會被計算為 true 。
請不要混淆原始的布爾值true和false 與 布爾對象的值true和false(譯者注:下例中b屬于對象,會被計算為true!)。例如:
var b = new Boolean(false);
if (b) // this condition evaluates to true
if (b == true) // this condition evaluates to false
3.循環(huán)語句
標(biāo)簽語句(label Statement)
標(biāo)簽語句提供一種使你同一程序的在另一處找到它的標(biāo)識。例如,你可以用一個標(biāo)簽來識別一個循環(huán),并用break或continue語句來說明一個程序是否要中斷這個循環(huán)或是繼續(xù)執(zhí)行。如下所示:
label :
statement
label 的值可以是js的任何非保留字標(biāo)識符。 用label 標(biāo)識的語句可以是任何語句。
例如
在這個示例中,markLoop這個標(biāo)簽定義了一個while循環(huán)。
markLoop:
while (theMark == true) {
doSomething();
}
使用中斷語句終止循環(huán)、開關(guān)或與標(biāo)簽語句連接。
當(dāng)你使用沒有帶標(biāo)簽語句的中斷語句(break)時,while,do-while,for或者switch封閉的內(nèi)部語句將立即終止,并轉(zhuǎn)移到后面的語句執(zhí)行。
當(dāng)你使用帶有標(biāo)簽語句的中斷語句(break)時,將終止在特定的標(biāo)簽語句。
對象操作語句
for...in
語句迭代一個指定的變量去遍歷這個對象的屬性,每個屬性,javascript 執(zhí)行指定的語句。
數(shù)組(Arrays)雖然大多趨向于用for...in作為一種遍歷數(shù)組(Array)元素的方式,因為除了遍歷數(shù)組元素,for...in語句也遍歷了用戶自定義屬性。如果你修改了數(shù)組對象,比如添加了通用屬性或者方法,for...in語句還會返回除了數(shù)字索引(index)外的自定義屬性的名稱(name)。因此還是用帶有數(shù)字索引的傳統(tǒng)for循環(huán)來遍歷數(shù)組會比較好。
for each...in
是一種在 JavaScript 1.6介紹過的循環(huán)語句。它和for...in相似,但是讓對象屬性的值遞回取得,而不是作用于它們的名字。(已經(jīng)被廢棄,但沒有被刪除)