JavaScript學習筆記(一)

作者:cedar(http://www.reibang.com/writer#/notebooks/28559629/notes/32531540

一砂碉、基礎知識

  1. JavaScript代碼可以直接嵌在網(wǎng)頁的任何地方耐薯,不過通常我們都把JavaScript代碼放到<head>中逛漫。
    <script>...</script>包含的代碼就是JavaScript代碼原茅,它將直接被瀏覽器執(zhí)行澈蟆。
  2. 第二種方法是把JavaScript代碼放到一個單獨的.js文件翔忽,然后在HTML中通過<script src="..."></script>引入這個文件
    把JavaScript代碼放入一個單獨的.js文件中更利于維護代碼雾家,并且多個頁面可以各自引用同一份.js文件铃彰。
    可以在同一個頁面中引入多個.js文件,還可以在頁面中多次編寫<script> js代碼... </script>芯咧,瀏覽器按照順序依次執(zhí)行牙捉。
  3. 編寫JavaScript:Visual Studio Code,Sublime Text敬飒,Notepad++邪铲。
  4. 運行JavaScript:要讓瀏覽器運行JavaScript,必須先有一個HTML頁面无拗,在HTML頁面中引入JavaScript带到,然后,讓瀏覽器加載該HTML頁面英染,就可以執(zhí)行JavaScript代碼揽惹。
  5. 調(diào)試JavaScript:需要安裝Google Chrome瀏覽器,Chrome瀏覽器對開發(fā)者非常友好四康,可以讓你方便地調(diào)試JavaScript代碼搪搏。打開瀏覽器中開發(fā)者工具,點擊控制臺(Console)闪金,可以在這個面板里直接輸入Javascript代碼疯溺,按回車執(zhí)行。

1哎垦、基本語法

  1. JavaScript的語法和Java語言類似囱嫩,每個語句以;結(jié)束,語句塊用{...}漏设。但是墨闲,JavaScript并不強制要求在每個語句的結(jié)尾加;,瀏覽器中負責執(zhí)行JavaScript代碼的引擎會自動在每個語句的結(jié)尾補上;愿题。
  2. 注意花括號{...}內(nèi)的語句具有縮進损俭,通常是4個空格∨诵铮縮進不是JavaScript語法要求必須的杆兵,但縮進有助于我們理解代碼的層次,所以編寫代碼時要遵守縮進規(guī)則仔夺。
  3. JavaScript本身對嵌套的層級沒有限制琐脏,但是過多的嵌套無疑會大大增加看懂代碼的難度。遇到這種情況,需要把部分代碼抽出來日裙,作為函數(shù)來調(diào)用吹艇,這樣可以減少代碼的復雜度。
  4. 注釋:以//開頭直到行末的字符被視為行注釋昂拂;另一種塊注釋是用/*...*/把多行字符包裹起來受神,把一大“塊”視為一個注釋
  5. 大小寫:JavaScript嚴格區(qū)分大小寫,如果弄錯了大小寫格侯,程序?qū)箦e或者運行不正常鼻听。

