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