Javascript簡介
Javascript實現(xiàn)
雖然Javascript和ECMAscript通常都被人們用來表達相同的含義,但是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)還可以進行下列擴展。
- 添加ECMA-262沒有描述的“更多類型励堡、值谷丸、對象、屬性和函數(shù)”
- 支持ECMA-262沒有定義的“程序和正則表達式語法”
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級則進一步擴展了DOM侨糟,引入了以統(tǒng)一方式加載和保存文檔的方法---在DOM加載保存(DOM Load and Save)模塊中定義;新增了驗證文檔的方法---在DOM驗證(DOM Validation)模塊中定義瘩燥。DOM3級也對DOM核心進行了擴展秕重,開始支持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行解析。
標(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ī)則進行了一些修改玄帕。關(guān)鍵字和保留字雖然仍然不能作為標(biāo)識符使用部脚,但現(xiàn)在可以用作對象的屬性名。
ECMAScript5在嚴(yán)格模式下裤纹,還不能把eval
和arguments
作為標(biāo)識符或?qū)傩悦酰駝t拋出錯誤丧没。
變量
使用操作符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及之前版本在對正則表達式調(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ù)。
除了十進制外祟霍,整數(shù)還可以通過八進制或十六進制來表示杏头。
八進制的字面量在嚴(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ù),但在進行算術(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_VALUE
ECMAScript中能夠表示的最大值焊夸。
如果某次計算的結(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)化為十進制數(shù)值锋八。
- 如果字符串中包含有效的浮點格式浙于,則將其轉(zhuǎn)化為對應(yīng)的浮點數(shù)值。
- 如果字符串中包含有效的十六進制格式挟纱,則將其轉(zhuǎ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ù)格式擎值,也包括十進制的整數(shù)慌烧。但十六進制格式的字符串則始終會被轉(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ù)不介意傳遞進來多少個參數(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ù),則該名字屬于后者埂软。