2、數(shù)據(jù)類型和變量

  1. Number:JavaScript不區(qū)分整數(shù)和浮點數(shù)联四,統(tǒng)一用Number表示撑碴。
  2. 字符串:字符串是以單引號'或雙引號"括起來的任意文本。
  3. 布爾值:布爾值和布爾代數(shù)的表示完全一致朝墩。
  4. 比較運算符:JavaScript允許對任意數(shù)據(jù)類型作比較醉拓。
    • ==比較,它會自動轉(zhuǎn)換數(shù)據(jù)類型再比較收苏,很多時候亿卤,會得到非常詭異的結(jié)果;
    • ===比較倒戏,它不會自動轉(zhuǎn)換數(shù)據(jù)類型怠噪,如果數(shù)據(jù)類型不一致,返回false杜跷,如果一致傍念,再比較。
    • NaN這個特殊的Number與所有其他值都不相等葛闷,包括它自己憋槐。
  5. null和undefined:null表示一個"空"的值。undefined表示值未定義淑趾。
  6. 數(shù)組:數(shù)組是一組按順序排列的集合阳仔,集合的每個值稱為元素。JavaScript的數(shù)組可以包括任意數(shù)據(jù)類型扣泊。另一種創(chuàng)建數(shù)組的方法是通過Array()函數(shù)實現(xiàn)近范。
  7. 對象:JavaScript的對象是一組由鍵-值組成的無序集合。JavaScript對象的鍵都是字符串類型延蟹,值可以是任意數(shù)據(jù)類型评矩。
  8. 變量:變量在JavaScript中就是用一個變量名表示,變量名是大小寫英文阱飘、數(shù)字斥杜、$和_的組合虱颗,且不能用數(shù)字開頭。變量名也不能是JavaScript的關鍵字蔗喂,如if忘渔、while等。申明一個變量用var語句缰儿。要顯示變量的內(nèi)容畦粮,可以用console.log(x),打開Chrome的控制臺就可以看到結(jié)果返弹。
  9. strict模式:使用var申明的變量則不是全局變量锈玉,它的范圍被限制在該變量被申明的函數(shù)體內(nèi),同名變量在不同的函數(shù)體內(nèi)互不沖突义起。ECMA在后續(xù)規(guī)范中推出了strict模式,在strict模式下運行的JavaScript代碼师崎,強制通過var申明變量默终,未使用var申明變量就使用的,將導致運行錯誤犁罩。啟用strict模式的方法是在JavaScript代碼的第一行寫上:'use strict';齐蔽。

3、字符串

  1. 如果字符串內(nèi)部既包含'又包含"怎么辦床估?可以用轉(zhuǎn)義字符\來標識含滴。
  2. 多行字符串:最新的ES6標準新增了一種多行字符串的表示方法,用反引號`...` 表示丐巫。
  3. 模板字符串:ES6新增了一種模板字符串谈况,表示方法和上面的多行字符串一樣,但是它會自動替換字符串中的變量递胧。
