基礎(chǔ)語法
- 基本概念:變量、標(biāo)識符、注釋、區(qū)塊
- 條件語句:if-else、switch、三元運(yùn)算符
- 循環(huán)語句:while、for、do-while、break和continue、標(biāo)簽(label)
這些語法都是完全相同的,沒有必要像個(gè)初學(xué)者一個(gè)個(gè)去了解了。只需要掌握一些JS中不一樣的地方即可。
1、變量提升(hoisting)
JavaScript 引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運(yùn)行。這造成的結(jié)果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)
console.log(a);
var a = 1;
等價(jià)于
var a;
console.log(a);
a = 1;
2、區(qū)塊(block)
區(qū)塊的表達(dá)方式:JavaScript 使用大括號,將多個(gè)相關(guān)的語句組合在一起,稱為“區(qū)塊”(block)。
對于var命令來說,JavaScript 的區(qū)塊不構(gòu)成單獨(dú)的作用域(scope)
ES5中的區(qū)塊:
{
var a = 1;
}
a // 1
而在js中,對象的表達(dá)方式,也是這樣,不像oc中的對象都會以@開頭,例如下面的寫法,所以這里是需要轉(zhuǎn)變過來的概念。
@{
@"key" : @"value";
}
數(shù)據(jù)類型
JavaScript 的數(shù)據(jù)類型
1、七種數(shù)據(jù)類型
- 數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
- 字符串(string):文本(比如Hello World)。
- 布爾值(boolean):表示真?zhèn)蔚膬蓚€(gè)特殊值,即true(真)和false(假)
- undefined:表示“未定義”或不存在,即由于目前沒有定義,所以此處暫時(shí)沒有任何值
- null:表示空值,即此處的值為空。
- 對象(object):各種值組成的集合。
- Symbol 類型:ES6 新增,后面補(bǔ)充
2、原始類型(primitive type)
它們是最基本的數(shù)據(jù)類型,不能再細(xì)分
- 數(shù)值
- 字符串
- 布爾值
3、合成類型(complex type)
一個(gè)對象往往是多個(gè)原始類型的值的合成,可以看作是一個(gè)存放各種值的容器
- 狹義的對象(object)
- 數(shù)組(array)
- 函數(shù)(function)
typeof 運(yùn)算符
-
typeof運(yùn)算符:返回一個(gè)值的數(shù)據(jù)類型 -
instanceof運(yùn)算符 -
Object.prototype.toString方法
typeof的返回值
- 數(shù)值、字符串、布爾值分別返回number、string、boolean
- 函數(shù)返回function
- undefined返回undefined
- 對象返回object,空數(shù)組([])的類型也是object,null返回object
null 和 undefined
- 在if語句中,它們都會被自動(dòng)轉(zhuǎn)為false,
- null和undefined使用相等運(yùn)算符(==)甚至直接報(bào)告兩者相等
- null是一個(gè)表示“空”的對象,轉(zhuǎn)為數(shù)值時(shí)為0
- undefined是一個(gè)表示”此處無定義”的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN
布爾值
相等運(yùn)算符多了 === 和 !== 的比較,其他的都大同小異
- 兩元邏輯運(yùn)算符: && (And),|| (Or)
- 前置邏輯運(yùn)算符: ! (Not)
- 相等運(yùn)算符:===,!==,==,!=
- 比較運(yùn)算符:>,>=,<,<=
轉(zhuǎn)換規(guī)則是除了下面六個(gè)值被轉(zhuǎn)為false,其他值都視為true
- undefined
- null
- false
- 0
- NaN
- ""或''(空字符串)
【注意】空數(shù)組([])和空對象({})對應(yīng)的布爾值,都是true。
數(shù)值
整數(shù)和浮點(diǎn)數(shù)
JavaScript 內(nèi)部,
所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲存,即使整數(shù)也是如此。所以,1與1.0是相同的,是同一個(gè)數(shù)-
數(shù)值精度(浮點(diǎn)數(shù)的64個(gè)二進(jìn)制位)
- 第1位:符號位,0表示正數(shù),1表示負(fù)數(shù)
- 第2位到第12位(共11位):指數(shù)部分
- 第13位到第64位(共52位):小數(shù)部分(即有效數(shù)字)
- 精度最多只能到53個(gè)二進(jìn)制位,這意味著,絕對值小于等于2的53次方的整數(shù),即
-2^53到2^53 - “正向溢出”,即 JavaScript 無法表示這么大的數(shù),這時(shí)就會返回Infinity
- “負(fù)向溢出”,即 JavaScript 無法表示這么小的數(shù),這時(shí)會直接返回0
-
數(shù)值的表示法
- 十進(jìn)制:沒有前導(dǎo)0的數(shù)值。
- 八進(jìn)制:有前綴
0o或0O的數(shù)值,或者有前導(dǎo)0、且只用到0-7的八個(gè)阿拉伯?dāng)?shù)字的數(shù)值。 - 十六進(jìn)制:有前綴
0x或0X的數(shù)值。 - 二進(jìn)制:有前綴
0b或0B的數(shù)值。
特殊數(shù)值
正零和負(fù)零:JavaScript 內(nèi)部實(shí)際上存在2個(gè)0:一個(gè)是+0,一個(gè)是-0,區(qū)別就是64位浮點(diǎn)數(shù)表示法的符號位不同。它們是等價(jià)的。
-
NaN:表示“非數(shù)字”(Not a Number),主要出現(xiàn)在將字符串解析成數(shù)字出錯(cuò)的場合。
- 0除以0也會得到NaN。
- 使用typeof可以看到起數(shù)據(jù)類型依然是Number
- NaN不等于任何值,包括它本身。
- NaN與任何數(shù)(包括它自己)的運(yùn)算,得到的都是NaN
-
Infinity:表示“無窮”
- 第一個(gè)場景是一個(gè)表達(dá)式的計(jì)算結(jié)果太大,超出了能夠表示的范圍,因此返回Infinity
- 第二個(gè)場景是0除以0會得到NaN,而非0數(shù)值除以0,會返回Infinity
- Infinity表示正的無窮
- -Infinity表示負(fù)的無窮
- Infinity還有很多特殊的運(yùn)算法則,有時(shí)間了可以看看
與數(shù)值相關(guān)的全局方法
1、parseInt()
- parseInt方法用于將字符串轉(zhuǎn)為整數(shù)
- 如果字符串頭部有空格,空格會被自動(dòng)去除
- 如果parseInt的參數(shù)不是字符串,則會先轉(zhuǎn)為字符串再轉(zhuǎn)換
- 字符串轉(zhuǎn)為整數(shù)的時(shí)候,是一個(gè)個(gè)字符從左往右依次轉(zhuǎn)換,如果遇到不能轉(zhuǎn)為數(shù)字的字符,就不再進(jìn)行下去,返回已經(jīng)轉(zhuǎn)好的部分
- 如果字符串的第一個(gè)字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負(fù)號除外),返回NaN
- 如果字符串以0x或0X開頭,parseInt會將其按照十六進(jìn)制數(shù)解析。
進(jìn)制轉(zhuǎn)換:第二個(gè)參數(shù)(2到36之間),表示被解析的值的進(jìn)制
這個(gè)里有非常多的用法,但是我們在實(shí)際的使用中,知道以下幾個(gè)使用場景就可以了
parseInt('1000') // 1000
// 等同于
parseInt('1000', 10) // 1000
parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512
2、parseFloat()
- parseFloat方法用于將一個(gè)字符串轉(zhuǎn)為浮點(diǎn)數(shù)。
- parseFloat方法會自動(dòng)過濾字符串前導(dǎo)的空格。
- 如果參數(shù)不是字符串,或者字符串的第一個(gè)字符不能轉(zhuǎn)化為浮點(diǎn)數(shù),則返回NaN。
parseFloat 與 Number 之間的區(qū)別
parseFloat(true) // NaN
Number(true) // 1
parseFloat(null) // NaN
Number(null) // 0
parseFloat('') // NaN
Number('') // 0
parseFloat('123.45#') // 123.45
Number('123.45#') // NaN
3、isNaN()
- isNaN方法可以用來判斷一個(gè)值是否為NaN
- isNaN只對數(shù)值有效,如果傳入其他值,會被先轉(zhuǎn)成數(shù)值。所以,對于字符串、對象和數(shù)組,isNaN都返回true
- 但不是所有的字符串、對象和數(shù)組都返回true,如果他們能被正常解析成數(shù)字,那就返回false
使用isNaN之前,最好判斷一下數(shù)據(jù)類型
function myIsNaN(value) {
return typeof value === 'number' && isNaN(value);
}
判斷NaN更可靠的方法是,利用NaN為唯一不等于自身的值的這個(gè)特點(diǎn),進(jìn)行判斷
function myIsNaN(value) {
return value !== value;
}
4、isFinite()
isFinite方法返回一個(gè)布爾值,表示某個(gè)值是否為正常的數(shù)值
isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true
Infinity、-Infinity、NaN和undefined這幾個(gè)值會返回false,
isFinite對于其他的數(shù)值都會返回true
字符串
上面的數(shù)值這節(jié)寫了非常多的筆記,主要是因?yàn)樗@里提供了一些常用API,對他們的使用需要了解,所以進(jìn)行了一個(gè)記錄。這節(jié)主要是講字符串,這是非常非常重要的篇幅了,同樣的,也是只記錄不同的內(nèi)容,那些所有語言都相同的特性,就沒必要浪費(fèi)筆墨了。特別說明下字符集相關(guān)的內(nèi)容,如果遇到了再來查閱資料即可,這里不做過多研究。
使用特性
- 單引號字符串的內(nèi)部,可以使用雙引號
- 雙引號字符串的內(nèi)部,可以使用單引號
- 如果要在單引號字符串的內(nèi)部使用單引號,或雙引號字符串內(nèi)部使用雙引號,都需要在引號錢加反斜杠,用來轉(zhuǎn)義
- 字符串默認(rèn)只能寫在一行內(nèi),分成多行將會報(bào)錯(cuò)。如果長字符串必須分成多行,可以在每一行的尾部使用反斜杠。
- 連接運(yùn)算符(+)可以連接多個(gè)單行字符串,將長字符串拆成多行書寫,輸出的時(shí)候也是單行
轉(zhuǎn)義
- \0 :null(\u0000)
- \b :后退鍵(\u0008)
- \f :換頁符(\u000C)
- \n :換行符(\u000A)
- \r :回車鍵(\u000D)
- \t :制表符(\u0009)
- \v :垂直制表符(\u000B)
- ' :單引號(\u0027)
- " :雙引號(\u0022)
- \ :反斜杠(\u005C)
字符串與數(shù)組
- 可以使用數(shù)組的方括號運(yùn)算符,用來返回某個(gè)位置的字符
- 如果方括號中的數(shù)字超過字符串的長度,或者方括號中根本不是數(shù)字,則返回undefined。
- length屬性返回字符串的長度,該屬性也是無法改變的
Base64 轉(zhuǎn)碼
- 使用 Base64 編碼處理一些不可打印的符號,比如 ASCII 碼0到31的符號
- 使用 Base64 編碼以文本格式傳遞二進(jìn)制數(shù)據(jù)
JavaScript 原生提供兩個(gè) Base64 相關(guān)的方法。(這兩個(gè)方法不適合非 ASCII 碼的字符,會報(bào)錯(cuò))
- btoa():任意值轉(zhuǎn)為 Base64 編碼
- atob():Base64 編碼轉(zhuǎn)為原來的值
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
將非 ASCII 碼字符轉(zhuǎn)為 Base64 編碼
- 中間插入一個(gè)轉(zhuǎn)碼環(huán)節(jié)
- 再使用這兩個(gè)方法
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}
function b64Decode(str) {
return decodeURIComponent(atob(str));
}
b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
這篇文章關(guān)于字符串的介紹其實(shí)不太夠的,還需要查閱其他文章來解鎖更多字符的用法。