摘要:年,以為藍(lán)本的建議被提交給了歐洲計(jì)算機(jī)制造商協(xié)會(huì),。而且給未經(jīng)聲明的變量賦值在嚴(yán)格模式下會(huì)導(dǎo)致拋出的錯(cuò)誤。這也正是使用操作符檢測(cè)值時(shí)會(huì)返回的原因。函數(shù)檢查過(guò)程是。但是這個(gè)轉(zhuǎn)換過(guò)程會(huì)導(dǎo)致特殊的和值應(yīng)用位操作時(shí),這兩個(gè)值會(huì)被當(dāng)成來(lái)處理。
前言
本文是 Awesome JavaScript 系列文章的第一篇,本系列文章主要為 JavaScript 的一些常見知識(shí)點(diǎn),是我在 JavaScript 學(xué)習(xí)過(guò)程中的一些筆記。
JavaScript 誕生于 1995 年,和博主同年哈哈。當(dāng)時(shí),它的主要目的是處理以前由服務(wù)器端語(yǔ)言(如 Perl)負(fù)責(zé)的一些輸入驗(yàn)證操作。JavaScript 從一個(gè)簡(jiǎn)單的輸入驗(yàn)證器發(fā)展為一門強(qiáng)大的編程語(yǔ)言,完全出乎人們的預(yù)料。應(yīng)該說(shuō),它既是一門非常簡(jiǎn)單的語(yǔ)言,又是一門非常復(fù)雜的語(yǔ)言。
1997 年,以 JavaScript 1.1 為藍(lán)本的建議被提交給了歐洲計(jì)算機(jī)制造商協(xié)會(huì)(ECMA,European Computer Manufacturers Association)。不久后,該協(xié)會(huì)定義了一種名為 ECMAScript 的新腳本語(yǔ)言的標(biāo)準(zhǔn),即 ECMA-262。
1998 年,ISO/IEC(International Organization for Standardization and International Electrotechnical Commission,國(guó)標(biāo)標(biāo)準(zhǔn)化組織和國(guó)際電工委員會(huì))也采用了 ECMAScript 作為標(biāo)準(zhǔn)(即 ISO/IEC-16262)。自此以后,瀏覽器開發(fā)商就開始致力于將 ECMAScript 作為各自 JavaScript 實(shí)現(xiàn)的基礎(chǔ),也在不同程度上取得了成功。
到現(xiàn)在呢,我們可以說(shuō) JavaScript 是一門專為與網(wǎng)頁(yè)交互而設(shè)計(jì)的腳本語(yǔ)言,他其實(shí)由以下三部分組成:
ECMAScript,由 ECMA-262 定義,提供核心語(yǔ)言功能。
文檔對(duì)象模型(DOM,Document Object Model),針對(duì) XML 但經(jīng)過(guò)擴(kuò)展用于 HTML 的應(yīng)用程序編程接口(API,Application Programming Interface)。提供訪問和操作網(wǎng)頁(yè)內(nèi)容的方法和接口。
瀏覽器對(duì)象模型(BOM,Browser Object Model),提供與瀏覽器交互的方法和接口。
傳統(tǒng)的做法是將所有的 元素都放到頁(yè)面的 元素中。這樣做的目的是將所有的外部文件(包括 CSS 文件和 JavaScript 文件)的引用都放在相同的地方。但是這樣就意味著必須等到全部 JavaScript 代碼都被下載、解析和執(zhí)行完成后,才能開始呈現(xiàn)頁(yè)面的內(nèi)容(瀏覽器在遇到 標(biāo)簽時(shí)才開始呈現(xiàn)內(nèi)容)。這種情況下的用戶體驗(yàn)就非常的不好。
其實(shí)我們可以將所有的 元素都放到頁(yè)面的 元素中頁(yè)面內(nèi)容的后面,即 前。這樣在解析包含 JavaScript 代碼之前,頁(yè)面的內(nèi)容將完全呈現(xiàn)在瀏覽器中。而用戶也會(huì)因?yàn)闉g覽器窗口顯示空白頁(yè)面的時(shí)間縮短而感到打開頁(yè)面的速度加快了。
noscript 元素早期瀏覽器都面臨一個(gè)特殊的問題,即當(dāng)瀏覽器不支持 JavaScript 時(shí)如何讓頁(yè)面平穩(wěn)退化。對(duì)這個(gè)問題的最終解決方案就是創(chuàng)造一個(gè) 元素,用以在不支持 JavaScript 的瀏覽器中顯示替代的內(nèi)容。這個(gè)元素可以包含能夠出現(xiàn)在文檔 中的任何 HTML 元素( 除外)。包含在 元素中的內(nèi)容只有在瀏覽器不支持腳本或?yàn)g覽器支持腳本但是腳本被禁用的情況下才會(huì)顯示出來(lái)。
Example HTML Page
所謂標(biāo)識(shí)符就是指變量、函數(shù)、屬性的名字,或者函數(shù)的參數(shù)。標(biāo)識(shí)符可以是按照下列格式規(guī)則組合起來(lái)的一或多個(gè)字符:
第一個(gè)字符必須是一個(gè)字母、下劃線 _ 或一個(gè)美元符號(hào) $;
其他字符可以是字母、下劃線、美元符號(hào)或數(shù)字;
標(biāo)識(shí)符中的字母可以包含擴(kuò)展的 ASCII 或 Unicode 字母字符,但不推薦這樣做。
注釋注釋推薦像下面這樣寫:
// 單行注釋 /* * 這是一個(gè)多行 * (塊級(jí))注釋 */嚴(yán)格模式
ECMAScript 5 引入了嚴(yán)格模式的概念,嚴(yán)格模式是為 JavaScript 定義了一種不同的解析與操作模型。嚴(yán)格模式啟用方法如下:
function doSomething() { "use strict"; //函數(shù)體 }
"use strict"; 這行代碼其實(shí)是一個(gè)編譯指示(pragma),用于高速支持的 JavaScript 引擎切換到嚴(yán)格模式。
變量用 var 操作符定義的變量將成為定義該變量的作用域中的局部變量。也就是說(shuō),如果在函數(shù)中使用 var 定義一個(gè)變量,那么這個(gè)變量在函數(shù)退出后就會(huì)被銷毀。
function test() { var message = "hi"; //局部變量 } test(); alert(message); //錯(cuò)誤!
function test() { message = "hi"; //全局變量 } test(); alert(message); //"hi"
不推薦濫用全局變量,因?yàn)樵诰植孔饔糜蛑卸x的全局變量很難維護(hù)。而且給未經(jīng)聲明的變量賦值在嚴(yán)格模式下會(huì)導(dǎo)致拋出 ReferenceError 的錯(cuò)誤。
可以使用一條語(yǔ)句定義多個(gè)變量,只要把每個(gè)變量(初始化與否均可)用逗號(hào)分隔開即可:
var message = "hi", found = false, age = 29;
因?yàn)?ECMAScript 是松散類型的,因而使用不同類型初始化變量的操作可以放在一條語(yǔ)句中完成。
注意,在嚴(yán)格模式下不能定義名為 eval 或 arguments 的變量,否則會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。
數(shù)據(jù)類型ECMAScript 中有五種簡(jiǎn)單數(shù)據(jù)類型(基本數(shù)據(jù)類型):Undefined、Null、Boolean、Number 和 String。還有一種復(fù)雜數(shù)據(jù)類型 -- Object,在本質(zhì)上,Object 是一組無(wú)序的明值對(duì)組成的。乍一看這幾種數(shù)據(jù)類型不足以表示所有數(shù)據(jù),但是 ECMAScript 數(shù)據(jù)類型具有動(dòng)態(tài)性,所以沒有必要再定義其他類型的數(shù)據(jù)了。
typeof 操作符返回值 | 含義 |
---|---|
"undefined" | 這個(gè)值未定義 |
"boolean" | 這個(gè)值是布爾值 |
"string" | 這個(gè)值是字符串 |
"number" | 這個(gè)值是數(shù)值 |
"object" | 這個(gè)值是對(duì)象或 null |
"function" | 這個(gè)值是函數(shù) |
var message = "some string"; alert(typeof message); //"string" alert(typeof (message)); //"string" alert(typeof 95); //"number"
上面幾個(gè)例子說(shuō)明,typeof 操作符的操作數(shù)可以是變量(message),也可以是數(shù)值字面量。注 -- typeof 是一個(gè)操作符。
在 JavaScript 中,null 是一個(gè) object,即 typeof null; 返回 object。這是設(shè)計(jì)的缺陷,在最初,使用標(biāo)記位來(lái)區(qū)分對(duì)象類型和原始類型,對(duì)象型用 0 標(biāo)識(shí),原始型用 1 標(biāo)識(shí)。導(dǎo)致了全零的 null 被識(shí)別為 object。null 被認(rèn)為是一個(gè)空的對(duì)象引用,也就是一個(gè)空的對(duì)象指針。這也正是使用 typeof 操作符檢測(cè) null 值時(shí)會(huì)返回 object 的原因。
在技術(shù)上講,函數(shù)在 ECMAScript 中是對(duì)象,不是一種數(shù)據(jù)類型。然而函數(shù)確實(shí)也有一些特殊的屬性,因此通過(guò) typeof 操作符來(lái)區(qū)分函數(shù)和其他對(duì)象是有必要的。
Undefined 類型在 JavaScript 中,包含 undefined 值的變量與尚未定義的變量還是不一樣的。
var message; // alert(message); // alert(age);
var message; alert(typeof message); //"undefined" alert(typeof age); //"undefined"
即便未初始化的變量會(huì)自動(dòng)被賦予 undefined 值,但顯示的初始化變量依然是明智的選擇。如果做到這一點(diǎn),那么當(dāng) typeof 操作符返回 undefined 值時(shí),我們就知道被檢測(cè)的變量是沒有被聲明還是尚未初始化。
對(duì)于未聲明的變量,只能執(zhí)行一項(xiàng)操作即用 typeof 操作符檢測(cè)其數(shù)據(jù)類型(未聲明的變量調(diào)用 delet 不會(huì)報(bào)錯(cuò),但沒意義,而且在嚴(yán)格模式下也會(huì)報(bào)錯(cuò))。
未初始化和未聲明的變量的區(qū)別就是,在用 typeof 操作符檢測(cè)其數(shù)據(jù)類型時(shí)都顯示 undefined,但是在除此之外調(diào)用未聲明的變量時(shí)就會(huì)報(bào)錯(cuò)。
因?yàn)樵?JavaScript 中未定義和未聲明的變量用 typeof 操作符檢測(cè)其數(shù)據(jù)類型時(shí)都顯示 undefined,所以 DOM 相關(guān)函數(shù)都是返回 null,從 API 設(shè)計(jì)角度來(lái)講是合理的。
無(wú)論什么情況下,都沒有必要將一個(gè)變量的值顯示的設(shè)置為 undefined。
Null 類型如果定義的變量準(zhǔn)備在將來(lái)保存對(duì)象,那么最好將該變量初始化為 null 而不是其他值。這樣只要檢查 null 值就可以知道相應(yīng)的變量是否已經(jīng)保存了一個(gè)對(duì)象的引用,如下所示:
if(car != null) { //對(duì) car 對(duì)象執(zhí)行某些操作 }
所以只要意在保存對(duì)象的變量還沒有真正保存對(duì)象,就應(yīng)該明確地讓該變量保存 null 值。
實(shí)際上,undefined 值是派生自 null 值的,因此 ECMA-262 規(guī)定對(duì)他們的相等性測(cè)試要返回 true:
alert(null == undefined); //trueNumber 類型
因?yàn)楸4娓↑c(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍,所以 ECMAScript 會(huì)不失時(shí)機(jī)的將浮點(diǎn)數(shù)值轉(zhuǎn)換為整數(shù)值。
ECMAScript 能夠表示的數(shù)的范圍為 Number.MIN_VALUE ~ Number.MAX_VALUE,在大多數(shù)瀏覽器中為 5e-324 ~ 1.7976931348623157e+308。當(dāng)程序執(zhí)行時(shí),數(shù)值超過(guò)正負(fù)范圍時(shí)會(huì)被分別轉(zhuǎn)化為 Infinity 和 -Infinity。想確定一個(gè)數(shù)是否超出 JavaScript 數(shù)值范圍,可以用 isInfinite() 函數(shù)。
var result = Number.MIN_VALUE + Number.MIN_VALUE; alert(isFinite(result)); //false
NaN 即非數(shù)值(Not a Number)是一個(gè)特殊值。用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(這樣就不會(huì)拋出錯(cuò)誤了)。其有兩個(gè)特點(diǎn),首先任何涉及 NaN 操作都會(huì)返回 NaN,這一點(diǎn)在多步計(jì)算中可能會(huì)導(dǎo)致問題。其次, NaN 與任何值都不相等,包括其本身。ECMAScript 也定義了 isNaN(); 函數(shù)。這個(gè)函數(shù)接收一個(gè)參數(shù),這個(gè)參數(shù)可以是任何類型的,而函數(shù)會(huì)幫我們確定這個(gè)參數(shù)是否 不是數(shù)值。函數(shù)檢查過(guò)程是 `isNaN(); => valueOf(); => toString();。
有三個(gè)可以把非數(shù)值轉(zhuǎn)化為數(shù)值的函數(shù):Number(),parseInt(),parseFloat()。在使用 parseInt() 轉(zhuǎn)換數(shù)據(jù)類型時(shí),為了避免錯(cuò)誤解析,建議無(wú)論何時(shí)都要明確指定基數(shù)。多數(shù)情況下我們要解析的都是是進(jìn)制數(shù),因此始終將 10 作為第二個(gè)參數(shù)是十分必要的。
var num1 = Number("Hello world!"); //NaN var num2 = Number(""); //0 var num3 = Number("000011"); //11 var num4 = Number(true); //1 alert(num1); alert(num2); alert(num3); alert(num4);
var num1 = praseInt("10", 2); //2 (按二進(jìn)制解析) var num1 = praseInt("10", 8); //8 (按八進(jìn)制解析) var num1 = praseInt("10", 10); //10 (按十進(jìn)制解析) var num1 = praseInt("10", 16); //16 (按十六進(jìn)制解析)
parseFloat() 只解析十進(jìn)制值,所以其沒有第二個(gè)參數(shù)。
var num1 = parseFloat("1234blue"); //1234 - integer var num2 = parseFloat("0xA"); //0 var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat("22.34.5"); //22.34 var num5 = parseFloat("0908.5"); //908.5 var num6 = parseFloat("3.125e7"); //31250000 alert(num1); alert(num2); alert(num3); alert(num4); alert(num5); alert(num6);String 類型
字符串由雙引號(hào)或單引號(hào)表示都可以,在 ECMAScript 中的這兩種語(yǔ)言形式?jīng)]有什么區(qū)別。
任何字符串的長(zhǎng)度都可以通過(guò)訪問其 length 屬性取得,如果字符串中包含雙字節(jié)字符,那么 length 屬性可能不會(huì)精確的返回字符串中的字符數(shù)目。
var text = "This is the letter sigma: u030a."; alert(text.length); //輸出 28
ECMAScript 中的字符串是不可變的,如果要改變某個(gè)變量保存的字符串,首先要銷毀原來(lái)的字符串,然后再用另一個(gè)包含新值的字符串填充該變量,這個(gè)過(guò)程是在后臺(tái)完成的,這也就是某些舊版本瀏覽器在拼接字符串的時(shí)候速度很慢的原因了。
要把一個(gè)值轉(zhuǎn)換為字符串有兩種方法,第一種是 toString() 方法。數(shù)值、布爾值、對(duì)象和字符串值都有相應(yīng)的 toString() 方法,但是 null 和 undefined 值沒有。一般調(diào)用 toString() 方法時(shí)不用傳遞參數(shù),但是他也可以傳遞參數(shù)。
var age = 11; var ageAsString = age.toString(); //the string "11" var found = true; var foundAsString = found.toString(); //the string "true" alert(ageAsString); alert(typeof ageAsString); alert(foundAsString); alert(typeof foundAsString);
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 的情況下可以使用第二種方法:轉(zhuǎn)型函數(shù) String()。使用這種方法時(shí),如果值有 toString() 方法則會(huì)調(diào)用該方法,沒有的話就按本方法規(guī)則執(zhí)行。
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"Object 類型
ECMAScript 中的對(duì)象其實(shí)就是一組數(shù)據(jù)和功能的集合。
var o = new Object();
在 ECMAScript 中,當(dāng)對(duì)數(shù)值應(yīng)用位操作符時(shí),后臺(tái)發(fā)生如下的轉(zhuǎn)換過(guò)程:64 位的數(shù)值被轉(zhuǎn)換為 32 位數(shù)值,然后執(zhí)行位操作,最后再將 32 位的結(jié)果轉(zhuǎn)換回 64 位數(shù)值。但是這個(gè)轉(zhuǎn)換過(guò)程會(huì)導(dǎo)致特殊的 NaN 和 Infinity 值應(yīng)用位操作時(shí),這兩個(gè)值會(huì)被當(dāng)成 0 來(lái)處理。對(duì)非數(shù)值可以先使用 Number() 函數(shù)將該值轉(zhuǎn)換為一個(gè)數(shù)值,然后再應(yīng)用位操作。
var num1 = 25; //binary 00000000000000000000000000011001 var num2 = ~num1; //binary 11111111111111111111111111100110 alert(num2); //-26
按位非操作的本質(zhì)就是操作數(shù)的負(fù)值減一。
左移操作:左移操作符為 <<,左移不會(huì)影響操作數(shù)的符號(hào)位。
var oldValue = 2; //equal to binary 10 var newValue = oldValue << 5; //equal to binary 1000000 which is decimal 64 alert(newValue); //64
右移操作分為有符號(hào) >> 和無(wú)符號(hào) >>> 兩種。對(duì)于正數(shù)來(lái)說(shuō),這兩種方法的結(jié)果一樣。但對(duì)于負(fù)數(shù)來(lái)說(shuō),無(wú)符號(hào)右移是以 0 填充空位,而不是像有符號(hào)右移那樣以符號(hào)位的值來(lái)填充空位。
var oldValue = -64; //equal to binary 11111111111111111111111111000000 var newValue = oldValue >>> 5; //equal to decimal 134217726 alert(newValue); //134217726
我們可以利用邏輯或的行為特性來(lái)避免為變量賦 null 或 undefined 值。例如:
var myObject = preferredObject || backupObject;
上面這段代碼,如果 preferredObject 的值不是 null,那么它的值將被賦給 myObject;如果是 null,則將 backupObject 的值賦給 myObject。ECMAScript 程序的賦值語(yǔ)句常用這種模式。
加性操作符有以下特性:+0 加 +0 結(jié)果為 +0;-0 加 -0 結(jié)果為 -0;+0 加 -0 結(jié)果為 +0。如果兩個(gè)操作數(shù)都是字符串,則將第二個(gè)操作數(shù)與第一個(gè)操作數(shù)拼接起來(lái)。如果只有一個(gè)操作數(shù)是字符串,則將另一個(gè)操作數(shù)轉(zhuǎn)換為字符串,然后再將兩個(gè)字符串拼接起來(lái)。
var result1 = 5 + 5; //two numbers alert(result1); //10 var result2 = 5 + "5"; //a number and a string alert(result2); //"55"
var num1 = 5; var num2 = 10; var message = "The sum of 5 and 10 is " + num1 + num2; alert(message); //"The sum of 5 and 10 is 510"
var num1 = 5; var num2 = 10; var message = "The sum of 5 and 10 is " + (num1 + num2); alert(message); //"The sum of 5 and 10 is 15"
減性操作符有以下特性:+0 減 +0 結(jié)果為 +0;-0 減 +0 結(jié)果為 -0;-0 減 +0 結(jié)果為 +0。
var result1 = 5 - true; //4 because true is converted to 1 var result2 = NaN - 1; //NaN var result3 = 5 - 3; //2 var result4 = 5 - ""; //5 because "" is converted to 0 var result5 = 5 - "2"; //3 because "2" is converted to 2 var result6 = 5 - null; //5 because null is converted to 0
相等操作符有相等 == 和不相等 !=、全等 === 和不全等 !== 兩種。前者先轉(zhuǎn)換再比較,后者僅比較不轉(zhuǎn)換。除此之外無(wú)區(qū)別。轉(zhuǎn)換指轉(zhuǎn)換成數(shù)值。
var result1 = ("55" == 55); //true ?equal because of conversion var result2 = ("55" === 55); //false ?not equal because different data types var result3 = ("55" != 55); //false ?equal because of conversion var result4 = ("55" !== 55); //true ?not equal because different data types alert(null == undefined); //true alert(null === undefined); //false alert("NaN" == NaN); //false alert("NaN" === NaN); //false alert(NaN == NaN); //false alert(NaN === NaN); //false alert(NaN != NaN); //true alert(NaN !== NaN); //true alert(false == 0); //true alert(false === 0); //false alert(true == 1); //true alert(true === 1); //false alert(null == 0); //false alert(undefined == 0); //false alert(5 == "5"); //true alert(5 === "5"); //false
注意:null == undefined 會(huì)返回 true,而 null === undefined 會(huì)返回 false,因?yàn)樗麄兪遣煌愋偷闹怠S捎谙嗟群筒幌嗟炔僮鞣嬖陬愋娃D(zhuǎn)換問題,而為了保持代碼中數(shù)據(jù)類型的完整性,我們推薦使用全等和不全等操作符。
條件操作符:
var max = (num1 > num2) ? num1 : num2;
有 if 語(yǔ)句、do-while 語(yǔ)句、while 語(yǔ)句、for 語(yǔ)句、for-in 語(yǔ)句、lable 語(yǔ)句、break 和 continue 語(yǔ)句、with 語(yǔ)句、switch 語(yǔ)句。
因?yàn)?ECMAScript 中不存在塊級(jí)作用域,因此在循環(huán)內(nèi)部定義的變量也可以在外部訪問到。例如:
var count = 10; for (var i=0; i < count; i++){ alert(i); } alert(i); //10
for-in語(yǔ)句是一種精準(zhǔn)的迭代語(yǔ)句,可以用來(lái)枚舉對(duì)象屬性。用法是:
for (property in wxpression) statement
下面是一個(gè)示例:這個(gè)例子循環(huán)顯示 BOM 中 window 對(duì)象的所有屬性。
for (var propName in window) { document.wright(propName); }
如果要迭代的對(duì)象的變量值為 null 或 undefined,for-in 語(yǔ)句會(huì)拋出錯(cuò)誤。ECMAScript 5 已經(jīng)更正了這一行為,對(duì)這種情況不再拋出錯(cuò)誤,而只是不執(zhí)行循環(huán)體。為了保證最大限度兼容性,建議在使用 for-in 循環(huán)之前先檢查確認(rèn)該對(duì)象的值不是 null 或 undefined。
lable 語(yǔ)句可以在代碼中添加標(biāo)簽,以便將來(lái)使用。語(yǔ)法為:
lable: statement;
代碼示例:這個(gè)例子中定義的 start 標(biāo)簽可以在將來(lái)由 break 或 continue 語(yǔ)句引用。加標(biāo)簽的語(yǔ)句一般都要與 for 語(yǔ)句等循環(huán)語(yǔ)句配合使用。
start: for (var - = 0; i < count; i++) { }
下面這段代碼使得 break 語(yǔ)句不僅會(huì)退出內(nèi)部的 for 語(yǔ)句,而且也會(huì)退出外部的 for 語(yǔ)句。
var num = 0; outermost: for (var i=0; i < 10; i++) { for (var j=0; j < 10; j++) { if (i == 5 && j == 5) { break outermost; } num++; } } alert(num); //55
var num = 0; outermost: for (var i=0; i < 10; i++) { for (var j=0; j < 10; j++) { if (i == 5 && j == 5) { continue outermost; } num++; } } alert(num); //95
with 語(yǔ)句的作用是將代碼的作用域設(shè)置到一個(gè)特定的對(duì)象中,語(yǔ)法如下:
with (expression) statement;
定義 with 語(yǔ)句的目的是簡(jiǎn)化多次編寫同一個(gè)對(duì)象的工作,如下面的例子所示:
var qs = location.search.substring(1); var hostName = location.hostname; var url = location.href;
用 with 語(yǔ)句寫的話就可以簡(jiǎn)化成下面這樣:
with (location) { var qs = search.substring(1); var hostName = hostname; var url = href; }
注意:嚴(yán)格模式下不允許使用 with 語(yǔ)句,否則將視為語(yǔ)法錯(cuò)誤。同時(shí),大量使用這種語(yǔ)句會(huì)導(dǎo)致性能下降,同時(shí)也會(huì)給調(diào)試代碼造成困難,因此在開發(fā)大型應(yīng)用程序時(shí)不建議使用 with 語(yǔ)句。
switch 語(yǔ)句,雖然 ECMAScript 的 switch 語(yǔ)句是借鑒其他語(yǔ)言的,但是也有其特色。可以在 ECMAScript 的 switch 語(yǔ)句中使用任何數(shù)據(jù)類型。其次,每一個(gè) case 的值不一定是常量,可以是變量,也可以是表達(dá)式。
switch ("hello world") { case "hello" + " world": alert("Greeting was found."); break; case "goodbye": alert("Closing was found."); break; default: alert("Unexpected message was found."); }
var num = 25; switch (true) { case num < 0: alert("Less than 0."); break; case num >= 0 && num <= 10: alert("Between 0 and 10."); break; case num > 10 && num <= 20: alert("Between 10 and 20."); break; default: alert("More than 20."); }
對(duì)于函數(shù)的返回值,推薦的做法是要么讓函數(shù)始終都返回一個(gè)值,要么永遠(yuǎn)都不要返回值,否則,如果函數(shù)有時(shí)候返回值,有時(shí)候不返回值,會(huì)給調(diào)試代碼帶來(lái)不便。
ECMAScript 不介意你傳遞的參數(shù)個(gè)數(shù)和參數(shù)的數(shù)據(jù)類型,因?yàn)?ECMAScript 中的參數(shù)只在內(nèi)部是一個(gè)數(shù)組來(lái)表示的。實(shí)際上在函數(shù)體內(nèi)可以通過(guò) arguments 對(duì)象來(lái)訪問這個(gè)參數(shù)數(shù)組,從而獲得傳遞給函數(shù)的每一個(gè)參數(shù)。arguments 對(duì)象只是與數(shù)組類似但并不是 Array 的實(shí)例。
沒有傳遞值的命名參數(shù)將自動(dòng)被賦予 undefined 值,這就和定義變量但為初始化類似。
在 ECMAScript 中,定義了兩個(gè)名字相同的函數(shù),則該名字只屬于后定義的函數(shù)。
歡迎大家在評(píng)論區(qū)留下你的想法和感受!
歡迎大家關(guān)注知乎專欄:全棧成長(zhǎng)之路
文章保質(zhì)保量 (づ ̄3 ̄)づ╭?~
也歡迎大家加入學(xué)習(xí)交流QQ群:637481811
本文首發(fā)于我的 個(gè)人網(wǎng)站 LeviDing ,更多內(nèi)容歡迎關(guān)注我的個(gè)人網(wǎng)站。
歡迎掃描上方二維碼關(guān)注 公眾號(hào): LeviDing 訂閱實(shí)時(shí)動(dòng)態(tài)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83754.html
摘要:年,以為藍(lán)本的建議被提交給了歐洲計(jì)算機(jī)制造商協(xié)會(huì),。而且給未經(jīng)聲明的變量賦值在嚴(yán)格模式下會(huì)導(dǎo)致拋出的錯(cuò)誤。這也正是使用操作符檢測(cè)值時(shí)會(huì)返回的原因。函數(shù)檢查過(guò)程是。但是這個(gè)轉(zhuǎn)換過(guò)程會(huì)導(dǎo)致特殊的和值應(yīng)用位操作時(shí),這兩個(gè)值會(huì)被當(dāng)成來(lái)處理。 前言 本文是 Awesome JavaScript 系列文章的第一篇,本系列文章主要為 JavaScript 的一些常見知識(shí)點(diǎn),是我在 JavaScrip...
摘要:年,以為藍(lán)本的建議被提交給了歐洲計(jì)算機(jī)制造商協(xié)會(huì),。而且給未經(jīng)聲明的變量賦值在嚴(yán)格模式下會(huì)導(dǎo)致拋出的錯(cuò)誤。這也正是使用操作符檢測(cè)值時(shí)會(huì)返回的原因。函數(shù)檢查過(guò)程是。但是這個(gè)轉(zhuǎn)換過(guò)程會(huì)導(dǎo)致特殊的和值應(yīng)用位操作時(shí),這兩個(gè)值會(huì)被當(dāng)成來(lái)處理。 前言 本文是 Awesome JavaScript 系列文章的第一篇,本系列文章主要為 JavaScript 的一些常見知識(shí)點(diǎn),是我在 JavaScrip...
摘要:與此同時(shí)云犀利用強(qiáng)大的內(nèi)容分發(fā)技術(shù)實(shí)現(xiàn)同一場(chǎng)活動(dòng)多平臺(tái)同步直播在微博微信今日頭條等新媒體平臺(tái)引發(fā)廣泛的話題討論。而云犀的智能字幕實(shí)時(shí)剪輯等技術(shù)也讓錯(cuò)過(guò)峰會(huì)直播的網(wǎng)民通過(guò)短視頻觀看精彩回放實(shí)現(xiàn)了峰會(huì)活動(dòng)宣傳的二次傳播。2018年3月8日,在全球矚目的中國(guó)家電及消費(fèi)電子博覽會(huì)(AWE2018)上,云犀與AWE深度合作,為本次峰會(huì)提供拍攝、直播、視頻制作等服務(wù);云拍攝團(tuán)隊(duì)派出15位專業(yè)簽約攝影攝像...
摘要:最近要做拖拽相關(guān)的功能,本來(lái)想自己寫,忽然想起來(lái)之前在輪子工廠有更新過(guò),還是很好用滴。介紹一款可任意拖動(dòng)排序的插件。支持桌面和移動(dòng)端,拖拽過(guò)渡動(dòng)畫美觀。 最近要做拖拽相關(guān)的功能,本來(lái)想自己寫,忽然想起來(lái)之前在輪子工廠有更新過(guò),vue-dragging還是很好用滴。 介紹 vue-dragging -- 一款可任意拖動(dòng)排序的vue插件。支持桌面和移動(dòng)端,拖拽過(guò)渡動(dòng)畫美觀。支持vue1和v...
閱讀 663·2021-11-15 11:39
閱讀 2901·2021-10-08 10:04
閱讀 3264·2019-08-30 10:57
閱讀 3024·2019-08-26 13:25
閱讀 1907·2019-08-26 12:14
閱讀 2636·2019-08-23 15:27
閱讀 2996·2019-08-23 15:18
閱讀 1777·2019-08-23 14:26