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浴讯,當無法計算結(jié)果時用NaN表示)、undefined(未定義)蔼啦。
注釋符
// 這是單行注釋
/*
這是
多行
注釋
*/
此外榆纽,由于歷史上JavaScript兼容HTML代碼的注釋,所以<\!--和-->
也被視為單行注釋。
區(qū)塊
JavaScript使用大括號奈籽,將多個相關的語句組合在一起饥侵,稱為“區(qū)塊”(block)。
與大多數(shù)編程語言不一樣衣屏,JavaScript的區(qū)塊不構(gòu)成單獨的作用域(scope)躏升。也就是說,區(qū)塊中的變量與區(qū)塊外的變量狼忱,屬于同一個作用域膨疏。
標簽(label)
JavaScript語言允許,語句的前面有標簽(label)钻弄,相當于定位符佃却,用于跳轉(zhuǎn)到程序的任意位置,標簽的格式如下窘俺。
label:
statement
數(shù)據(jù)類型轉(zhuǎn)換
JavaScript是一種動態(tài)類型語言饲帅,變量沒有類型限制,可以隨時賦予任意值瘤泪。雖然變量沒有類型灶泵,但是數(shù)據(jù)本身和各種運算符是有類型的。如果運算符發(fā)現(xiàn)均芽,數(shù)據(jù)的類型與預期不符丘逸,就會自動轉(zhuǎn)換類型。當然有些時候也會出現(xiàn)需要強制轉(zhuǎn)換的時候掀宋。
強制轉(zhuǎn)換
強制轉(zhuǎn)換主要指使用Number
深纲、String
和Boolean
三個構(gòu)造函數(shù),手動將各種類型的值劲妙,轉(zhuǎn)換成數(shù)字湃鹊、字符串或者布爾值。
Number()
可以將任意類型的值轉(zhuǎn)化成數(shù)值镣奋。
(1)原始類型值的轉(zhuǎn)換規(guī)則
// 數(shù)值:轉(zhuǎn)換后還是原來的值
Number(324) // 324
// 字符串:如果可以被解析為數(shù)值币呵,則轉(zhuǎn)換為相應的數(shù)值
Number('\t\v\r324\n') // 324
// 字符串:如果不可以被解析為數(shù)值,返回NaN
Number('abc') // NaN
// 空字符串轉(zhuǎn)為0
Number('') // 0
// undefined:轉(zhuǎn)成 NaN
Number(undefined) // NaN
// null:轉(zhuǎn)成0
Number(null) // 0
parseInt('42 abc') // 42
parseInt
逐個解析字符侨颈,而Number
函數(shù)整體轉(zhuǎn)換字符串的類型余赢。
另外,Number
函數(shù)會自動過濾一個字符串前導和后綴的空格哈垢。
(2)對象的轉(zhuǎn)換規(guī)則
Number方法的參數(shù)是對象時妻柒,將返回NaN。
1.調(diào)用對象自身的valueOf方法耘分。如果返回原始類型的值举塔,則直接對該值使用Number函數(shù)绑警,不再進行后續(xù)步驟。
2.如果valueOf方法返回的還是對象央渣,則改為調(diào)用對象自身的toString方法计盒。如果返回原始類型的值,則對該值使用Number函數(shù)芽丹,不再進行后續(xù)步驟北启。
3.如果toString方法返回的是對象,就報錯志衍。
String()
可以將任意類型的值轉(zhuǎn)化成字符串暖庄。
(1)原始類型值的轉(zhuǎn)換規(guī)則
數(shù)值:轉(zhuǎn)為相應的字符串聊替。
字符串:轉(zhuǎn)換后還是原來的值楼肪。
布爾值:true轉(zhuǎn)為"true",false轉(zhuǎn)為"false"惹悄。
undefined:轉(zhuǎn)為"undefined"春叫。
null:轉(zhuǎn)為"null"。
String()對象的轉(zhuǎn)換規(guī)則
String
方法的參數(shù)如果是對象泣港,返回一個類型字符串暂殖;如果是數(shù)組,返回該數(shù)組的字符串形式当纱。
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
String
方法背后的轉(zhuǎn)換規(guī)則呛每,優(yōu)先toString
方法,后valueOf
方法坡氯。
Boolean()
使用Boolean函數(shù)晨横,可以將任意類型的變量轉(zhuǎn)為布爾值。
它的轉(zhuǎn)換規(guī)則相對簡單:除了以下六個值的轉(zhuǎn)換結(jié)果為false箫柳,其他的值全部為true手形。
undefined
null
-0
0或+0
NaN
''(空字符串)
注意:所有對象(包括空對象)的轉(zhuǎn)換結(jié)果都是true,甚至連false對應的布爾對象new Boolean(false)也是true悯恍。
自動轉(zhuǎn)換
下面介紹自動轉(zhuǎn)換库糠,它是以強制轉(zhuǎn)換為基礎的。
遇到以下三種情況時涮毫,JavaScript會自動轉(zhuǎn)換數(shù)據(jù)類型瞬欧,即轉(zhuǎn)換是自動完成的,對用戶不可見罢防。
// 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
自動轉(zhuǎn)換的規(guī)則是這樣的:預期什么類型的值艘虎,就調(diào)用該類型的轉(zhuǎn)換函數(shù)。比如篙梢,某個位置預期為字符串顷帖,就調(diào)用String函數(shù)進行轉(zhuǎn)換美旧。如果該位置即可以是字符串,也可能是數(shù)值贬墩,那么默認轉(zhuǎn)為數(shù)值榴嗅。
由于自動轉(zhuǎn)換具有不確定性,而且不易出錯陶舞,建議在預期為布爾值嗽测、數(shù)值、字符串的地方肿孵,全部使用Boolean唠粥、Number和String函數(shù)進行顯式轉(zhuǎn)換。
除了加法運算符有可能把運算子轉(zhuǎn)為字符串停做,其他運算符都會把運算子自動轉(zhuǎn)成數(shù)值晤愧。
false / '5' // 0
'abc' - 1 // NaN
學習參考:
廖雪峰的JavaScript教程
JavaScript 標準參考教程 阮一峰
李炎恢的JavaScript視頻教程