JavaScript Guide

語法和數(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 對象

Objectsfunctions 是本語言的其他兩個基本要素。你可以將對象視為存放值的命名容器,而將函數(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)被廢棄,但沒有被刪除)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容