JavaScript基本語法
變量
var a = 1;
上面的代碼先聲明變量a,然后在變量a與數(shù)值1之間建立引用關系,也稱為將數(shù)值1“賦值”給變量a。以后,引用變量a就會得到數(shù)值1。最前面的var,是變量聲明命令。它表示通知解釋引擎,要創(chuàng)建一個變量a。
JavaScirpt是一種動態(tài)類型語言,也就是說,變量的類型沒有限制,可以賦予各種類型的值。
可重新賦值,但無需重新聲明。
null和undefined
如果只是聲明變量而沒有賦值,則該變量的值是undefined。undefined是一個JavaScript關鍵字,表示“無定義,不存在的值”。而不是null(理解為無值)。
null表示一個“空”的值,它和0以及空字符串''不同,0是一個數(shù)值,''表示長度為0的字符串,而null表示“空”。
在其他語言中,也有類似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,還有一個和null類似的undefined,它表示“未定義”。
JavaScript的設計者希望用null表示一個空的值,而undefined表示值未定義。事實證明,這并沒有什么卵用,區(qū)分兩者的意義不大。大多數(shù)情況下,我們都應該用null。undefined僅僅在判斷函數(shù)參數(shù)是否傳遞的情況下有用。
變量提升
JavaScript引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)。
標識符
標識符(identifier)是用來識別具體對象的一個名稱。
標識符命名規(guī)則:
第一個字符,可以是任意Unicode字母(包括英文字母和其他語言的字母),以及美元符號($)和下劃線(_)。
第二個字符及后面的字符,除了Unicode字母、美元符號和下劃線,還可以用數(shù)字0-9
注意不要用保留字,有arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。
另外,還有三個詞雖然不是保留字,但是因為具有特別含義,也不應該用作標識符。分別是Infinity(無限大,當數(shù)值超過了JavaScript的Number所能表示的最大值時,就表示為Infinity)、NaN(表示Not a Number,當無法計算結果時用NaN表示)、undefined(未定義)。
注釋符
// 這是單行注釋
/*
這是
多行
注釋
*/
此外,由于歷史上JavaScript兼容HTML代碼的注釋,所以<\!--和-->也被視為單行注釋。
區(qū)塊
JavaScript使用大括號,將多個相關的語句組合在一起,稱為“區(qū)塊”(block)。
與大多數(shù)編程語言不一樣,JavaScript的區(qū)塊不構成單獨的作用域(scope)。也就是說,區(qū)塊中的變量與區(qū)塊外的變量,屬于同一個作用域。
標簽(label)
JavaScript語言允許,語句的前面有標簽(label),相當于定位符,用于跳轉到程序的任意位置,標簽的格式如下。
label:
statement
數(shù)據(jù)類型轉換
JavaScript是一種動態(tài)類型語言,變量沒有類型限制,可以隨時賦予任意值。雖然變量沒有類型,但是數(shù)據(jù)本身和各種運算符是有類型的。如果運算符發(fā)現(xiàn),數(shù)據(jù)的類型與預期不符,就會自動轉換類型。當然有些時候也會出現(xiàn)需要強制轉換的時候。
強制轉換
強制轉換主要指使用Number、String和Boolean三個構造函數(shù),手動將各種類型的值,轉換成數(shù)字、字符串或者布爾值。
Number()
可以將任意類型的值轉化成數(shù)值。
(1)原始類型值的轉換規(guī)則
// 數(shù)值:轉換后還是原來的值
Number(324) // 324
// 字符串:如果可以被解析為數(shù)值,則轉換為相應的數(shù)值
Number('\t\v\r324\n') // 324
// 字符串:如果不可以被解析為數(shù)值,返回NaN
Number('abc') // NaN
// 空字符串轉為0
Number('') // 0
// undefined:轉成 NaN
Number(undefined) // NaN
// null:轉成0
Number(null) // 0
parseInt('42 abc') // 42
parseInt逐個解析字符,而Number函數(shù)整體轉換字符串的類型。
另外,Number函數(shù)會自動過濾一個字符串前導和后綴的空格。
(2)對象的轉換規(guī)則
Number方法的參數(shù)是對象時,將返回NaN。
1.調用對象自身的valueOf方法。如果返回原始類型的值,則直接對該值使用Number函數(shù),不再進行后續(xù)步驟。
2.如果valueOf方法返回的還是對象,則改為調用對象自身的toString方法。如果返回原始類型的值,則對該值使用Number函數(shù),不再進行后續(xù)步驟。
3.如果toString方法返回的是對象,就報錯。
String()
可以將任意類型的值轉化成字符串。
(1)原始類型值的轉換規(guī)則
數(shù)值:轉為相應的字符串。
字符串:轉換后還是原來的值。
布爾值:true轉為"true",false轉為"false"。
undefined:轉為"undefined"。
null:轉為"null"。
String()對象的轉換規(guī)則
String方法的參數(shù)如果是對象,返回一個類型字符串;如果是數(shù)組,返回該數(shù)組的字符串形式。
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
String方法背后的轉換規(guī)則,優(yōu)先toString方法,后valueOf方法。
Boolean()
使用Boolean函數(shù),可以將任意類型的變量轉為布爾值。
它的轉換規(guī)則相對簡單:除了以下六個值的轉換結果為false,其他的值全部為true。
undefined
null
-0
0或+0
NaN
''(空字符串)
注意:所有對象(包括空對象)的轉換結果都是true,甚至連false對應的布爾對象new Boolean(false)也是true。
自動轉換
下面介紹自動轉換,它是以強制轉換為基礎的。
遇到以下三種情況時,JavaScript會自動轉換數(shù)據(jù)類型,即轉換是自動完成的,對用戶不可見。
// 1. 不同類型的數(shù)據(jù)互相運算
123 + 'abc' // "123abc"
// 2. 對非布爾值類型的數(shù)據(jù)求布爾值
if ('abc') {
console.log('hello')
} // "hello"
// 3. 對非數(shù)值類型的數(shù)據(jù)使用一元運算符(即“+”和“-”)
+ {foo: 'bar'} // NaN
- [1, 2, 3] // NaN
自動轉換的規(guī)則是這樣的:預期什么類型的值,就調用該類型的轉換函數(shù)。比如,某個位置預期為字符串,就調用String函數(shù)進行轉換。如果該位置即可以是字符串,也可能是數(shù)值,那么默認轉為數(shù)值。
由于自動轉換具有不確定性,而且不易出錯,建議在預期為布爾值、數(shù)值、字符串的地方,全部使用Boolean、Number和String函數(shù)進行顯式轉換。
除了加法運算符有可能把運算子轉為字符串,其他運算符都會把運算子自動轉成數(shù)值。
false / '5' // 0
'abc' - 1 // NaN
學習參考:
廖雪峰的JavaScript教程
JavaScript 標準參考教程 阮一峰
李炎恢的JavaScript視頻教程