var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}歲了!`;
alert(message);
  1. 操作字符串:要獲取字符串某個指定位置的字符碑韵,使用類似Array的下標操作,索引號從0開始缎脾。需要特別注意的是祝闻,字符串是不可變的,如果對字符串的某個索引賦值遗菠,不會有任何錯誤联喘,但是,也沒有任何效果辙纬。
    • toUpperCase()把一個字符串全部變?yōu)榇髮?/li>
    • toLowerCase()把一個字符串全部變?yōu)樾?/li>
    • indexOf()會搜索指定字符串出現(xiàn)的位置
    • substring()返回指定索引區(qū)間的子串

4豁遭、數(shù)組

  1. JavaScript的Array可以包含任意數(shù)據(jù)類型,并通過索引來訪問每個元素牲平。
  2. 直接給Arraylength賦一個新的值會導致Array大小的變化堤框。
  3. 如果通過索引賦值時,索引超過了范圍,同樣會引起Array大小的變化蜈抓。
  4. indexOf:與String類似启绰,Array也可以通過indexOf()來搜索一個指定的元素的位置。
  5. slice:slice()就是對應String的substring()版本沟使,它截取Array的部分元素委可,然后返回一個新的Array
  6. push和pop:push()Array的末尾添加若干元素腊嗡,pop()則把Array的最后一個元素刪除掉着倾。
  7. unshift和shift:如果要往Array的頭部添加若干元素,使用unshift()方法燕少,shift()方法則把Array的第一個元素刪掉卡者。
  8. sort:sort()可以對當前Array進行排序,它會直接修改當前Array的元素位置客们,直接調(diào)用時崇决,按照默認順序排序。
  9. reverse:反轉(zhuǎn)底挫。
  10. splice:splice()方法是修改Array的“萬能方法”恒傻,它可以從指定的索引開始刪除若干元素,然后再從該位置添加若干元素建邓。
  11. concat:數(shù)組連接起來盈厘。concat()方法并沒有修改當前Array,而是返回了一個新的Array官边。
  12. join:join()把當前Array的每個元素都用指定的字符串連接起來沸手,然后返回連接后的字符串。
  13. 多維數(shù)組:如果數(shù)組的某個元素又是一個Array拒逮,則可以形成多維數(shù)組罐氨。

5、對象

  1. JavaScript的對象是一種無序的集合數(shù)據(jù)類型滩援,它由若干鍵值對組成栅隐。
  2. JavaScript規(guī)定,訪問不存在的屬性不報錯玩徊,而是返回undefined租悄。
  3. 由于JavaScript的對象是動態(tài)類型,你可以自由地給一個對象添加或刪除屬性恩袱。
  4. 如果我們要檢測xiaoming是否擁有某一屬性泣棋,可以用in操作符。不過要小心畔塔,如果in判斷一個屬性存在潭辈,這個屬性不一定是xiaoming的鸯屿,它可能是xiaoming繼承得到的。

6把敢、條件判斷

  1. JavaScript使用if () { ... } else { ... }來進行條件判斷寄摆。
  2. 多行條件判斷:如果還要更細致地判斷條件,可以使用多個if...else...的組合修赞。

7婶恼、循環(huán)

  1. JavaScript的循環(huán)有兩種,一種是for循環(huán)柏副,通過初始條件勾邦、結(jié)束條件和遞增條件來循環(huán)執(zhí)行語句塊。
  2. while循環(huán)只有一個判斷條件割择,條件滿足眷篇,就不斷循環(huán),條件不滿足時則退出循環(huán)锨推。

8铅歼、Map和Set

  1. JavaScript的默認對象表示方式{}可以視為其他語言中的MapDictionary的數(shù)據(jù)結(jié)構(gòu),即一組鍵值對换可。但是JavaScript的對象有個小問題,就是鍵必須是字符串厦幅。但實際上Number或者其他數(shù)據(jù)類型作為鍵也是非常合理的沾鳄。最新的ES6規(guī)范引入了新的數(shù)據(jù)類型Map。
  2. Map:Map是一組鍵值對的結(jié)構(gòu)确憨,具有極快的查找速度译荞。
  3. Set:SetMap類似,也是一組key的集合休弃,但不存儲value吞歼。由于key不能重復,所以塔猾,在Set中篙骡,沒有重復的key

9丈甸、iterable

  1. 遍歷Array可以采用下標循環(huán)糯俗,遍歷MapSet就無法使用下標。為了統(tǒng)一集合類型睦擂,ES6標準引入了新的iterable類型得湘,ArrayMapSet都屬于iterable類型顿仇。
  2. 具有iterable類型的集合可以通過新的for ... of循環(huán)來遍歷淘正。
  3. for ... in循環(huán)由于歷史遺留問題摆马,它遍歷的實際上是對象的屬性名稱。一個Array數(shù)組實際上也是一個對象鸿吆,它的每個元素的索引被視為一個屬性囤采。
  4. 更好的方式是直接使用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;
    }
  }
  1. 調(diào)用函數(shù):JavaScript允許傳入任意個參數(shù)而不影響調(diào)用恕刘,因此傳入的參數(shù)比定義的參數(shù)多也沒有問題,雖然函數(shù)內(nèi)部并不需要這些參數(shù)抒倚。傳入的參數(shù)比定義的少也沒有問題褐着,要避免收到undefined,可以對參數(shù)進行檢查托呕。
  2. arguments:JavaScript還有一個免費贈送的關鍵字arguments含蓉,它只在函數(shù)內(nèi)部起作用,并且永遠指向當前函數(shù)的調(diào)用者傳入的所有參數(shù)项郊。利用arguments馅扣,你可以獲得調(diào)用者傳入的所有參數(shù)。實際上arguments最常用于判斷傳入?yún)?shù)的個數(shù)着降。
  3. 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)賦值

  1. 在JavaScript中张吉,用var申明的變量實際上是有作用域的。如果一個變量在函數(shù)體內(nèi)部申明催植,則該變量的作用域為整個函數(shù)體肮蛹,在函數(shù)體外不可引用該變量勺择。
  2. 如果兩個不同的函數(shù)各自申明了同一個變量,那么該變量只在各自的函數(shù)體內(nèi)起作用伦忠。換句話說省核,不同函數(shù)內(nèi)部的同名變量互相獨立,互不影響昆码。
  3. 由于JavaScript的函數(shù)可以嵌套气忠,此時,內(nèi)部函數(shù)可以訪問外部函數(shù)定義的變量赋咽,反過來則不行旧噪。
  4. 變量提升:JavaScript的函數(shù)定義有個特點,它會先掃描整個函數(shù)體的語句脓匿,把所有申明的變量“提升”到函數(shù)頂部淘钟。
  5. 全局作用域:不在任何函數(shù)內(nèi)定義的變量就具有全局作用域。實際上陪毡,JavaScript默認有一個全局對象window米母,全局作用域的變量實際上被綁定到window的一個屬性。
  6. 名字空間:全局變量會綁定到window上毡琉,不同的JavaScript文件如果使用了相同的全局變量铁瞒,或者定義了相同名字的頂層函數(shù),都會造成命名沖突桅滋,并且很難被發(fā)現(xiàn)精拟。減少沖突的一個方法是把自己的所有變量和函數(shù)全部綁定到一個全局變量中。
  7. 局部作用域:由于JavaScript的變量作用域?qū)嶋H上是函數(shù)內(nèi)部虱歪,我們在for循環(huán)等語句塊中是無法定義具有局部作用域的變量的。為了解決塊級作用域栅表,ES6引入了新的關鍵字let笋鄙,用let替代var可以申明一個塊級作用域的變量。
  8. 常量:由于varlet申明的是變量怪瓶,如果要申明一個常量萧落,在ES6之前是不行的,我們通常用全部大寫的變量來表示“這是一個常量洗贰,不要修改它的值”找岖。ES6標準引入了新的關鍵字const來定義常量,constlet都具有塊級作用域敛滋。
  9. 解構(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袁余、方法

  1. 在一個對象中綁定函數(shù)擎勘,稱為這個對象的方法。在一個方法內(nèi)部颖榜,this是一個特殊變量棚饵,它始終指向當前對象,也就是xiaoming這個變量。所以啥么,this.birth可以拿到xiaomingbirth屬性贯莺。

  2. ECMA決定,在strict模式下讓函數(shù)的this指向undefined怪与,因此,在strict模式下缅疟,你會得到一個錯誤分别。

  3. 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籍茧。

  4. 裝飾器:JavaScript的所有對象都是動態(tài)的版述,即使內(nèi)置的函數(shù),我們也可以重新指向新的函數(shù)寞冯。

4渴析、高階函數(shù)

  1. JavaScript的函數(shù)其實都指向某個變量。既然變量可以指向函數(shù)吮龄,函數(shù)的參數(shù)能接收變量俭茧,那么一個函數(shù)就可以接收另一個函數(shù)作為參數(shù),這種函數(shù)就稱之為高階函數(shù)漓帚。
  2. map/reduce:由于map()方法定義在JavaScript的Array中母债,我們調(diào)用Arraymap()方法,傳入我們自己的函數(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']

Arrayreduce()把一個函數(shù)作用在這個Array[x1, x2, x3...]上漓踢,這個函數(shù)必須接收兩個參數(shù),reduce()把結(jié)果繼續(xù)和序列的下一個元素做累積計算漏隐。

  1. filter:filter也是一個常用的操作喧半,它用于把Array的某些元素過濾掉,然后返回剩下的元素青责。和map()類似挺据,Arrayfilter()也接收一個函數(shù)。和map()不同的是脖隶,filter()把傳入的函數(shù)依次作用于每個元素扁耐,然后根據(jù)返回值是true還是false決定保留還是丟棄該元素。filter()接收的回調(diào)函數(shù)产阱,其實可以有多個參數(shù)婉称。通常我們僅使用第一個參數(shù),表示Array的某個元素构蹬⊥醢担回調(diào)函數(shù)還可以接收另外兩個參數(shù),表示元素的位置和數(shù)組本身庄敛。
  2. sort:Arraysort()方法默認把所有元素先轉(zhuǎn)換為String再排序俗壹,結(jié)果'10'排在了'2'的前面,因為字符'1'比字符'2'的ASCII碼小藻烤。sort()方法也是一個高階函數(shù)绷雏,它還可以接收一個比較函數(shù)來實現(xiàn)自定義的排序。

5怖亭、閉包

  1. 高階函數(shù)除了可以接受函數(shù)作為參數(shù)外涎显,還可以把函數(shù)作為結(jié)果值返回。
  2. 在函數(shù)lazy_sum中又定義了函數(shù)sum兴猩,并且棺禾,內(nèi)部函數(shù)sum可以引用外部函數(shù)lazy_sum的參數(shù)和局部變量,當lazy_sum返回函數(shù)sum時峭跳,相關參數(shù)和變量都保存在返回的函數(shù)中,這種稱為“閉包(Closure)”的程序結(jié)構(gòu)擁有極大的威力缺前。
  3. 注意到返回的函數(shù)在其定義內(nèi)部引用了局部變量arr蛀醉,所以,當一個函數(shù)返回了一個函數(shù)后衅码,其內(nèi)部的局部變量還被新函數(shù)引用拯刁,所以,閉包用起來簡單逝段,實現(xiàn)起來可不容易垛玻。返回閉包時牢記的一點就是:返回函數(shù)不要引用任何循環(huán)變量割捅,或者后續(xù)會發(fā)生變化的變量。
  4. 在返回的對象中帚桩,實現(xiàn)了一個閉包亿驾,該閉包攜帶了局部變量x,并且账嚎,從外部代碼根本無法訪問到變量x莫瞬。換句話說,閉包就是攜帶狀態(tài)的函數(shù)郭蕉,并且它的狀態(tài)可以完全對外隱藏起來疼邀。

6、箭頭函數(shù)

var fn = x => x * x;
  1. 箭頭函數(shù)相當于匿名函數(shù)召锈,并且簡化了函數(shù)定義旁振。箭頭函數(shù)有兩種格式,一種像上面的涨岁,只包含一個表達式拐袜,連{ ... }return都省略掉了。還有一種可以包含多條語句卵惦,這時候就不能省略{ ... }return阻肿。
  2. 如果參數(shù)不是一個,就需要用括號()括起來沮尿。
  3. 箭頭函數(shù)看上去是匿名函數(shù)的一種簡寫丛塌,但實際上,箭頭函數(shù)和匿名函數(shù)有個明顯的區(qū)別:箭頭函數(shù)內(nèi)部的this是詞法作用域畜疾,由上下文確定赴邻。

7、generator

  1. generator(生成器)是ES6標準引入的新的數(shù)據(jù)類型啡捶。一個generator看上去像一個函數(shù)姥敛,但可以返回多次。

  2. 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;
    }
    
  3. 直接調(diào)用一個generator和調(diào)用函數(shù)不一樣,fib(5)僅僅是創(chuàng)建了一個generator對象勿她,還沒有去執(zhí)行它袄秩。

  4. 調(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é)束了雇庙。

  5. 第二個方法是直接用for ... of循環(huán)迭代generator對象谓形,這種方式不需要我們自己判斷done

三疆前、標準對象

  1. 為了區(qū)分對象的類型寒跳,我們用typeof操作符獲取對象的類型,它總是返回一個字符串竹椒。
  2. 特別注意null的類型是object童太,Array的類型也是object,如果我們用typeof將無法區(qū)分出null胸完、Array和通常意義上的object——{}书释。
  3. 包裝對象:numberbooleanstring都有包裝對象赊窥。沒錯爆惧,在JavaScript中,字符串也區(qū)分string類型和它的包裝類型锨能。包裝對象用new創(chuàng)建扯再。
  4. 雖然包裝對象看上去和原來的值一模一樣,顯示出來也是一模一樣址遇,但他們的類型已經(jīng)變?yōu)?code>object了熄阻。
  5. typeof操作符可以判斷出numberboolean倔约、string秃殉、functionundefined;判斷Array要使用Array.isArray(arr)浸剩;判斷null請使用myVar === null钾军。
  6. 判斷某個全局變量是否存在用typeof window.myVar === 'undefined';函數(shù)內(nèi)部判斷某個變量是否存在用typeof myVar === 'undefined'绢要。

1巧颈、Date

  1. 在JavaScript中,Date對象用來表示日期和時間袖扛。

2、RegExp

  1. 正則表達式是一種用來匹配字符串的強有力的武器。它的設計思想是用一種描述性的語言來給字符串定義一個規(guī)則蛆封,凡是符合規(guī)則的字符串唇礁,我們就認為它“匹配”了,否則惨篱,該字符串就是不合法的盏筐。
  2. 要匹配變長的字符,在正則表達式中砸讳,用*表示任意個字符(包括0個)琢融,用+表示至少一個字符,用?表示0個或1個字符簿寂,用{n}表示n個字符漾抬,用{n,m}表示n-m個字符。
  3. 如果要匹配'010-12345'這樣的號碼呢常遂?由于'-'是特殊字符纳令,在正則表達式中,要用'\'轉(zhuǎn)義克胳,所以平绩,上面的正則是\d{3}\-\d{3,8}。漠另、
  4. RegExp對象的test()方法用于測試給定的字符串是否符合條件捏雌。
  5. 分組:除了簡單地判斷是否匹配之外,正則表達式還有提取子串的強大功能笆搓。用()表示的就是要提取的分組(Group)性湿。如果正則表達式中定義了組,就可以在RegExp對象上用exec()方法提取出子串來砚作。
  6. 貪婪匹配:正則匹配默認是貪婪匹配窘奏,也就是匹配盡可能多的字符。
  7. 全局搜索:JavaScript的正則表達式還有幾個特殊的標志葫录,最常用的是g着裹,表示全局匹配。全局匹配可以多次執(zhí)行exec()方法來搜索一個匹配的字符串米同。當我們指定g標志后骇扇,每次運行exec(),正則表達式本身會更新lastIndex屬性面粮,表示上次匹配到的最后索引少孝。

3、JSON

  1. JSON是JavaScript Object Notation的縮寫熬苍,它是一種數(shù)據(jù)交換格式稍走。
  2. JSON還定死了字符集必須是UTF-8袁翁,表示多語言就沒有問題了。為了統(tǒng)一解析婿脸,JSON的字符串規(guī)定必須用雙引號""粱胜,Object的鍵也必須用雙引號""
  3. 反序列化:拿到一個JSON格式的字符串狐树,我們直接用JSON.parse()把它變成一個JavaScript對象焙压。

學習參考:https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抑钟,隨后出現(xiàn)的幾起案子涯曲,更是在濱河造成了極大的恐慌,老刑警劉巖在塔,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幻件,死亡現(xiàn)場離奇詭異,居然都是意外死亡心俗,警方通過查閱死者的電腦和手機傲武,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來城榛,“玉大人揪利,你說我怎么就攤上這事『莩郑” “怎么了疟位?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喘垂。 經(jīng)常有香客問我甜刻,道長,這世上最難降的妖魔是什么正勒? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任得院,我火速辦了婚禮,結(jié)果婚禮上章贞,老公的妹妹穿的比我還像新娘祥绞。我一直安慰自己,他們只是感情好鸭限,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布蜕径。 她就那樣靜靜地躺著,像睡著了一般败京。 火紅的嫁衣襯著肌膚如雪兜喻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天赡麦,我揣著相機與錄音朴皆,去河邊找鬼帕识。 笑死,一個胖子當著我的面吹牛遂铡,可吹牛的內(nèi)容都是我干的渡冻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼忧便,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帽借?” 一聲冷哼從身側(cè)響起珠增,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砍艾,沒想到半個月后蒂教,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡脆荷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年凝垛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜓谋。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡梦皮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桃焕,到底是詐尸還是另有隱情剑肯,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布观堂,位于F島的核電站让网,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏师痕。R本人自食惡果不足惜溃睹,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胰坟。 院中可真熱鬧因篇,春花似錦、人聲如沸腕铸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狠裹。三九已至虽界,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涛菠,已是汗流浹背莉御。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工撇吞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人礁叔。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓牍颈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親琅关。 傳聞我的和親對象是個殘疾皇子煮岁,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容