Javascript簡介
Javascript實現(xiàn)
雖然Javascript和ECMAscript通常都被人們用來表達(dá)相同的含義,但是Javascript的含義要比ECMA-262中規(guī)定的要多得多。
一個完整的Javascript實現(xiàn)由三部分組成:
- 核心(ECMAscript)
- 文檔對象模型(DOM)
- 瀏覽器對象模型(BOM)
ECMAscript
ECMA-262定義的只是這門語言的基礎(chǔ)。Web瀏覽器只是ECMAscript實現(xiàn)可能的宿主環(huán)境之一。
宿主環(huán)境不僅提供基本的ECMAscript實現(xiàn),同時也會提供該語言的擴展,以便語言與環(huán)境之間對接交互。其他宿主環(huán)境包括Node和Adobe Flash。
ECMAscript規(guī)定了以下組成部分:
- 語法
- 類型
- 語句
- 關(guān)鍵字
- 保留字
- 操作符
- 對象
什么是ECMAscript兼容?
要想成為ECMAscript的實現(xiàn),則該實現(xiàn)必須做到:
- 支持ECMA-262描述的所有“類型、值、對象、屬性、函數(shù)以及程序句法和語義”
- 支持Unicode字符標(biāo)準(zhǔn)
此外,兼容的實現(xiàn)還可以進(jìn)行下列擴展。
- 添加ECMA-262沒有描述的“更多類型、值、對象、屬性和函數(shù)”
- 支持ECMA-262沒有定義的“程序和正則表達(dá)式語法”
Web瀏覽器對ECMAscript的支持

文檔對象模型(DOM)
文檔對象模型(DOM,Document Object Model)是針對XML但經(jīng)過擴展用于HTML的應(yīng)用程序編程接口(API,Application Programming Interface)。
為什么要使用DOM?
防止瀏覽器互不兼容的情況。
DOM級別
DOM1級由兩個模塊組成:DOM核心(DOM core)和DOM HTML。
DOM核心規(guī)定如何映射基于XML的文檔結(jié)構(gòu),以便簡化對文檔中任意部分的訪問和操作。
DOM HTML模塊則在DOM核心的基礎(chǔ)上加以擴展,添加了針對HTML的對象和方法。
DOM2級在原來的DOM的基礎(chǔ)上有擴充了一些模塊,而且通過對象接口增加了對CSS的支持。DOM1級中的DOM核心模塊也經(jīng)過了擴展開始支持XML命名空間。
DOM3級則進(jìn)一步擴展了DOM,引入了以統(tǒng)一方式加載和保存文檔的方法---在DOM加載保存(DOM Load and Save)模塊中定義;新增了驗證文檔的方法---在DOM驗證(DOM Validation)模塊中定義。DOM3級也對DOM核心進(jìn)行了擴展,開始支持XML1.0規(guī)范,涉及XML Infoset、XPath和XML Base。
其他DOM標(biāo)準(zhǔn)
- SVG
- MathML
- SMIL
Web瀏覽器對DOM的支持

瀏覽器對象模型(BOM)
從根本上講,BOM只處理瀏覽器窗口和框架;但人們習(xí)慣上也把所有針對瀏覽器的JavaScript擴展算作BOM的一部分。
- 彈出新瀏覽器窗口的功能;
- 移動、縮放和關(guān)閉瀏覽器窗口的功能
- 提供瀏覽器詳細(xì)信息的navigator對象;
- 提供瀏覽器所加載頁面的詳細(xì)信息的location對象;
- 提供用戶顯示器分辨率詳細(xì)信息的screen對象;
- 對cookies的支持
- 像XMLHttpRequest或IE的ActiveXObject這樣的自定義對象。
由于沒有BOM標(biāo)準(zhǔn)可以遵循,每個瀏覽器都有自己的實現(xiàn)。但在HTML5中,BOM的實現(xiàn)細(xì)節(jié)朝著兼容性越來越高的方向發(fā)展。
JavaScript 版本
Mozilla公司是目前唯一還沿用最初的JavaScript版本編號序列的瀏覽器開發(fā)商。

