JavaScript 基礎(chǔ)知識

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的支持

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的支持

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ā)商。

JavaScript版本號

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文件。

無論如何包含代碼崭孤,只要不存在deferasync屬性类嗤,瀏覽器都會按照<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)格模式下裤纹,還不能把evalarguments作為標(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_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)化為十進制數(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()方法。但nullundefined沒有這個方法睁壁。
    一般情況下調(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)換的值是不是nullundefined的情況下潘明,可以使用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ù),則該名字屬于后者埂软。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锈遥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌所灸,老刑警劉巖丽惶,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爬立,居然都是意外死亡钾唬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門懦尝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來知纷,“玉大人,你說我怎么就攤上這事陵霉。” “怎么了伍绳?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵踊挠,是天一觀的道長。 經(jīng)常有香客問我冲杀,道長效床,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任权谁,我火速辦了婚禮剩檀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旺芽。我一直安慰自己沪猴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布采章。 她就那樣靜靜地躺著运嗜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悯舟。 梳的紋絲不亂的頭發(fā)上担租,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音抵怎,去河邊找鬼奋救。 笑死,一個胖子當(dāng)著我的面吹牛反惕,可吹牛的內(nèi)容都是我干的尝艘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼承璃,長吁一口氣:“原來是場噩夢啊……” “哼利耍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤隘梨,失蹤者是張志新(化名)和其女友劉穎程癌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轴猎,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡嵌莉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捻脖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锐峭。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖可婶,靈堂內(nèi)的尸體忽然破棺而出沿癞,到底是詐尸還是另有隱情,我是刑警寧澤矛渴,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布椎扬,位于F島的核電站,受9級特大地震影響具温,放射性物質(zhì)發(fā)生泄漏蚕涤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一铣猩、第九天 我趴在偏房一處隱蔽的房頂上張望揖铜。 院中可真熱鬧,春花似錦达皿、人聲如沸天吓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽失仁。三九已至,卻和暖如春们何,著一層夾襖步出監(jiān)牢的瞬間萄焦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工冤竹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拂封,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓鹦蠕,卻偏偏與公主長得像冒签,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钟病,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 第1章 JavaScript 簡介 JavaScript 具備與瀏覽器窗口及其內(nèi)容等幾乎所有方面交互的能力萧恕。 歐洲...
    力氣強閱讀 1,129評論 0 0
  • 注:本文所有知識點總結(jié)或摘抄自廖雪峰javascript教程刚梭,點擊查看更詳細(xì)的講解。 1.javascript簡介...
    hanyuntao閱讀 524評論 0 13
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評論 0 4
  • 一個人在如意的時候票唆,任何事情都是理所當(dāng)然朴读、錦上添花;一個人失意的時候走趋,無論什么都是不可逾越衅金、黯然失色。時光荏苒簿煌,步...
    長著兔耳朵的花溪閱讀 251評論 0 0
  • 1氮唯、我們總是忍不住與別人做比較,從小與別人家的孩子姨伟,慢慢長大到別人的男朋友惩琉,別人的老婆……每一種生活有其獨特的風(fēng)采...
    文硯閱讀 139評論 0 0