ECMAScript中的一切(變量、函數名和操做符)都區分大小寫。express
不能把關鍵字、保留字、true、false和null用作標識符。數組
嚴格模式是爲JavaScript定義了一種不一樣的解析與執行模型。在嚴格模式下,ECMAScript3中的一些不肯定的行爲將獲得處理,並且對某些不安全的操做也會拋出錯誤。("use strict";)。安全
ECMAScript中的語句以一個分號結尾;若是省略分號,則由解析器肯定語句的結尾。函數
關鍵字能夠用於表示控制語句的開始或結束,或者用於執行特定的操做等。測試
保留字某種意義上是爲了未來的關鍵字而保留的單詞。編碼
ECMAScript的變量是鬆散類型的,能夠用來保存任何類型的數據,每一個變量僅僅是一個用於保存值得佔位符而已。指針
ECMAScript中有5種簡單數據類型(基本數據類型):Undefined、Null、Boolean、Number和String,還有一種複雜數據類型:Object。code
typeof是一個操做符而不是函數。對一個值使用typeof操做符可能返回下列某個字符串:對象
"undefined"--若是這個值未定義;ip
"boolean"--若是這個值是布爾值;
"string"--若是這個值是字符串;
"number"--若是這個值是數值;
"object"--若是這個值是對象或null;
"function"--若是這個值是函數;
調用
typeof null
會返回"object",由於特殊值null被認爲是一個空的對象的引用能夠經過
typeof
操做符來區分函數和其餘對象
Undefined類型只有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化時,這個變量就是undefined。
注:
typeof
操做符返回"undefined"值時,能夠檢測變量是否被聲明,而不是是否初始化。由於對未聲明的變量執行typeof
操做符也返回"undefined"
Null類型是第二個只有一個值的數據類型,這個特殊的值是null。從邏輯角度來看,null值表示一個空對象指針。
若是定義的變量準備在未來用於保存對象,那麼最好將該變量初始化爲null而不是其餘值
null == undefined
// 返回true
Boolean類型只有兩個字面值:true和false(小寫)。
JS中全部類型的值都有與這兩個Boolean值等價的值,能夠調用轉換函數Boolean ( )。
數據類型 | 轉換爲true的值 | 轉換爲false的值 |
---|---|---|
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零數字值(包括無窮大) | 0和NaN |
Object | 任何對象 | null |
Undefined | (不適用) | undefined |
Number類型使用IEEE754格式來表示整數和浮點數值。
所謂浮點數值,就是該數值中必須包含一個小數點,而且小數點後必須至少有一位數字
保存浮點數值須要的內存空間是保存整數值的兩倍,所以ECMAScript會不時地將浮點數值轉換爲整數值。
對於極大極小的數值,能夠用e表示法(科學計數法)表示的浮點數值表示。用e表示法表示的數值等於e前面的數值乘以10的指數次冪。
浮點數值的最高精度是17位小數。
若是某次計算的結果獲得了一個超出JS數值範圍的值,那麼這個數值將被自動轉換成特殊的Infinity值
想要肯定一個數值是不是無窮的,可使用isFinite()
函數
NaN,即非數值是一個特殊的數值,這個數值用於表示一個原本要返回數值的操做數未返回數值的狀況(這樣就不會拋出錯誤)。
任何涉及NaN的操做都會返回NaN
NaN與任何值都不相等,包括NaN自己
isNaN()
函數能夠肯定參數是否「不是數值」
有三個函數能夠把非數值轉換爲數值:Number()
、parseInt()
和parseFloat()
。轉型函數Number()
能夠用於任何數據類型,而另外兩個函數則專門用於把字符串轉換成數值。
Number()
轉換規則以下若是是Boolean值,true和false將分別被轉換爲1和0。
若是是數字值,只是簡單的傳入和傳出。
若是是null值,返回0。
若是是undefined,返回NaN。
若是是字符串,遵循如下規則:
若是字符串中只包含數字,則將其轉換爲十進制數值;
若是字符串中包含有效的浮點格式,則將其轉換爲對應的浮點數值;
若是字符串中包含有效的十六進制格式,例如"0xf",則將其轉換爲相同大小的十進制整數值;
若是字符串是空的(不包含任何字符),則將其轉換爲0;
若是字符串中包含除上述格式以外的字符,則將其轉換爲NaN;
若是是對象,則調用對象的valueOf()
的方法,而後依照前面的規則轉換返回的值。
parseInt()
函數Number()
函數在轉換字符串的時候比較複雜且不夠合理,所以處理整數的時候更經常使用parseInt()
。parseInt()
函數在轉換字符串時,更多的是看其是否符合數值模式。它會忽略字符串前面的空格,直至找到第一個非空格字符。若是第一個字符不是數字或者符號,parseInt()
就會返回NaN。若是第一個字符是數字字符,parseInt()
會繼續解析,知道解析完全部或者遇到了非數字字符。
parseInt()
轉換空字符串會返回NaN,而Number()
對空字符串返回0。
這個函數的第二個參數是轉換時使用的基數。(建議不管在任何狀況下都指定基數)
parseFloat()
函數與parseInt()
函數相似。區別爲:
字符串中第一個小數點是有效的,後面的小數點都是無效的
parseFloat()
只解析十進制值,所以它沒有用第二個參數指定基數的方法。它始終會忽略前面的0。
String類型用於表示由零或多個16位Unicode字符組成的字符序列,即字符串。用雙引號表示的字符串和用單引號表示的字符串徹底相同。
字符字面量能夠出如今字符串中的任意位置,並且也將被做爲一個字符來解析。
任何字符串的長度均可以經過訪問其length屬性取得。
ECMAScript中的字符串是不可變的,也就是說,字符串一旦建立,它們的值就不能改變。要改變某個變量保存的字符串,首先要銷燬原來的字符串。
數值、布爾值、對象和字符串值(返回字符串的一個副本)都有toString()
方法。但null和undefined沒有這個方法,能夠傳遞一個參數:輸出數值的基數。
轉型函數String()
若是值有toString()
方法,則調用該方法(沒有參數)並返回相應的結果;
若是值是null,則返回"null";
若是值是undefined,則返回"undefined"。
對象能夠經過new操做符建立:var o = new Object();
。
Object的每一個實例都具備下列屬性和方法:
constructor:保存着用於建立當前對象的函數。
hasOwnProperty(propertyName)
:用於檢查給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在。其中,做爲參數的屬性名(propertyName)必須以字符串的形式指定。
isPrototypeOf(object)
:用於檢查傳入的對象是不是傳入對象的原型。
propertyIsEnumerable(propertyName)
:用於檢查給定的屬性是否可以使用for-in語句來枚舉
toLocaleString()
:返回對象的字符串表示,該字符串與執行環境的地區對應。
toString()
:返回對象的字符串表示。
valueOf()
:返回對象的字符串、數值或布爾值表示。一般與toString()
方法的返回值相同。
只能操做一個值的操做符叫作一元操做符
執行前置遞增和遞減操做時,變量的值都是在語句被求值之前改變的(副效應)。
在對非數值應用一元加操做符時,該操做符會像Number()
轉型函數同樣對這個值執行轉換
布爾操做符共有三個:非(!)、與(&&)、或(||)。
同時使用兩個邏輯非操做符,實際上就會模擬
Boolean()
轉型函數的行爲
若是參與乘性計算的某個操做數不是數值,後臺會先使用Number()
轉型函數將其轉換爲數值。
對於加法操做符(+)來講:
若是兩個操做數都是字符串,則將第二個操做數與第一個操做數拼接起來;
若是隻有一個操做數是字符串,則將另外一個操做數轉換爲字符串,而後再將兩個字符串拼接起來
若是有一個操做數是對象、數值、或布爾值,則調用他們的toString()
方法取得相應的字符串的值,再應用前面關於字符串的規則;
對於undefined和null,則分別調用String()
函數並取得字符串"undefined"和"null";
每一個加法操做都是獨立執行的
對於減法操做符(-)來講:
若是有一個操做數是字符串、布爾值、null或undefined,則如今後臺調用Number()
函數將其轉換爲數值,而後再根據前面的規則執行減法計算。若是轉換的結果是NaN,則減法的結果就是NaN;
若是有一個操做數是對象,則調用對象的valueOf()
方法以取得表示該對象的數值。若是獲得的值是NaN,則減法的結果就是NaN。若是對象沒有valueOf()
方法,則調用其toString()
方法並將獲得的字符串轉換爲數值;
當關系操做符使用了非數值時:
若是兩個操做數都是字符串,則比較兩個字符串中對應位置的每一個字符的字符編碼值;
若是一個操做數是數值,則將另外一個操做數轉換爲一個數值,而後執行數值比較;
若是一個操做數是對象,則調用這個對象的valueOf()
方法,用獲得的結果按照前面的規則進行比較。若是對象沒有valueOf()
方法,則調用toString()
方法,並用獲得的結果根據前面的規則執行比較;
若是一個操做數是布爾值,則先將其轉換爲數值,而後再執行比較;
任何操做數與NaN進行關係比較,結果都是false
相等和不相等:先轉換再比較;全等和不全等:僅比較而不轉換
在轉換不一樣的數據類型時,遵循如下規則:
若是有一個操做數是布爾值,則在比較相等性以前先將其轉換爲數值:false轉換爲0,而true轉換爲1;
若是有一個操做數是字符串,另外一個操做數是數值,在比較相等性以前先將字符串轉換爲數值;
若是一個操做數是對象,另外一個操做數不是,則調用對象的valueOf()
方法,用獲得的基本類型值按照前面的規則進行比較
這倆操做符在進行比較時要遵循:
null == undefined;
要比較相等性以前,不能將null和undefined轉換成其餘任何值;
若是有一個操做數是NaN,則相等操做符返回false,不相等操做符返回true。即便兩個操做數都是NaN,相等操做符也返回false;由於按照規則,NaN不等於NaN;
若是兩個操做數都是對象,則比較它們是否是同一個對象。若是兩個操做數都指向同一個對象,則相等操做符返回true,不然返回false;
它只在兩個操做數未經轉換就相等的狀況下返回true;
null === undefined
// false
解析器會自動調用Boolean()
轉換函數將條件表達式的結果轉化爲一個布爾值;
條件操做符:variable = boolean_expression ? true_value : false_value;
do-while語句是一種後測試循環語句,即只有在循環體中的代碼執行以後,纔會測試出口條件。在對條件表達式求值以前,循環體內的代碼至少會被執行一次。
while語句屬於前測試循環語句,也就是說,在循環體內的代碼被執行以前,就會對出口條件求值。所以循環體內代碼有可能永遠不會被執行。
使用while循環作不到的,使用for循環一樣也作不到。能夠說for循環只是把與循環有關的代碼集中在了一個位置
for-in語句是一種精準的迭代語句,能夠用來枚舉對象的屬性
break語句會當即退出循環,強制繼續執行循環後面的語句;
continue語句雖然也是當即退出循環,但退出循環後會從循環的頂部繼續執行;
with語句的做用是將代碼的做用域設置到一個特定的對象中;
定義with語句的目的主要是爲了簡化屢次編寫同一個對象的工做;
嚴格模式下不容許使用with語句;
省略break關鍵字,會致使執行完當前case後,繼續執行下一個case;
default關鍵字用於在表達式不匹配前面任何一種情形的時候,執行代碼(至關於else);
switch語句在比較值時使用的是全等操做符,所以不會發生類型轉換;
任何函數在任什麼時候候均可以經過return語句後跟要返回的值來實現返回值
位於return語句以後的任何代碼都永遠不會執行
return語句後也能夠不帶有任何返回值。在這種狀況下,函數在中止執行後將返回undefined值。這種作法通常用在須要提早中止函數執行而又不須要返回值的狀況。
arguments對象是一個類數組對象,能夠經過方括號語法訪問它的每個元素,也可使用length屬性來肯定傳遞進來多少個參數。