Script標(biāo)簽
在HTML頁面中插入JavaScript的主要方法是使用<script>標(biāo)簽。
HTML4.01為<script>定義了6個屬性:
- async:可選
- charset:可選
- defer:可選
- language:已廢棄
- src:可選
- type:可選
有兩種使用<script>的方法:
- 直接嵌入JavaScript代碼
- 包含外部JavaScript代碼
<!-- 正確的script標(biāo)簽 -->
<script type="text/javascript" src="example.js"></script>
<!-- 不能在HTML文檔中使用下面的語法,某些瀏覽器(尤其是IE)不能正確的解析。 -->
<script type="text/javascript" src="example.js" />
按照慣例,JavaScript文件的后綴名是.js。但這個不是必須的,瀏覽器不會檢查包含JavaScript的文件的擴展名。但是服務(wù)器還是需要看擴展名來決定響應(yīng)哪種MIME類型。如果不使用.js擴展名,請確保服務(wù)器能返回正確的MIME類型。
在帶有src屬性的<script>標(biāo)簽中間不應(yīng)該包含額外的JavaScript代碼。如果包含了嵌入的代碼,則只會下載執(zhí)行外部腳本文件,嵌入的代碼會被忽略。
<script>元素的src屬性還可以包含來自外部域的JavaScript文件。
無論如何包含代碼,只要不存在defer和async屬性,瀏覽器都會按照<script>出現(xiàn)的順序?qū)λ麄冞M(jìn)行解析。
標(biāo)簽的位置
在<head>元素中的JavaScript文件,頁面會等到全部的JavaScript代碼被下載、解析和執(zhí)行完后,才開始呈現(xiàn)頁面內(nèi)容。對于很多JavaScript的頁面會產(chǎn)生明顯的延遲。所以最好把JavaScript代碼放在<body>元素中內(nèi)容的后面。
延遲腳本
當(dāng)<script>元素中定義了defer屬性,腳本立刻下載,但是延遲到整個頁面解析完畢后在運行。
異步腳本
在XHTML中的用法
下列代碼在HTML中是有效的,但在XHTML中是無效的。
<script type="text/javascript">
function compare(a, b) {
if (a < b) {
alert("A is less than B");
} else if (a > b) {
alert("A is greater than B");
} else {
alert("A is equal to B");
}
}
</script>
a<b中的<會被XHTML當(dāng)做開始一個新標(biāo)簽來解析,所以會導(dǎo)致語法錯誤。
有兩種方法可以避免:
- 用相應(yīng)的HTML實體(<)來替換小于號
- 用一個CData片段來包含JavaScript代碼。
嵌入代碼與外部文件
使用外部文件有一些優(yōu)點:
- 可維修性
- 可緩存
- 適應(yīng)未來
文檔模型
IE5.5引入了文檔模式的概念,通過使用文檔類型(doctype)切換實現(xiàn)。最初由兩種:
- 混雜模式(quirks mode),會讓IE的行為與IE5相同。
- 標(biāo)準(zhǔn)模式(standards mode),會更接近標(biāo)準(zhǔn)行為。
之后IE又提出了所謂的準(zhǔn)標(biāo)準(zhǔn)模式(almost standards mode)。
如果在文檔開始處沒有發(fā)現(xiàn)文檔類型聲明,則所有的瀏覽器都會默認(rèn)開啟混雜模式。
標(biāo)準(zhǔn)模式可以用下面任何一種文檔類型來開啟:
<!-- HTML 4.01 嚴(yán)格型 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<!-- XHTML 1.0 嚴(yán)格型 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- HTML5 -->
<!DOCTYPE html>
而對于準(zhǔn)標(biāo)準(zhǔn)模式,則可以通過過渡型(transitional)或框架集型(frameset)來觸發(fā):
<!-- HTML 4.01 過度型 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/html4/loose.dtd">
<!-- HTML 4.01 框架集型 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3c.org/TR/html4/frameset.dtd">
<!-- XHTML 1.0 過度型 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- XHTML 1.0 框架集型 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-Frameset.dtd">
<noscript>元素
只有在下列情況<noscript>元素才會顯示出來:
- 瀏覽器不支持腳本
- 瀏覽器支持腳本,但腳本被禁用
基本概念
區(qū)分大小寫
ECMAScript中的一切(變量、函數(shù)名和操作符)都區(qū)分大小寫。
標(biāo)識符
標(biāo)識符是按照下面的規(guī)則組合起來的一或多個字符。
- 第一個字符必須是一個字母、下劃線(_)或一個美元符($)。
- 其他字符可以是字母、下劃線、美元符號和數(shù)字。
標(biāo)識符中的字母也可以包含擴展的ASCII或Unicode字母字符,但是不推薦。
按照慣例,ECMAScript標(biāo)識符采用駝峰大小寫格式。
注釋
ECMAScript使用C風(fēng)格的注釋,包括單行注釋和塊級注釋。
//單行注釋
/*多行注釋*/
嚴(yán)格模式
ECMAScript5引用了嚴(yán)格模式(strict mode)的概念。
嚴(yán)格模式定義了一種不同的解析與執(zhí)行模型。在嚴(yán)格模式下,ECMAScript3中一些不確定的行為將得到處理,而且對某些不安全的操作也會拋出錯誤。
在頂部添加下面的代碼啟用嚴(yán)格模式。
"use strict";
也可以指定函數(shù)在嚴(yán)格模式下執(zhí)行:
function dosomething () {
""use strict;
//函數(shù)體
}
語句
ECMAScript中的語句以一個分號結(jié)尾;如果省略分號,則由解析器確定語句的結(jié)尾。
關(guān)鍵字和保留字
ECMAScript5對使用關(guān)鍵字和保留字的規(guī)則進(jìn)行了一些修改。關(guān)鍵字和保留字雖然仍然不能作為標(biāo)識符使用,但現(xiàn)在可以用作對象的屬性名。
ECMAScript5在嚴(yán)格模式下,還不能把eval和arguments作為標(biāo)識符或?qū)傩悦?,否則拋出錯誤。
變量
使用操作符var:
var message = "1";
數(shù)據(jù)類型
ECMAscript中有5種簡單的數(shù)據(jù)類型:
- Number
- Boolean
- String
- Null
- Undefined
1種復(fù)雜類型:
- Object
ECMAscript不支持任何創(chuàng)建自定義類型的機制,所有的值最終都將是上述6中數(shù)據(jù)類型之一。
typeof操作符
用來檢測給定變量的數(shù)據(jù)類型。typeof操作符可能返回下列值:
- "undefined"
- "boolean"
- "string"
- "number"
- "object"
- "function"
var a1 ="變量一";
alert(typeof a1);
alert(typeof(a1));
alert(typeof 81);
typeof的操作數(shù)可以是變量或者直接量。typeof是一個操作符而不是函數(shù),所以括號可有可無。
Safari5及之前的版本、Chrome7及之前版本在對正則表達(dá)式調(diào)用typeof操作符是會返回function,而其他瀏覽器在這種情況下回返回Object。
undefined 類型
在使用var聲明的變量但沒有對其初始化時,變量的值為undefined。
在ECMA-262第3版之前并沒有這個值。第3版引入是為了區(qū)分空對象指針和未初始化的變量。
包含undefined值得變量與尚未定義的變量還是不一樣的。
var message;
alert(message); //"undefined"
alert(age); //產(chǎn)生錯誤
typeof操作符對于未初始化的變量和未聲明的變量都返回undefined。
var message;
alert(typeof message); //"undefined"
alert(typeof age); //"undefined"
null 類型
typeof操作符檢測null值時會返回object。
實際上,undefined值派生自null值,因此ECMA-262規(guī)定對他們的相等性測試要返回true。
alert(null == undefined); //true
boolean 類型
該類型只有兩個字面量true和false。
true和false是區(qū)分大小寫的。
將一個值轉(zhuǎn)化為boolean值,可以使用Boolean()函數(shù):
var str = "string";
var b = Boolean(str);
| 數(shù)據(jù)類型 | 轉(zhuǎn)化為true的值 | 轉(zhuǎn)化為false的值 |
|---|---|---|
| Boolean | true | false |
| String | 任何非空字符串 | ""(空字符串) |
| Number | 任何非零數(shù)字值(包括無窮大) | o和NaN |
| Object | 任何對象 | null |
| Undefined | n/a | undefined |
轉(zhuǎn)化規(guī)則:
| 數(shù)據(jù)類型 | 轉(zhuǎn)化為true的值 | 轉(zhuǎn)化為false的值 |
|---|---|---|
| Boolean | true | false |
| String | 任何非空字符串 | ""(空字符串) |
| Number | 任何非零數(shù)字值(包括無窮大) | o和NaN |
| Object | 任何對象 | null |
| Undefined | n/a | undefined |
number 類型
ECMAScript使用IEEE754格式來表示整數(shù)和浮點數(shù)。
除了十進(jìn)制外,整數(shù)還可以通過八進(jìn)制或十六進(jìn)制來表示。
八進(jìn)制的字面量在嚴(yán)格模式下是無效的,會導(dǎo)致JavaScript引擎拋出錯誤。
浮點數(shù)值
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; // 有效,但是不推薦
var floatNum1 = 1.; // 小數(shù)點后面沒有數(shù)字,解析為1
var floatNum2 = 10.0; // 解析為整數(shù)10
默認(rèn)情況下,ECMAScript會將那些小數(shù)點后面帶有6個零以上的浮點數(shù)值轉(zhuǎn)換為以e表示法表示的數(shù)值。
浮點數(shù)值的最高精度是17位小數(shù),但在進(jìn)行算術(shù)計算時其精確度遠(yuǎn)遠(yuǎn)不如整數(shù)。
if (a + b == 0.3) { //不要做這樣的測試
alert("You got 0.3.");
}
數(shù)值范圍
由于內(nèi)存的限制,ECMAScript不能保存所有的數(shù)值。
Number.MIN_VALUE ECMAScript中能夠表示的最小值。
Number.MAX_VALUEECMAScript中能夠表示的最大值。
如果某次計算的結(jié)果超過了JavaScript數(shù)值范圍,那么結(jié)果會自動轉(zhuǎn)化為特殊的Infinity值。具體說,如果結(jié)果是正數(shù),則轉(zhuǎn)化為Infinity(正無窮),如果是負(fù)數(shù),則轉(zhuǎn)化為-Infinity(負(fù)無窮)。
如果計算返回了Infinity,那么該值無法繼續(xù)參加下一次計算。
可以使用isFinite()函數(shù)來確實一個數(shù)是否有窮。函數(shù)參數(shù)位于最小和最大值之間時會返回true。
var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); //false
NaN
NaN(not a number)是一個特殊的數(shù)值,用來表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(這樣就不會拋出錯誤)。
任何涉及NaN的操作都會返回NaN。
NaN與任何值都不相等,包括NaN本身。
使用isNaN()來判斷是否是 NaN值。
isNaN()會將參數(shù)轉(zhuǎn)化為數(shù)值,不能轉(zhuǎn)化的則返回true。
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false
alert(isNaN("10")); // false
alert(isNaN("blue")); //true
alert(isNaN(true)); //false
數(shù)值轉(zhuǎn)換
有3個可以把非數(shù)值轉(zhuǎn)化為數(shù)值的函數(shù):Number()、parseInt()、paresFloat()。Number()用于任何數(shù)據(jù)類型,而另外兩個則專門用于把字符串轉(zhuǎn)化為數(shù)值。
Number()轉(zhuǎn)換規(guī)則:
- 如果是Boolean值,true轉(zhuǎn)化為1,false轉(zhuǎn)化為0。
- 如果是數(shù)字,則只是簡單的傳入和返回。
- 如果是
null,返回0。 - 如果是
undefined,返回NaN。 - 如果是字符串,則
- 如果字符串中只包含數(shù)字(包括前面帶正號或負(fù)號的情況),則將其轉(zhuǎn)化為十進(jìn)制數(shù)值。
- 如果字符串中包含有效的浮點格式,則將其轉(zhuǎn)化為對應(yīng)的浮點數(shù)值。
- 如果字符串中包含有效的十六進(jìn)制格式,則將其轉(zhuǎn)化為相同大小的十進(jìn)制整數(shù)。
- 如果字符串為空,則將其轉(zhuǎn)化為0。
- 如果字符串中包含除上述格式之外的字符,則將其轉(zhuǎn)化為NaN。
- 如果是對象,則調(diào)用對象的
valueOf(),然后依照前面的規(guī)則轉(zhuǎn)化返回的值。如果轉(zhuǎn)化結(jié)果是NaN,則調(diào)用對象的toString()方法,然后在依照前面的規(guī)則轉(zhuǎn)化為字符串值。
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1
一元加操作符的操作和
Number()函數(shù)相同。
parseInt()會忽略字符串前面的空格,直到找到第一個非空字符。如果第一個字符不是數(shù)字字符或者負(fù)號,則返回NaN。如果第一個字符是數(shù)字字符,則會接著解析第二個字符,直到解析完所有后續(xù)字符或者遇到了一個非數(shù)字字符。如果字符串的第一個字符是數(shù)字字符,parseInt()也能夠識別出各種整數(shù)格式。
var num1 = parseInt("1234blue"); //1234
var num2 = parseInt(""); //NaN
var num3 = parseInt(0xA); //10
var num4 = parseInt(22.5); //22
var num5 = parseInt("070"); //56
var num6 = parseInt("70"); //70
var num7 = parseInt("0xf"); //15
ECMAScript3和5在解析上存在分歧。
//ECMAScript3認(rèn)為是56,ECMAScript5認(rèn)為是0。
var num = parseInt("070");
為了消除上述的困惑,可以為這個函數(shù)提供第二個參數(shù);轉(zhuǎn)化時使用的基數(shù)。
var num = parseInt("AF", 16);
parseFloat()和parseInt()一樣解析字符串,但是parseFloat()會忽略前導(dǎo)的零。它可以識別所有的浮點數(shù)據(jù)格式,也包括十進(jìn)制的整數(shù)。但十六進(jìn)制格式的字符串則始終會被轉(zhuǎn)化為0。它沒有第二個參數(shù),當(dāng)字符串是一個整數(shù)時,它會返回整數(shù)。
var num1 = parseFloat("1234blue"); //1234整數(shù)
var num1 = parseFloat("0xA"); //0
var num1 = parseFloat("22.5"); //22.5
var num1 = parseFloat("22.34.5"); //22.34
var num1 = parseFloat("0908.5"); //908.5
var num1 = parseFloat("3.125e7"); //31250000
String 類型
String類型由零或多個16位Unicode字符組成。
雙引號和單引號沒有區(qū)別。
字符串長度可以通過length屬性來訪問。
var text = "This is the letter sigma: \u03a3.";
alert(text.length); //輸出28
這個屬性返回的字符數(shù)包括16位字符的數(shù)目。如果字符串中包含雙字節(jié)字符,那么length屬性可能不會精確的返回字符串中的字符數(shù)目。
ECMAScript中的字符串是不可變的,字符串一旦創(chuàng)建,它們的值就不能改變。
要把一個值轉(zhuǎn)化為字符串有兩種方式:
- 使用
toString()方法。
數(shù)值、布爾值、對象和字符串值(字符串的toString()返回字符串的一個副本)都有toString()方法。但null和undefined沒有這個方法。
一般情況下調(diào)用toString()不必傳遞參數(shù),但是在調(diào)用數(shù)值的toString()方法時可以傳遞一個數(shù)值的基數(shù)作為參數(shù)。
var num = 10;
alert(num.toString()); //"10"
alert(num.toString(2)); //"1010"
alert(num.toString(8)); //"12"
alert(num.toString(10)); //"10"
alert(num.toString(16)); //"a"
- 在不知道需要轉(zhuǎn)換的值是不是
null或undefined的情況下,可以使用String()。規(guī)則如下:- 如果值有
toString()方法,則調(diào)用該方法(沒有參數(shù))并返回相應(yīng)的結(jié)果。 - 如果值是
null,則返回null。 - 如果值是
undefined,則返回undefined。
- 如果值有
Object 類型
ECMAScript中的對象其實就是一組數(shù)據(jù)和功能的集合。
var o = new Object();
如果不給構(gòu)造函數(shù)傳遞任何的參數(shù),后面的括號可以省略(但是不推薦)。
Object類型所具有的任何屬性和方法同樣也存在于更具體的對象中。
Object的每個實例都具有下列屬性和方法:
- Constructor:保存著用于創(chuàng)建當(dāng)前對象的函數(shù)。
- hasOwnProperty(propertyName):用于檢查給定的屬性在當(dāng)前對象(而不是實例的原型)中是否存在。參數(shù)必須為字符串。
- isPrototypeOf(object):用于檢查傳入的對象是否是另一個對象的原型。
- propertyIsEnumerable(property):用于檢查給定的屬性是否能夠使用for-in語句。參數(shù)必須為字符串。
- toLocaleString():返回對象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對應(yīng)。
- toString():返回對象的字符串表示。
- valueOf():返回對象的字符串、數(shù)值或布爾值。
操作符
一元操作符###
遞增和遞減
遞增和遞減不僅用于數(shù)值,還可以用于字符串、布爾值、浮點數(shù)和對象。應(yīng)用與不同的值時,規(guī)則如下:
- 包含有效數(shù)字字符的字符串時,先將其轉(zhuǎn)化為數(shù)字值,在執(zhí)行加減1操作。字符串變量變成數(shù)值變量。
- 布爾值false,先將其轉(zhuǎn)化為0再執(zhí)行加減1操作。布爾值變成數(shù)值變量。
- 布爾值true,先將其轉(zhuǎn)化為1再執(zhí)行加減1的操作。布爾值變成數(shù)值變量。
- 浮點數(shù)值,執(zhí)行加減1的操作。
- 對象,先調(diào)用對象的
valueOf()方法以取得一個可供操作的值。然后在對該值應(yīng)用前述的規(guī)則。如果結(jié)果是NaN,則在調(diào)用toString()方法再應(yīng)用前述的規(guī)則。
一元加和減操作符
一元加操作符以一個加號(+)表示,放在數(shù)值前面,對數(shù)值不會產(chǎn)生任何影響:
var num = 25;
num = +num; //仍然是25
一元減操作符主要用于表示負(fù)數(shù)。
一元減操作符應(yīng)用于數(shù)值時,該值會變成負(fù)數(shù)。而當(dāng)應(yīng)用于非數(shù)值時,一元減操作符遵循與一元加操作符相同的規(guī)則,最后將得到的數(shù)值轉(zhuǎn)化為負(fù)數(shù)。
布爾操作符###
布爾操作符一共三個:非(NOT)、與(OR)和或(AND)。
邏輯非
邏輯非操作符由一個感嘆號(!)表示,可以應(yīng)用與ECMAScript中的任何值。無論這個值是什么數(shù)據(jù)類型,這個操作符都會返回一個布爾值。邏輯非操作符首先會將它的操作數(shù)轉(zhuǎn)化為一個布爾值,然后再對其求反。規(guī)則如下:
- 對象,返回false
- 空字符串,返回true
- 非空字符串,返回false
- 數(shù)值0,返回true
- 任意非0數(shù)值(包括Infinity),返回false
- null,返回true
- NaN,返回true
- undefined,返回true
同時使用兩個非操作符,實際上就會模擬Boolean()轉(zhuǎn)型函數(shù)的行為。
邏輯與
邏輯與操作符由兩個和號(&&)表示。
邏輯與可以操作任何類型的數(shù)據(jù),不僅僅是布爾值。在有一個操作數(shù)不是布爾值的情況下,邏輯與操作就不一定返回布爾值;規(guī)則如下:
- 第一個操作數(shù)是對象,則返回第二個操作數(shù)
- 第二個操作數(shù)是對象,則只有在第一個操作數(shù)的求值結(jié)果為true的情況下才會返回該對象
- 兩個操作數(shù)都是對象,則返回第二個操作數(shù)
- 有一個操作數(shù)是null,則返回null
- 有一個操作數(shù)是NaN,則返回NaN
- 有一個操作數(shù)是undefined,則返回undefined
邏輯或
邏輯或操作符由兩個豎線符號(||)表示。
與邏輯與相似,規(guī)則如下:
- 第一個操作數(shù)是對象,則返回第一個操作數(shù)
- 第一個操作數(shù)的求值結(jié)果為false,則返回第二個操作數(shù)
- 兩個操作數(shù)都是對象,則返回第一個操作數(shù)
- 兩個操作數(shù)都是null,則返回null
- 兩個操作數(shù)都是NaN,則返回NaN
- 兩個操作數(shù)都是undefined,則返回undefined
函數(shù)
ECMAScript中的函數(shù)在定義時不必指定是否返回值。
函數(shù)會在執(zhí)行完return語句后停止并退出。
一個函數(shù)可以有多個return。
return語句也可以不帶任何返回值。
嚴(yán)格模式對函數(shù)有一些限制:
- 函數(shù)不能命名為:eval或argument
- 函數(shù)參數(shù)不能命名為:eval或argument
- 不能出現(xiàn)相同的參數(shù)命名
函數(shù)參數(shù)
ECAMScript函數(shù)不介意傳遞進(jìn)來多少個參數(shù),也不在乎參數(shù)的數(shù)據(jù)類型。因為ECMAScript中的參數(shù)在內(nèi)部是用一個數(shù)組來表示的。在函數(shù)體內(nèi)可以通過argument對象來訪問這個數(shù)組。
命名參數(shù)只是提供便利,但不是必須。
其他語言可能要先創(chuàng)建一個函數(shù)簽名,將來調(diào)用必須和簽名一致。但是ECMAScript中解析器不會驗證命名參數(shù)。
argument對象可以和命名參數(shù)一起使用。
沒有重載
ECMAScript不能像傳統(tǒng)意義上那樣實現(xiàn)重載。
如果在ECMAScript中定義了兩個名字相同的函數(shù),則該名字屬于后者。