摘要:十進(jìn)制八進(jìn)制八進(jìn)制字面值的第一位必須是零,然后是數(shù)字序列。通常與方法的返回值相同由于在中是所有對象的基礎(chǔ),因此所有對象都具有這些基本的屬性和方法。
1 語法 1.1 區(qū)分大小寫
ECMAScript中的一切(變量、函數(shù)名和操作符)都區(qū)分大小寫。
1.2 嚴(yán)格模式ECMAScript 5 引入了嚴(yán)格模式(strict mode)的概念。嚴(yán)格模式是為JavaScript定義了一種不同的解析與執(zhí)行模型。
在嚴(yán)格模式下,ECMAScript 3 中的一些不確定的行為將得到處理,而且對某些不安全的操作也會拋出錯誤。
要在整個腳本中啟用嚴(yán)格模式,可以再頂部添加如下代碼:
"use strict"
指定函數(shù)在嚴(yán)格模式下執(zhí)行:
function doSomething(){ "use strict"; //函數(shù)體 }2 關(guān)鍵字和保留字
關(guān)鍵字
break、do、instanceof、typeof、case、else、new、var、catch、finally、return、void、continue、for、switch、while、debugger、function、this、with、default、if、throw、delete、in、try
保留字
ECMA-262 第五版非嚴(yán)格模式:class、enum、extends、super、const、export、import
ECMA-262 第五版嚴(yán)格模式增加以下限制:implements、package、public、interface、private、static、let、protected、yield
3 變量ECMAScript的變量是松散類型的,所謂松散類型就是可以用來保存任何類型的數(shù)據(jù)。換句話說,每個變量僅僅是一個用于保存值得占位符而已。
var message;
像這樣未經(jīng)過初始化的變量,會保存一個特殊的值——undefined
4 數(shù)據(jù)類型給未經(jīng)聲明的變量賦值在嚴(yán)格模式下會導(dǎo)致拋出PeferenceError錯誤
ES 5
5種簡單數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型):Undefined、Null、Boolean、Number、String
1種復(fù)雜數(shù)據(jù)類型——Object,Object本質(zhì)上是由一組無序的名值對組成的。
4.1 typeof 操作符ES 6 新增一種數(shù)據(jù)類型——符號對象(Symbol)
typeof 用來檢測給定變量的數(shù)據(jù)類型
4.2 Undefined 類型"undefined"——如果這個值未定義
"boolean"——如果這個值是布爾值
"string"——如果這個值是字符串
"number"——如果這個值是數(shù)值
"object"——如果這個值是對象或null
"function"——如果這個值是函數(shù)調(diào)用typeof null會返回"object",因?yàn)樘厥庵祅ull被認(rèn)為是一個空的對象引用。
Undefined類型只有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化時,這個變量的值就是undefined
var message; console.log(message == undefined); //true
字面量undefined的主要目的是用于比較,為了正式區(qū)分空對象指針與未經(jīng)初始化的變量
4.3 Null 類型Null類型是第二個只有一個值的數(shù)據(jù)類型,這個特殊的值是null。從邏輯角度來看,null值表示一個空對象指針,而這也正式使用typeof操作符檢測null值時會返回"object"的原因
var car = null; console.log(typeof null); //object
如果定義的變量準(zhǔn)備在將來用于保存對象,那么最好將該變量初始化為null而不是其他值。這樣一來,只要直接檢查null值就可以知道相應(yīng)的變量是否已經(jīng)保存了一個對象的引用。
4.4 Boolean 類型實(shí)際上,undefined值是派生自null值得,因此ECMA-262規(guī)定對他們的相等性測試要返回true
console.log(null == undefined); //true
Boolean類型只有兩個字面值:true和false
Boolean類型的字面值true和false是區(qū)分大小寫的
可以對任何數(shù)據(jù)類型的值調(diào)用Boolean()函數(shù),而且總會返回一個Boolean值
數(shù)據(jù)類型 | 轉(zhuǎn)換為true的值 | 轉(zhuǎn)換為false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | "" (空字符串) |
Number | 任何非零數(shù)字值 | 0和NaN |
Object | 任何對象 | null |
Undefined | N/A | undefined |
4.5 Number類型n/a (N/A),是not applicable的縮寫,意思是"不適用"。
Number類型使用IEEE754格式來表示整數(shù)和浮點(diǎn)數(shù)值(雙精度值)。為支持各種數(shù)值類型ECMA-262定義了不同的數(shù)值字面量格式。
十進(jìn)制
var intNum == 55;
八進(jìn)制
八進(jìn)制字面值的第一位必須是零(0),然后是數(shù)字序列(0~7)。如果字面值中的數(shù)值超出了范圍,那么_前導(dǎo)零_ 將被忽略,后面的數(shù)值將被當(dāng)做十進(jìn)制十進(jìn)制數(shù)值解析
var octalNum1 = 070; //八進(jìn)制的56 var octalNum2 = 079; //無效的八進(jìn)制數(shù)值——解析為79 var octalNum3 = 08; //無效的八進(jìn)制數(shù)值——解析為8
八進(jìn)制字面量在嚴(yán)格模式下是無效的,會導(dǎo)致支持該模式的JavaScript引擎拋出錯誤。
十六進(jìn)制
十六進(jìn)制字面值的前兩位必須是0x,后跟任何十六進(jìn)制數(shù)字(0~9 及 A~F)。字母A~F可以大寫,也可以小寫
var hexNum1 = 0xA; //十六進(jìn)制的10 var hexNum2 = 0x1f; //十六進(jìn)制的31
在進(jìn)行算數(shù)計(jì)算時,所有以八進(jìn)制和十六進(jìn)制表示的數(shù)值最終都將被轉(zhuǎn)換成十進(jìn)制數(shù)值
4.5.1 浮點(diǎn)數(shù)值保存浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值得兩倍,如果小數(shù)點(diǎn)后面沒有跟任何數(shù)字,或者浮點(diǎn)數(shù)值本身表示的就是一個整數(shù)(如1.0),那么該值將會被轉(zhuǎn)換成整數(shù)
var floatNum1 = 1; //小數(shù)點(diǎn)后面沒有數(shù)字——解析為1 var floatNum2 = 10.0; //整數(shù)——解析為10
對于那些極大或極小的數(shù)值,可以用e表示法(即科學(xué)計(jì)數(shù)法)表示浮點(diǎn)數(shù)值。用e表示法表示的數(shù)值等于e前面的數(shù)值乘以10的指數(shù)次冪。
var floatNum1 = 3.125e7; //等于31250000 var floatNum2 = 3e-7; //等于0.0000003
浮點(diǎn)數(shù)值得最高精度是17位小數(shù),但在進(jìn)行算術(shù)計(jì)算時其精度遠(yuǎn)遠(yuǎn)不如整數(shù)。例如,0.1加0.2的結(jié)果是0.30000000000000004
4.5.2 數(shù)值范圍由于內(nèi)存的限制,ECMAScript并不能保存世界上所有的數(shù)值。
最小數(shù)值 Number.MIN_VALUE //5e-324
最大數(shù)值 Number.MAX_VALUE //1.7976931348623157e+308
如果某次計(jì)算的結(jié)果得到了一個超出JavaScript數(shù)值范圍的值,那么這個值將被自動轉(zhuǎn)換成特殊的Infinity值
4.5.3 NaN正無窮大 Infinity
負(fù)無窮大 -Infunity
isFinite()函數(shù)可以判斷一個數(shù)值是否又窮的
NaN,即非數(shù)值(Not a Number),是一個特殊的數(shù)值,這個數(shù)值用于本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(這樣就不會拋出錯誤了)
任何涉及NaN的操作(例如NaN/10)都會返回NaN
NaN與任何值都不相等,包括NaN本身
console.log(NaN == NaN); //false
ECMAScript定義了isNaN()函數(shù),這個函數(shù)接受一個參數(shù),該參數(shù)可以是任何類型,而函數(shù)會幫我們確定這個函數(shù)是否"不是數(shù)值"
4.5.4 數(shù)值轉(zhuǎn)換isNaN()也適用于對象,基于對象調(diào)用isNaN()函數(shù)時,會先調(diào)用對象的valueOf()方法,再確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值。如果不能,則基于這個返回值再調(diào)用toString()方法,在測試返回值
Number()、parseInt()、parseFloat()
4.6 String類型 4.6.1 字符字面量String數(shù)據(jù)類型包含一些特殊的字符字面量,也叫轉(zhuǎn)義序列,用于表示非打印字符,或者具有其他用途的字符。
n:換行
t:制表
b:退格
r:回車
f:進(jìn)紙
x_nn_:以十六進(jìn)制代碼_nn_表示的一個字符(其中_n_為0~F)。例如,x41表示"A"
u_nnnn_:以十六進(jìn)制代碼_nnnn_表示的一個Unicode字符(其中_n_為0~F)。例如,u03a3表示希臘字符Σ
任何字符串的長度都可以通過訪問其length屬性取得:
var text = "This is the letter sigma: u03a3."; console.log(text.length); //輸出28
這個屬性返回的字符數(shù)包括16位字符的數(shù)目。如果字符串中包含雙字節(jié)字符,那么length屬性可能不會精確地返回字符串中的字符數(shù)目。
4.6.2 字符串的特點(diǎn)ECMAScript中的字符串是不可變的。字符串一旦創(chuàng)建,它們的值就不能改變。要改變某個變量保存的字符串,首先要銷原來的字符串,然后再用另一個包含新值的字符串填充該變量
4.6.3 轉(zhuǎn)換為字符串要把一個值轉(zhuǎn)換為一個字符串有兩種方法:
幾乎每個值都有的toString()方法
null和undefined值沒有這個方法
toString()方法接受一個參數(shù):輸出數(shù)值的基數(shù),toString()可以輸出以二進(jìn)制、八進(jìn)制、十六進(jìn)制,乃至其他任意有效進(jìn)制格式表示的字符串值(默認(rèn)基數(shù)為10)
String()函數(shù)能夠?qū)⑷魏晤愋偷闹缔D(zhuǎn)換為字符串
4.7 Object 類型如果值有toString()方法,則調(diào)用該方法(沒有參數(shù))并返回相應(yīng)的結(jié)果;
如果值是null,則返回"null";
如果值是undefined,則返回"undefined"。
ECMAScript中的對象其實(shí)就是一組數(shù)據(jù)和功能的集合。對象可以通過執(zhí)行new操作符后跟要創(chuàng)建的對象類型的名稱來創(chuàng)建。
var o = new Object(); //無傳參時可以省略括號,但不推薦這么做
Object的每個實(shí)例都具有下列屬性和方法:
constructor:保存著用于創(chuàng)建當(dāng)前對象的函數(shù)。對于前面的例子而言,構(gòu)造函數(shù)(constructor)就是Object()
hasOwnProperty(propertyName):用于檢查給定的屬性在當(dāng)前對象實(shí)例中(而不是在實(shí)例的原型中)是否存在。其中,作為參數(shù)的屬性名(_propertyName_)必須以字符串形式指定(例如:o.hasOwnProperty("name"))
isPrototypeOf(Object):用于檢查傳入的對象是否是當(dāng)前對象的原型
propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用for-in語句來枚舉。與hasOwnProperty()方法一樣,作為參數(shù)的屬性名必須以字符串形式指定
toLocaleString():返回對象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對應(yīng)
toString():返回對象的字符串表示
valueOf():返回對象的字符串、數(shù)值或布爾值表示。通常與toString()方法的返回值相同
由于在ECMAScript中Object是所有對象的基礎(chǔ),因此所有對象都具有這些基本的屬性和方法。
5 操作符 5.1 一元操作符只能操作一個值的操作符叫做一元操作符
5.1.1 遞增和遞減操作符執(zhí)行前置遞增和遞減操作符時,變量的值都是在語句被求值以前改變的(在計(jì)算機(jī)領(lǐng)域,這種情況通常被稱作副效應(yīng))
var age = 29; var antherAge = --age + 2; console.log(age); //輸出28 console.log(anotherAge); //輸出30
執(zhí)行后置遞增和遞減操作符時,變量的值都是在語句被求值之后改變的
var num1 = 2; var num2 = 20; var num3 = num1-- + num2; //等于22 var num4 = num1 + num2; //等于21
5.1.2 一元加和減操作符遞增遞減操作符對任何值都適用
在對非數(shù)值應(yīng)用一元加(減)操作符時,該操作符會像Number()函數(shù)一樣對這個值執(zhí)行轉(zhuǎn)換。
5.2 位操作符......
5.3 布爾操作符 5.3.1 邏輯非邏輯非操作符由一個嘆號(!)表示,可以應(yīng)用于ECMAScript中的任何值。無論這個值是什么數(shù)據(jù)類型,這個操作符都會返回一個布爾值。
同時使用兩個邏輯非操作符,實(shí)際上就會模擬Boolean()轉(zhuǎn)型函數(shù)的行為
邏輯與操作符由兩個和號(&&)表示,有兩個操作數(shù)
邏輯與操作可以應(yīng)用于任何類型的操作數(shù),而不僅僅是布爾值。在有一個操作數(shù)不是布爾值的情況下,邏輯與操作就不一定返回布爾值:
如果第一個操作數(shù)是對象,則返回第二個操作數(shù)
如果第二個操作數(shù)是對象,則只有在第一個操作數(shù)的求值結(jié)果為true的情況下才會返回該對象
如果兩個操作數(shù)都是對象,則返回第二個操作數(shù)
如果第一個操作數(shù)是null,則返回null
如果第一個操作數(shù)是NaN,則返回NaN
如果第一個操作數(shù)是undefined,則返回undefined
邏輯與操作屬于短路操作,如果第一個操作數(shù)能夠解決結(jié)果,那么久不會再對第二個操作數(shù)求值
var found = true; var result = (found && someUndefinedVariable); //這里會發(fā)生錯誤 console.log(result); //這一行不會執(zhí)行
上面代碼中,當(dāng)執(zhí)行邏輯與操作符時會發(fā)生錯誤,因?yàn)樽兞縮omeUndefinedVariable沒有聲明
var found = false; var result = (found && someUndefinedVariable); //不會發(fā)生錯誤 console.log(result); //會執(zhí)行("false")5.3.3 邏輯或
邏輯或操作符由兩個豎線符號(||)表示,有兩個操作數(shù)
與邏輯與相似,如果有一個操作數(shù)不是布爾值,邏輯或也不一定返回布爾值:
如果第一個操作數(shù)是對象,則返回第一個操作數(shù)
如果第一個操作數(shù)的求值結(jié)果為false,則返回第二個操作數(shù)
如果兩個操作數(shù)都是對象,則返回第一個操作數(shù)
如果兩個操作數(shù)都是對象,則返回第一個操作數(shù)
如果兩個操作數(shù)都是null,則返回null
如果兩個操作數(shù)都是undefined,則返回undefined
邏輯或操作符也是短路操作符。也就是說,如果第一個操作數(shù)的求值結(jié)果為true,就不會對第二個操作數(shù)求值了
5.6 關(guān)系操作符小于(<)、大于(>)、小于等于(<=)、大于等于(>=)
當(dāng)關(guān)系操作符的操作數(shù)使用了非數(shù)值時,會進(jìn)行數(shù)據(jù)轉(zhuǎn)換或完成某些奇怪的操作:
如果兩個操作數(shù)都是數(shù)值,則執(zhí)行數(shù)值比較
如果兩個操作數(shù)都是字符串,則比較兩個字符串對應(yīng)的字符編碼值
如果一個操作數(shù)是數(shù)值,則將另一個操作數(shù)轉(zhuǎn)換為一個數(shù)值,然后執(zhí)行數(shù)值比較
如果一個操作數(shù)是對象,則調(diào)用這個對象的valueOf()方法,用得到的結(jié)果按照前面的規(guī)則執(zhí)行比較。如果對象沒有valueOf()方法,則調(diào)用toString()方法,并用得到的結(jié)果根據(jù)前面的規(guī)則執(zhí)行比較
如果一個操作數(shù)是布爾值,則先將其轉(zhuǎn)換為數(shù)值,然后再執(zhí)行比較
5.7 相等操作符 5.7.1相等和不相等任何操作數(shù)與NaN比較,都會返回false
如果兩個操作數(shù)數(shù)據(jù)類型不同,則會先轉(zhuǎn)換數(shù)據(jù)類型(通常稱為強(qiáng)制轉(zhuǎn)型)再比較
null和undefined是相等的
要比較相等性之前,不能將null和undefined轉(zhuǎn)換成其他任何值
有一個操作符為NaN時,相等操作符返回false,NaN不等于NaN
如果兩個操作數(shù)都是對象,則比較它們是不是同一個對象
5.7.2 全等和不全等除了在比較之前不轉(zhuǎn)換操作數(shù)之外,全等和不全等操作符沒有什么區(qū)別
5.8 條件操作符variable = boolean_expression ? true_value : false_value;
var max = (num1 > num2) ? num1 : num2;5.9 賦值操作符
等于號(=)
5.10 逗號操作符逗號(,)
6語句 6.1 if語句if(1 > 25){ console.log(); }else{ console.log(); }6.2 do-while語句
var i = 0; do{ i += 2; }while(i < 10); console.log(i);6.3 while語句
var i = 0; while(1 < 10){ i += 2; }6.4 for語句
var count = 10; for(var i = 0; i < count; i++){ console.log(i); }
由于ECMAScript中不存在塊級作用域,因此在循環(huán)內(nèi)部定義的變量也可以在外部訪問到
6.5 for-in語句for語句中的初始化表達(dá)式、控制表達(dá)式和循環(huán)后表達(dá)式都是可選的。將這三個表達(dá)式全部省略,就會創(chuàng)建一個無限循環(huán)
for-in語句是一種精準(zhǔn)的迭代語句,可以用來枚舉對象的屬性
for(var propName in window){ document.write(propName); }
6.6 label語句ECMAScript對象的屬性沒有順序。因此,通過for-in循環(huán)輸出的屬性名的順序是不可預(yù)測的
使用label語句可以在代碼中添加標(biāo)簽,以便將來使用
start: for(var i = 0; i < count; i++){ console.log(i); }
6.7 break和continue語句這個例子中定義的start標(biāo)簽可以在將來有break或continue語句引用。加標(biāo)簽的語句一般都要與for語句等循環(huán)語句配合使用
break和continue語句用于在循環(huán)中精確地控制代碼的執(zhí)行
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++; } } console.log(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++; } } console.log(num); //95 //如果兩個循環(huán)都自然結(jié)束,num的值應(yīng)該是1006.8 with語句(舍棄!)
嚴(yán)格模式下不允許使用with語句,否則將視為語法錯誤。
由于大量使用with語句會導(dǎo)致性能下降,同時也會給調(diào)試代碼造成困難,因此不建議使用with語句
var num = 25; switch (true){ case num < 0: console.log("0"); break; case num >= 0 && num <= 10: console.log("0"); break; default: console.log("0"); }
7 函數(shù)switch語句在比較值時使用的是全等操作符,因此不會發(fā)生類型轉(zhuǎn)換
函數(shù)中的return語句可以不帶有任何返回值。在這種情況下,函數(shù)在停止執(zhí)行后將返回undefined值。
7.1 理解參數(shù)推薦的做法是要么讓函數(shù)始終都返回一個值,要么永遠(yuǎn)都不要返回值。否則,如果函數(shù)有時候返回值,有時候不返回值,會給調(diào)試代碼帶來不便
ECMAScript中的參數(shù)在內(nèi)部是用一個數(shù)組來表示的。函數(shù)接收到的始終都是這個數(shù)組,而不關(guān)心數(shù)組中包含哪些參數(shù)(如果有參數(shù)的話)。
在函數(shù)體內(nèi)可以通過arguments對象來訪問這個參數(shù)數(shù)組
ECMAScript函數(shù)有一個重要的特點(diǎn):命名的參數(shù)只提供便利,但不是必須的。
命名參數(shù)可以與arguments對象一起使用,arguments的值永遠(yuǎn)與對應(yīng)命名參數(shù)的值保持同步。
沒有傳遞值的命名參數(shù)將自動被賦予undefined值。
7.2 沒有重載嚴(yán)格模式下不允許重寫命名參數(shù)或者arguments的值,雖然可以執(zhí)行,但是命名參數(shù)與arguments對應(yīng)的值將不再同步
ECMAScript函數(shù)不能像傳統(tǒng)意義上那樣實(shí)現(xiàn)重載。ECMAScript函數(shù)沒有簽名,因?yàn)槠鋮?shù)是由包含零或多個值的數(shù)組來表示的。而沒有函數(shù)簽名,真正的重載是不可能做到的。
如果定義了兩個名字相同的函數(shù),則該名字只屬于后定義的函數(shù),先定義的函數(shù)將被覆蓋
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/82418.html
摘要:高程讀書筆記第三章語法中的一切變量函數(shù)名和操作符都區(qū)分大小寫。建議無論在任何情況下都指定基數(shù)函數(shù)與函數(shù)類似。返回對象的字符串?dāng)?shù)值或布爾值表示。 JS高程讀書筆記--第三章 語法 ECMAScript中的一切(變量、函數(shù)名和操作符)都區(qū)分大小寫。 不能把關(guān)鍵字、保留字、true、false和null用做標(biāo)識符。 嚴(yán)格模式是為JavaScript定義了一種不同的解析與執(zhí)行模型。在嚴(yán)格模式...
摘要:深入系列第九篇,除了按值傳遞引用傳遞,還有第三種傳遞方式按共享傳遞定義在高級程序設(shè)計(jì)第三版,講到傳遞參數(shù)中所有函數(shù)的參數(shù)都是按值傳遞的。 JavaScript深入系列第九篇,除了按值傳遞、引用傳遞,還有第三種傳遞方式 —— 按共享傳遞 定義 在《JavaScript高級程序設(shè)計(jì)》第三版 4.1.3,講到傳遞參數(shù): ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。 什么是按值傳遞呢?...
摘要:事情是如何發(fā)生的最近干了件事情,發(fā)現(xiàn)了源碼的一個。樓主找到的關(guān)于和區(qū)別的資料如下關(guān)于拿來主義為什么這么多文章里會出現(xiàn)澤卡斯的錯誤代碼樓主想到了一個詞,叫做拿來主義。的文章,就深刻抨擊了拿來主義這一現(xiàn)象。 事情是如何發(fā)生的 最近干了件事情,發(fā)現(xiàn)了 underscore 源碼的一個 bug。這件事本身并沒有什么可說的,但是過程值得我們深思,記錄如下,各位看官仁者見仁智者見智。 平時有瀏覽別...
摘要:標(biāo)識符按以下規(guī)則組合第一個字符必須是一個字母,下劃線或一個美元符號。包含值的變量和尚未定義的變量是不一樣的,例子報錯然而,對未初始化的變量執(zhí)行操作符會返回值,對未聲明的變量執(zhí)行操作符統(tǒng)一也會返回值。 1. 語法 1.1 區(qū)分大小寫 變量、函數(shù)名和操作費(fèi)都區(qū)分大小寫。 1.2 標(biāo)識符 標(biāo)識符指變量、函數(shù)、屬性的名字,或者函數(shù)的參數(shù)。標(biāo)識符按以下規(guī)則組合: 第一個字符必須是一個字母,下劃線...
閱讀 832·2023-04-25 22:13
閱讀 2344·2019-08-30 15:56
閱讀 2227·2019-08-30 11:21
閱讀 657·2019-08-30 11:13
閱讀 2022·2019-08-26 14:06
閱讀 1959·2019-08-26 12:11
閱讀 2291·2019-08-23 16:55
閱讀 541·2019-08-23 15:30