作者:cedar(http://www.reibang.com/writer#/notebooks/28559629/notes/32531540)
一砂碉、基礎知識
- JavaScript代碼可以直接嵌在網(wǎng)頁的任何地方耐薯,不過通常我們都把JavaScript代碼放到
<head>
中逛漫。
由<script>...</script>
包含的代碼就是JavaScript代碼原茅,它將直接被瀏覽器執(zhí)行澈蟆。 - 第二種方法是把JavaScript代碼放到一個單獨的.js文件翔忽,然后在HTML中通過
<script src="..."></script>
引入這個文件
把JavaScript代碼放入一個單獨的.js文件中更利于維護代碼雾家,并且多個頁面可以各自引用同一份.js文件铃彰。
可以在同一個頁面中引入多個.js文件,還可以在頁面中多次編寫<script> js代碼... </script>芯咧,瀏覽器按照順序依次執(zhí)行牙捉。 - 編寫JavaScript:Visual Studio Code,Sublime Text敬飒,Notepad++邪铲。
- 運行JavaScript:要讓瀏覽器運行JavaScript,必須先有一個HTML頁面无拗,在HTML頁面中引入JavaScript带到,然后,讓瀏覽器加載該HTML頁面英染,就可以執(zhí)行JavaScript代碼揽惹。
- 調(diào)試JavaScript:需要安裝Google Chrome瀏覽器,Chrome瀏覽器對開發(fā)者非常友好四康,可以讓你方便地調(diào)試JavaScript代碼搪搏。打開瀏覽器中開發(fā)者工具,點擊控制臺(Console)闪金,可以在這個面板里直接輸入Javascript代碼疯溺,按回車執(zhí)行。
1哎垦、基本語法
- JavaScript的語法和Java語言類似囱嫩,每個語句以;結(jié)束,語句塊用
{...}
漏设。但是墨闲,JavaScript并不強制要求在每個語句的結(jié)尾加;,瀏覽器中負責執(zhí)行JavaScript代碼的引擎會自動在每個語句的結(jié)尾補上;愿题。 - 注意花括號{...}內(nèi)的語句具有縮進损俭,通常是4個空格∨诵铮縮進不是JavaScript語法要求必須的杆兵,但縮進有助于我們理解代碼的層次,所以編寫代碼時要遵守縮進規(guī)則仔夺。
- JavaScript本身對嵌套的層級沒有限制琐脏,但是過多的嵌套無疑會大大增加看懂代碼的難度。遇到這種情況,需要把部分代碼抽出來日裙,作為函數(shù)來調(diào)用吹艇,這樣可以減少代碼的復雜度。
- 注釋:以
//
開頭直到行末的字符被視為行注釋昂拂;另一種塊注釋是用/*...*/
把多行字符包裹起來受神,把一大“塊”視為一個注釋 - 大小寫:JavaScript嚴格區(qū)分大小寫,如果弄錯了大小寫格侯,程序?qū)箦e或者運行不正常鼻听。
2、數(shù)據(jù)類型和變量
- Number:JavaScript不區(qū)分整數(shù)和浮點數(shù)联四,統(tǒng)一用Number表示撑碴。
- 字符串:字符串是以單引號'或雙引號"括起來的任意文本。
- 布爾值:布爾值和布爾代數(shù)的表示完全一致朝墩。
- 比較運算符:JavaScript允許對任意數(shù)據(jù)類型作比較醉拓。
-
==
比較,它會自動轉(zhuǎn)換數(shù)據(jù)類型再比較收苏,很多時候亿卤,會得到非常詭異的結(jié)果; -
===
比較倒戏,它不會自動轉(zhuǎn)換數(shù)據(jù)類型怠噪,如果數(shù)據(jù)類型不一致,返回false
杜跷,如果一致傍念,再比較。 -
NaN
這個特殊的Number與所有其他值都不相等葛闷,包括它自己憋槐。
-
- null和undefined:
null
表示一個"空"的值。undefined
表示值未定義淑趾。 - 數(shù)組:數(shù)組是一組按順序排列的集合阳仔,集合的每個值稱為元素。JavaScript的數(shù)組可以包括任意數(shù)據(jù)類型扣泊。另一種創(chuàng)建數(shù)組的方法是通過Array()函數(shù)實現(xiàn)近范。
- 對象:JavaScript的對象是一組由鍵-值組成的無序集合。JavaScript對象的鍵都是字符串類型延蟹,值可以是任意數(shù)據(jù)類型评矩。
- 變量:變量在JavaScript中就是用一個變量名表示,變量名是大小寫英文阱飘、數(shù)字斥杜、$和_的組合虱颗,且不能用數(shù)字開頭。變量名也不能是JavaScript的關鍵字蔗喂,如if忘渔、while等。申明一個變量用
var
語句缰儿。要顯示變量的內(nèi)容畦粮,可以用console.log(x)
,打開Chrome的控制臺就可以看到結(jié)果返弹。 - strict模式:使用var申明的變量則不是全局變量锈玉,它的范圍被限制在該變量被申明的函數(shù)體內(nèi),同名變量在不同的函數(shù)體內(nèi)互不沖突义起。ECMA在后續(xù)規(guī)范中推出了strict模式,在strict模式下運行的JavaScript代碼师崎,強制通過var申明變量默终,未使用var申明變量就使用的,將導致運行錯誤犁罩。啟用strict模式的方法是在JavaScript代碼的第一行寫上:
'use strict';
齐蔽。
3、字符串
- 如果字符串內(nèi)部既包含'又包含"怎么辦床估?可以用轉(zhuǎn)義字符\來標識含滴。
- 多行字符串:最新的ES6標準新增了一種多行字符串的表示方法,用反引號`...` 表示丐巫。
- 模板字符串:ES6新增了一種模板字符串谈况,表示方法和上面的多行字符串一樣,但是它會自動替換字符串中的變量递胧。
var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}歲了!`;
alert(message);
- 操作字符串:要獲取字符串某個指定位置的字符碑韵,使用類似Array的下標操作,索引號從0開始缎脾。需要特別注意的是祝闻,字符串是不可變的,如果對字符串的某個索引賦值遗菠,不會有任何錯誤联喘,但是,也沒有任何效果辙纬。
-
toUpperCase()
把一個字符串全部變?yōu)榇髮?/li> -
toLowerCase()
把一個字符串全部變?yōu)樾?/li> -
indexOf()
會搜索指定字符串出現(xiàn)的位置 -
substring()
返回指定索引區(qū)間的子串
-
4豁遭、數(shù)組
- JavaScript的
Array
可以包含任意數(shù)據(jù)類型,并通過索引來訪問每個元素牲平。 - 直接給
Array
的length
賦一個新的值會導致Array
大小的變化堤框。 - 如果通過索引賦值時,索引超過了范圍,同樣會引起
Array
大小的變化蜈抓。 - indexOf:與String類似启绰,
Array
也可以通過indexOf()
來搜索一個指定的元素的位置。 - slice:
slice()
就是對應String的substring()
版本沟使,它截取Array
的部分元素委可,然后返回一個新的Array
。 - push和pop:
push()
向Array
的末尾添加若干元素腊嗡,pop()
則把Array
的最后一個元素刪除掉着倾。 - unshift和shift:如果要往
Array
的頭部添加若干元素,使用unshift()
方法燕少,shift()
方法則把Array
的第一個元素刪掉卡者。 - sort:
sort()
可以對當前Array
進行排序,它會直接修改當前Array
的元素位置客们,直接調(diào)用時崇决,按照默認順序排序。 - reverse:反轉(zhuǎn)底挫。
- splice:
splice()
方法是修改Array
的“萬能方法”恒傻,它可以從指定的索引開始刪除若干元素,然后再從該位置添加若干元素建邓。 - concat:數(shù)組連接起來盈厘。
concat()
方法并沒有修改當前Array
,而是返回了一個新的Array
官边。 - join:
join()
把當前Array
的每個元素都用指定的字符串連接起來沸手,然后返回連接后的字符串。 - 多維數(shù)組:如果數(shù)組的某個元素又是一個
Array
拒逮,則可以形成多維數(shù)組罐氨。
5、對象
- JavaScript的對象是一種無序的集合數(shù)據(jù)類型滩援,它由若干鍵值對組成栅隐。
- JavaScript規(guī)定,訪問不存在的屬性不報錯玩徊,而是返回
undefined
租悄。 - 由于JavaScript的對象是動態(tài)類型,你可以自由地給一個對象添加或刪除屬性恩袱。
- 如果我們要檢測
xiaoming
是否擁有某一屬性泣棋,可以用in
操作符。不過要小心畔塔,如果in
判斷一個屬性存在潭辈,這個屬性不一定是xiaoming
的鸯屿,它可能是xiaoming
繼承得到的。
6把敢、條件判斷
- JavaScript使用
if () { ... } else { ... }
來進行條件判斷寄摆。 - 多行條件判斷:如果還要更細致地判斷條件,可以使用多個
if...else...
的組合修赞。
7婶恼、循環(huán)
- JavaScript的循環(huán)有兩種,一種是for循環(huán)柏副,通過初始條件勾邦、結(jié)束條件和遞增條件來循環(huán)執(zhí)行語句塊。
- while循環(huán)只有一個判斷條件割择,條件滿足眷篇,就不斷循環(huán),條件不滿足時則退出循環(huán)锨推。
8铅歼、Map和Set
- JavaScript的默認對象表示方式
{}
可以視為其他語言中的Map
或Dictionary
的數(shù)據(jù)結(jié)構(gòu),即一組鍵值對换可。但是JavaScript的對象有個小問題,就是鍵必須是字符串厦幅。但實際上Number或者其他數(shù)據(jù)類型作為鍵也是非常合理的沾鳄。最新的ES6規(guī)范引入了新的數(shù)據(jù)類型Map。 - Map:
Map
是一組鍵值對的結(jié)構(gòu)确憨,具有極快的查找速度译荞。 - Set:
Set
和Map
類似,也是一組key
的集合休弃,但不存儲value吞歼。由于key
不能重復,所以塔猾,在Set
中篙骡,沒有重復的key
。
9丈甸、iterable
- 遍歷
Array
可以采用下標循環(huán)糯俗,遍歷Map
和Set
就無法使用下標。為了統(tǒng)一集合類型睦擂,ES6標準引入了新的iterable
類型得湘,Array
、Map
和Set
都屬于iterable
類型顿仇。 - 具有
iterable
類型的集合可以通過新的for ... of
循環(huán)來遍歷淘正。 -
for ... in
循環(huán)由于歷史遺留問題摆马,它遍歷的實際上是對象的屬性名稱。一個Array
數(shù)組實際上也是一個對象鸿吆,它的每個元素的索引被視為一個屬性囤采。 - 更好的方式是直接使用
iterable
內(nèi)置的forEach
方法,它接收一個函數(shù)伞剑,每次迭代就自動回調(diào)該函數(shù)斑唬。
二、函數(shù)
1黎泣、函數(shù)的定義和調(diào)用
1.定義函數(shù):
function abs(x)
{
if (x >= 0)
{
return x;
}
else
{
return -x;
}
}
- 調(diào)用函數(shù):JavaScript允許傳入任意個參數(shù)而不影響調(diào)用恕刘,因此傳入的參數(shù)比定義的參數(shù)多也沒有問題,雖然函數(shù)內(nèi)部并不需要這些參數(shù)抒倚。傳入的參數(shù)比定義的少也沒有問題褐着,要避免收到
undefined
,可以對參數(shù)進行檢查托呕。 - arguments:JavaScript還有一個免費贈送的關鍵字arguments含蓉,它只在函數(shù)內(nèi)部起作用,并且永遠指向當前函數(shù)的調(diào)用者傳入的所有參數(shù)项郊。利用
arguments
馅扣,你可以獲得調(diào)用者傳入的所有參數(shù)。實際上arguments
最常用于判斷傳入?yún)?shù)的個數(shù)着降。 - rest參數(shù):
function foo(a, b) {
var i, rest = [];
if (arguments.length > 2) {
for (i = 2; i<arguments.length; i++) {
rest.push(arguments[i]);
}
}
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
為了獲取除了已定義參數(shù)a
差油、b
之外的參數(shù),我們不得不用arguments
任洞,并且循環(huán)要從索引2開始以便排除前兩個參數(shù)蓄喇,這種寫法很別扭。ES6標準引入了rest
參數(shù)交掏,上面的函數(shù)可以改寫為:
function foo(a, b, ...rest) {
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
foo(1, 2, 3, 4, 5);
// 結(jié)果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]
foo(1);
// 結(jié)果:
// a = 1
// b = undefined
// Array []
rest參數(shù)只能寫在最后妆偏,前面用...
標識,從運行結(jié)果可知盅弛,傳入的參數(shù)先綁定a
钱骂、b
,多余的參數(shù)以數(shù)組形式交給變量rest
熊尉,所以罐柳,不再需要arguments
我們就獲取了全部參數(shù)。
2狰住、變量作用域與解構(gòu)賦值
- 在JavaScript中张吉,用var申明的變量實際上是有作用域的。如果一個變量在函數(shù)體內(nèi)部申明催植,則該變量的作用域為整個函數(shù)體肮蛹,在函數(shù)體外不可引用該變量勺择。
- 如果兩個不同的函數(shù)各自申明了同一個變量,那么該變量只在各自的函數(shù)體內(nèi)起作用伦忠。換句話說省核,不同函數(shù)內(nèi)部的同名變量互相獨立,互不影響昆码。
- 由于JavaScript的函數(shù)可以嵌套气忠,此時,內(nèi)部函數(shù)可以訪問外部函數(shù)定義的變量赋咽,反過來則不行旧噪。
- 變量提升:JavaScript的函數(shù)定義有個特點,它會先掃描整個函數(shù)體的語句脓匿,把所有申明的變量“提升”到函數(shù)頂部淘钟。
- 全局作用域:不在任何函數(shù)內(nèi)定義的變量就具有全局作用域。實際上陪毡,JavaScript默認有一個全局對象
window
米母,全局作用域的變量實際上被綁定到window
的一個屬性。 - 名字空間:全局變量會綁定到
window
上毡琉,不同的JavaScript文件如果使用了相同的全局變量铁瞒,或者定義了相同名字的頂層函數(shù),都會造成命名沖突桅滋,并且很難被發(fā)現(xiàn)精拟。減少沖突的一個方法是把自己的所有變量和函數(shù)全部綁定到一個全局變量中。 - 局部作用域:由于JavaScript的變量作用域?qū)嶋H上是函數(shù)內(nèi)部虱歪,我們在
for
循環(huán)等語句塊中是無法定義具有局部作用域的變量的。為了解決塊級作用域栅表,ES6引入了新的關鍵字let
笋鄙,用let
替代var
可以申明一個塊級作用域的變量。 - 常量:由于
var
和let
申明的是變量怪瓶,如果要申明一個常量萧落,在ES6之前是不行的,我們通常用全部大寫的變量來表示“這是一個常量洗贰,不要修改它的值”找岖。ES6標準引入了新的關鍵字const
來定義常量,const
與let
都具有塊級作用域敛滋。 - 解構(gòu)賦值:從ES6開始许布,JavaScript引入了解構(gòu)賦值,可以同時對一組變量進行賦值绎晃。
var array = ['hello', 'JavaScript', 'ES6'];
var x = array[0];
var y = array[1];
var z = array[2];
如果數(shù)組本身還有嵌套蜜唾,也可以通過下面的形式進行解構(gòu)賦值杂曲,注意嵌套層次和位置要保持一致。
let [x, [y, z]] = ['hello', ['JavaScript', 'ES6']];
x; // 'hello'
y; // 'JavaScript'
z; // 'ES6'
3袁余、方法
在一個對象中綁定函數(shù)擎勘,稱為這個對象的方法。在一個方法內(nèi)部颖榜,
this
是一個特殊變量棚饵,它始終指向當前對象,也就是xiaoming
這個變量。所以啥么,this.birth
可以拿到xiaoming
的birth
屬性贯莺。ECMA決定,在strict模式下讓函數(shù)的
this
指向undefined
怪与,因此,在strict模式下缅疟,你會得到一個錯誤分别。-
apply:要指定函數(shù)的
this
指向哪個對象,可以用函數(shù)本身的apply
方法存淫,它接收兩個參數(shù)耘斩,第一個參數(shù)就是需要綁定的this
變量,第二個參數(shù)是Array
桅咆,表示函數(shù)本身的參數(shù)括授。另一個與apply()
類似的方法是call()
,唯一區(qū)別是:-
apply()
把參數(shù)打包成Array再傳入岩饼; -
call()
把參數(shù)按順序傳入荚虚。
對普通函數(shù)調(diào)用,我們通常把this綁定為null籍茧。
-
裝飾器:JavaScript的所有對象都是動態(tài)的版述,即使內(nèi)置的函數(shù),我們也可以重新指向新的函數(shù)寞冯。
4渴析、高階函數(shù)
- JavaScript的函數(shù)其實都指向某個變量。既然變量可以指向函數(shù)吮龄,函數(shù)的參數(shù)能接收變量俭茧,那么一個函數(shù)就可以接收另一個函數(shù)作為參數(shù),這種函數(shù)就稱之為高階函數(shù)漓帚。
- map/reduce:由于
map()
方法定義在JavaScript的Array
中母债,我們調(diào)用Array
的map()
方法,傳入我們自己的函數(shù)胰默,就得到了一個新的Array
作為結(jié)果场斑。
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']
Array
的reduce()
把一個函數(shù)作用在這個Array
的[x1, x2, x3...]
上漓踢,這個函數(shù)必須接收兩個參數(shù),reduce()
把結(jié)果繼續(xù)和序列的下一個元素做累積計算漏隐。
- filter:filter也是一個常用的操作喧半,它用于把
Array
的某些元素過濾掉,然后返回剩下的元素青责。和map()
類似挺据,Array
的filter()
也接收一個函數(shù)。和map()
不同的是脖隶,filter()
把傳入的函數(shù)依次作用于每個元素扁耐,然后根據(jù)返回值是true
還是false
決定保留還是丟棄該元素。filter()
接收的回調(diào)函數(shù)产阱,其實可以有多個參數(shù)婉称。通常我們僅使用第一個參數(shù),表示Array
的某個元素构蹬⊥醢担回調(diào)函數(shù)還可以接收另外兩個參數(shù),表示元素的位置和數(shù)組本身庄敛。 - sort:
Array
的sort()
方法默認把所有元素先轉(zhuǎn)換為String再排序俗壹,結(jié)果'10'
排在了'2'
的前面,因為字符'1'
比字符'2'
的ASCII碼小藻烤。sort()
方法也是一個高階函數(shù)绷雏,它還可以接收一個比較函數(shù)來實現(xiàn)自定義的排序。
5怖亭、閉包
- 高階函數(shù)除了可以接受函數(shù)作為參數(shù)外涎显,還可以把函數(shù)作為結(jié)果值返回。
- 在函數(shù)
lazy_sum
中又定義了函數(shù)sum
兴猩,并且棺禾,內(nèi)部函數(shù)sum
可以引用外部函數(shù)lazy_sum
的參數(shù)和局部變量,當lazy_sum
返回函數(shù)sum
時峭跳,相關參數(shù)和變量都保存在返回的函數(shù)中,這種稱為“閉包(Closure)”的程序結(jié)構(gòu)擁有極大的威力缺前。 - 注意到返回的函數(shù)在其定義內(nèi)部引用了局部變量
arr
蛀醉,所以,當一個函數(shù)返回了一個函數(shù)后衅码,其內(nèi)部的局部變量還被新函數(shù)引用拯刁,所以,閉包用起來簡單逝段,實現(xiàn)起來可不容易垛玻。返回閉包時牢記的一點就是:返回函數(shù)不要引用任何循環(huán)變量割捅,或者后續(xù)會發(fā)生變化的變量。 - 在返回的對象中帚桩,實現(xiàn)了一個閉包亿驾,該閉包攜帶了局部變量
x
,并且账嚎,從外部代碼根本無法訪問到變量x
莫瞬。換句話說,閉包就是攜帶狀態(tài)的函數(shù)郭蕉,并且它的狀態(tài)可以完全對外隱藏起來疼邀。
6、箭頭函數(shù)
var fn = x => x * x;
- 箭頭函數(shù)相當于匿名函數(shù)召锈,并且簡化了函數(shù)定義旁振。箭頭函數(shù)有兩種格式,一種像上面的涨岁,只包含一個表達式拐袜,連
{ ... }
和return
都省略掉了。還有一種可以包含多條語句卵惦,這時候就不能省略{ ... }
和return
阻肿。 - 如果參數(shù)不是一個,就需要用括號
()
括起來沮尿。 - 箭頭函數(shù)看上去是匿名函數(shù)的一種簡寫丛塌,但實際上,箭頭函數(shù)和匿名函數(shù)有個明顯的區(qū)別:箭頭函數(shù)內(nèi)部的
this
是詞法作用域畜疾,由上下文確定赴邻。
7、generator
generator(生成器)是ES6標準引入的新的數(shù)據(jù)類型啡捶。一個generator看上去像一個函數(shù)姥敛,但可以返回多次。
-
generator和函數(shù)不同的是瞎暑,generator由
function*
定義(注意多出的*號)彤敛,并且,除了return語句了赌,還可以用yield返回多次墨榄。function* fib(max) { var t, a = 0, b = 1, n = 0; while (n < max) { yield a; [a, b] = [b, a + b]; n ++; } return; }
直接調(diào)用一個generator和調(diào)用函數(shù)不一樣,
fib(5)
僅僅是創(chuàng)建了一個generator對象勿她,還沒有去執(zhí)行它袄秩。調(diào)用generator對象有兩個方法,一是不斷地調(diào)用generator對象的
next()
方法。next()
方法會執(zhí)行generator的代碼之剧,然后郭卫,每次遇到yield x
;就返回一個對象{value: x, done: true/false}
,然后“暫捅臣冢”贰军。返回的value
就是yield
的返回值,done
表示這個generator是否已經(jīng)執(zhí)行結(jié)束了雇庙。第二個方法是直接用
for ... of
循環(huán)迭代generator對象谓形,這種方式不需要我們自己判斷done
。
三疆前、標準對象
- 為了區(qū)分對象的類型寒跳,我們用
typeof
操作符獲取對象的類型,它總是返回一個字符串竹椒。 - 特別注意
null
的類型是object
童太,Array
的類型也是object
,如果我們用typeof
將無法區(qū)分出null
胸完、Array
和通常意義上的object——{}
书释。 - 包裝對象:
number
、boolean
和string
都有包裝對象赊窥。沒錯爆惧,在JavaScript中,字符串也區(qū)分string
類型和它的包裝類型锨能。包裝對象用new
創(chuàng)建扯再。 - 雖然包裝對象看上去和原來的值一模一樣,顯示出來也是一模一樣址遇,但他們的類型已經(jīng)變?yōu)?code>object了熄阻。
-
typeof
操作符可以判斷出number
、boolean
倔约、string
秃殉、function
和undefined
;判斷Array
要使用Array.isArray(arr)
浸剩;判斷null
請使用myVar === null
钾军。 - 判斷某個全局變量是否存在用
typeof window.myVar === 'undefined'
;函數(shù)內(nèi)部判斷某個變量是否存在用typeof myVar === 'undefined'
绢要。
1巧颈、Date
- 在JavaScript中,
Date
對象用來表示日期和時間袖扛。
2、RegExp
- 正則表達式是一種用來匹配字符串的強有力的武器。它的設計思想是用一種描述性的語言來給字符串定義一個規(guī)則蛆封,凡是符合規(guī)則的字符串唇礁,我們就認為它“匹配”了,否則惨篱,該字符串就是不合法的盏筐。
- 要匹配變長的字符,在正則表達式中砸讳,用
*
表示任意個字符(包括0個)琢融,用+
表示至少一個字符,用?
表示0個或1個字符簿寂,用{n}
表示n個字符漾抬,用{n,m}
表示n-m個字符。 - 如果要匹配
'010-12345'
這樣的號碼呢常遂?由于'-'
是特殊字符纳令,在正則表達式中,要用'\'
轉(zhuǎn)義克胳,所以平绩,上面的正則是\d{3}\-\d{3,8}
。漠另、 - RegExp對象的
test()
方法用于測試給定的字符串是否符合條件捏雌。 - 分組:除了簡單地判斷是否匹配之外,正則表達式還有提取子串的強大功能笆搓。用
()
表示的就是要提取的分組(Group)性湿。如果正則表達式中定義了組,就可以在RegExp對象上用exec()
方法提取出子串來砚作。 - 貪婪匹配:正則匹配默認是貪婪匹配窘奏,也就是匹配盡可能多的字符。
- 全局搜索:JavaScript的正則表達式還有幾個特殊的標志葫录,最常用的是
g
着裹,表示全局匹配。全局匹配可以多次執(zhí)行exec()
方法來搜索一個匹配的字符串米同。當我們指定g
標志后骇扇,每次運行exec()
,正則表達式本身會更新lastIndex
屬性面粮,表示上次匹配到的最后索引少孝。
3、JSON
- JSON是JavaScript Object Notation的縮寫熬苍,它是一種數(shù)據(jù)交換格式稍走。
- JSON還定死了字符集必須是UTF-8袁翁,表示多語言就沒有問題了。為了統(tǒng)一解析婿脸,JSON的字符串規(guī)定必須用雙引號
""
粱胜,Object的鍵也必須用雙引號""
。 - 反序列化:拿到一個JSON格式的字符串狐树,我們直接用
JSON.parse()
把它變成一個JavaScript對象焙压。
學習參考:https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000