ECMA-262通過叫做ECMAScript的“僞語言”爲我們描述了所有的基本概念:
- 語法
- 關鍵字和保留字
- 變量
- 數據類型
- 操作符
- 語句
- 函數
3.1 語法
ECMAScript 的語法大量借鑑了C及其他類C語言(如Java 和 Perl)的語法
3.1.1 區分大小寫 ECMAScript中的一切(變量、函數名和操作符)都區分大小寫。
3.1.2 標識符
標識符,就是指變量、函數、屬性的名字,或者函數的參數。
標識符可以是按照下列各式規則組合起來的一個或多個字符:
- 第一個字符不能是數字,必須是一個字母、下劃線(_)或者一個美元符號($);
- 其他字符可以是字母、下劃線、美元符號或數字。
按照慣例,ECMAScript標識符采用駝峯大小寫格式,也就是第一個字母小寫,剩下的每個單詞的首字母大寫。
注:不能把關鍵字、保留字、true、false 和 null 用作標識符。
特殊:(其實也是慣例)爲了區別ECMAScript中的其他函數,構造函數始終都應該以一個大寫字母開頭,而非構造函數則應該以一個小寫字母開頭。(摘自《JavaScript高級程序設計》P145) 例如:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
alert(this.name)
};
}
3.1.3 註釋
單行註釋以兩個斜槓開頭:
// 單行註釋
多行註釋以 /* 開頭,以 */ 結尾:
/*
* 這是一個多行(塊級)註釋
*
*/
3.1.4 嚴格模式
ECMAScript 5
引入了嚴格模式(strict mode)的概念。
嚴格模式是爲JavaScript
定義了一種不同的解析與執行模型。在嚴格模式下,ECMAScript 3
中的一些不確定的行爲將得到處理,而且對某些不安全的操作也會拋出錯誤。
要在整個腳本中啓用嚴格模式,可以在頂部添加如下代碼:
"use strict";
這行代碼看起來像是字符串,而且也沒有賦值給任何變量,但其實它是一個編譯指示(pragma),用於告訴支持的JavaScript
引擎切換到嚴格模式。這是爲不破壞ECMAScript 3
語法而特意選定的語法。
在函數內部的上方包含這條編譯指示,也可以指定函數在嚴格模式下執行:
function doSomething(){
"use strict";
//函數體
}
支持嚴格模式的瀏覽器包括IE10+、Firefox 4+、Safari
5.1+、Opera 12+和Chrome。
3.1.5 語句
語句是以一個分號( ; )結尾;任何時候不要省略它。
代碼塊可以使用花括號({ }) 來把多條語句組合到一個代碼塊中。
3.2 關鍵字和保留字
關鍵字: 可以用來表示控制語句的開始和結束,或者用於執行特定操作。不能用於標識符。
注: 帶*上標的是第5版新增的關鍵字
保留字: 還沒有任何特定的用途(囧),但它們可能在將來被用作關鍵字。
注: let 和 yield 是第5版新增的保留字。
最好不要使用關鍵字和保留字作爲標識符和屬性名!
3.3 變量(第四章整章詳述)
ECMAScript 的變量是鬆散類型的,即可以用來保存任何類型的數據。
定義變量是要使用 var 操作符,後跟變量名(即一個標識符)。
例: var message;
另外,可以同時定義多個變量,主要把每個變量用逗號分隔開即可:
var message = "hi",
found = false,
age = 28;
注意:用 var 操作符定義的變量將成爲定義該變量的作用域中的局部變量。也就是說,在函數中使用 var 定義了一個變量,那麼這個變量在函數退出後就會被銷燬。
例如:
function test () {
var message = "hi"; //局部變量
}
test();
alert(message); //錯誤
這個例子中如果省略 var ,message將會變成全局變量,就可以在函數外部的任何地方被訪問到。
但是由於在局部作用域中定義全局變量很難維護,而且如果有意忽略 var 操作符,也會由於相應變量不會馬上有定義而導致不必要的混亂。所以,不推薦這麼使用。
3.4 數據類型
5種基本數據類型 :Undefined、
Null、
Boolean、 Number 和 String
1種複雜數據類型 :Object——本質上是由一組無序的名值對組成的。(第五章詳述)
3.4.1 typeof 操作符
作用:用來檢測給定變量的數據類型。
對一個值使用 typeof 操作符可能返回下列某個字符串:
- "undefined"——如果這個值未定義
- "boolean"——如果這個值是布爾值
- "string"——如果這個值是字符串
- "number"——如果這個值是數值
- "object"——如果這個值是 對象 或 null(因爲特殊值 null 被認爲是一個空的對象引用)
- "function"——如果這個值是 函數
3.4.2 Undefined 類型
Undefined 類型只有一個值,即特殊的 undefined。
在使用 var 聲明變量,但並未對其加以初始化時,這個變量的值就是 undefined。
不過,包含undefined值的變量和尚未定義的變量還是不一樣的。例:
var a; // a 聲明後未賦值,默認取得undefined值
// var b; // b 沒有聲明
alert(a); //"undefined"
alert(b); //產生錯誤
alert(typeof a); // "undefined"
alert(typeof b); // "undefined"
雖然 a 和 b 一個聲明,一個未聲明,本質上有區別,但實際上無論對哪個變量也不可能執行真正的操作。 typeof操作符都返回undefined。
3.4.3 Null 類型
只有一個值,即特殊的 null 。
從邏輯上講,null 值表示一個空對象的指針。所以用 typeof 檢測 null 值會返回 "object"。如下:
var car = null;
alert(typeof car); //"object"
實際上, undefined 派生自 null 值。 alert(null == undefined); //true
3.4.4 Boolean 類型
該類型只有兩個字面值: true 和 false
雖然Boolean類型的字面值只有兩個,但 ECMAScript 中所有類型的值都有與這兩個 Boolean 值等價的值。
這些轉換規則對理解流控制語句自動執行相應的Boolean轉換非常重要。
3.4.5 Number 類型
1、浮點數值
——該數值中必須包含一個小數點,並且小數點後面必須至少有一位數字。
var floatNum1 = 1.2;
var floatNum1 = 0.2;
var floatNum1 = .2; //有效,但不推薦
對於極大或極小的數值,可以使用科學計數法表示
var floatNum = 3.21e6; //等於3210000;
浮點數的最高精度是17位小數,但在進行算術計算時精確到遠遠不如整數。會產生舍入誤差。
2、數值範圍
ECMAScript能表示的最小數值保存在 Number.MIN_VALUE 中,在大多數瀏覽器中,這個值是 5e-324
ECMAScript能表示的最大數值保存在 Number.MAX_VALUE 中,在大多數瀏覽器中,這個值是 1.7976931348623157e+308
超出這兩個數值範圍,會轉換爲:
正無窮(Infinity) 負無窮(-Infinity)
用函數 isFinite( )來確定一個數值是不是有窮的(即是不是位於最大值與最小值之間)
3.NaN
——即非數值(Not a Number)
用於表示一個本來要返回數值的操作數未返回數值的情況。
特點:
- 任何涉及NaN的操作(例如 NaN/10)都會返回NaN
- NaN 與任何值都不相等,包括NaN本身。
用 isNaN( )來確定一個參數是否“不是數值”。
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false
alert(isNaN("10")); //false (可以被轉換成數值10)
alert(isNaN("blue")); //true (不能被轉換成數值)
alert(isNaN(true)); //false (可以被轉換成數值1)
4、數值轉換
有3個函數可以把非數值轉換爲數值:
- Number( ) 用於任何數據類型
- parseInt( ) 字符串>>>數值
- parseFloat( ) 字符串>>>數值
轉換規則如下:
3.4.6 String 類型
1、字符字面量(轉義序列)
這些字符字面量可以出現在字符串中的任意位置,而且也將被作爲一個字符來解析,如下面的例子所示:
var text = "This is the letter sigma: \u03a3.";
這個例子中的變量text
有28
個字符,其中6 個字符長的轉義序列表示1
個字符。
2、轉換爲字符串
- toString( )
數值、布爾值、對象甚至字符串都有toString( ) 方法。但 null 和 undefined 沒有該方法。
- String( )
-
- 如果值有 toString( ) 方法,則優先調用該方法並返回相應結果。
- 如果值是 null ,則返回 "null"
- 如果值是 undefined,則返回 "undefined"
var value1 = 10;
var value2 = true;
var value3 = null;
var value4 ;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"
3.4.7 Object 類型
——對象就是一組數據和功能的集合。
可以通過執行 new 操作符後跟要創建的對象類型的名稱來創建。
在ECMAScript中,Object類型是所有它的實例的基礎。
Objec每個實例都具有下列屬性和方法:
- constructor : 保存着用於創建當前對象的函數。
- hasOwnProperty(propertyName) : 用於檢查給定的屬在當前對象實例中(而不是在實例的原型中)是否存在。
- isPrototypeOf(object) : 用於檢查傳入的對象是否是當前對象的原型。
- propertyIsEnumerable(properName) : 用於檢查給定的屬性是否能夠使用 for-in 語句來枚舉
- toLocaleString( ) : 返回對象的字符創表示,該字符串與執行環境的地區相關
- toString( ) : 返回對象的字符串表示
- valueOf( ) : 返回對象的字符串、數值或布爾值表示。