JavaScript 基礎(chǔ)知識

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

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

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(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)格模式下,還不能把evalarguments作為標(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()方法。但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ù)不介意傳遞進(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ù),則該名字屬于后者。

最后編輯于
?著作權(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)容

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

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