JavaScript基礎

1. 本文是在學習廖雪峰先生的JavaScrip教程 后的歸納
2. 本文是第一次采用markdown進行書寫

  1. JavaScript簡介
    • 網(wǎng)景公司 Brendan Eich 10天內(nèi)設計出了JavaSrcipt
    • JavaScript 和 Java沒有任何關系缠犀,當時数苫,借Java名聲而已
    • ECMAScript是一個語言標準
    • 最新版ECMAScript 6標準發(fā)布于2015年6月
    • 核心語法為沒有多大變化,ES6增加部分新特性
  2. JavaScript的引用和調(diào)試
    • 引用
      • 常嵌入<head>里,在Html文件中直接寫<script>...</script>
      • JavaScript放入一個單獨的.js文件,然后在HTML中通過<script src="..."></script>
    • 調(diào)試
      • Chrome F12 Chrome自帶調(diào)試工具辨液,不錯的調(diào)試工具
      • FireBug FireFox 強大的調(diào)試插件虐急,有點卡
    • 開發(fā)工具
      • 文本工具: Sublime Text, NotePad++,Vim等
      • IDE: WebStorm,Eclipse
  3. 基本語法
    • 每個語句以;結(jié)尾,語句塊以{..}滔迈,另;可以省略但不建議省略
    • "Hello World!" 這樣寫仍然可以視為一個完整語句
    • var x=1; var y=2; 不建議一行多語句
    • {...}可以嵌套,大括號內(nèi)語句具有縮進,通常為4個空格止吁,有助于理解代碼層次
    • 單號注釋 // 塊注釋 /**/
    • JavaScript 嚴格區(qū)分大小寫
  4. 數(shù)據(jù)類型、運算符燎悍、變量
    • Number類型
      • JavaScript不區(qū)分整數(shù)和浮點數(shù)
        123; 整數(shù) 0.456;小數(shù) 1.234e3;科學計數(shù)法 -99; 負數(shù) NaN; 不是Number Infinity; 無限大
      • 運算符: +敬惦、-、*谈山、/俄删、% (求余)
    • 字符串
      • ''"" 表示字符串
    • 布爾值
      • true false
      • 用表達式表示布爾值,如1>2
      • && || !
    • 比較運算符
      • 常見運算符: >、>=奏路、==畴椰、<=
      • JavaScript 允許對任意數(shù)據(jù)類型進行比較
      • 兩種相等運算符:
        使用==時,會自動轉(zhuǎn)換數(shù)據(jù)類型再比較
        使用===時鸽粉,它不會自動轉(zhuǎn)換數(shù)據(jù)類型斜脂,如果數(shù)據(jù)類型不一致,返回false潜叛,如果一致秽褒,再比較。
      • 由于JavaScript這設計形式,建議使用===比較
      • 特例:NaN 與所有其他值都不相等威兜,包括他自己:即NaN===NaN;(false)
      • 唯一判斷NaN的方法是通過isNaN()函數(shù) isNaN(NaN)
      • 浮點數(shù)比較,由于浮點數(shù)在運算過程中會產(chǎn)生誤差,計算機無法精確表示無限循環(huán)小數(shù),要比較兩個浮點數(shù)是否相等,只能計算它們之差的絕對值销斟,看是否小于某個閾值,如Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
    • null 和 undefined
      • null 表示一個的值,它和0以及空字符串''不同椒舵,0是一個數(shù)值蚂踊,''表示長度為0的字符串,而null表示“空”笔宿。與Java等語言的null值類似
      • JavaScript的設計者希望用null表示一個空的值犁钟,而undefined表示值未定義棱诱。大多數(shù)情況下,應該使用null
      • 詳細區(qū)別可以參照:阮一峰 undefined與null的區(qū)別
    • 數(shù)組
      • 數(shù)組是一組按順序排列的集合涝动,集合的每個值稱為元素迈勋。JavaScript的數(shù)組可以包括任意數(shù)據(jù)類型。
      • 數(shù)組用[]表示醋粟,元素之間用,分隔靡菇。
      • 創(chuàng)建數(shù)組的方法: 通過Array()函數(shù)實現(xiàn)或直接使用
      • 數(shù)組的元素可以通過索引來訪問,索引起始值為0
    • 對象
      • JavaScript的對象是一組由key-value組成的無序集合,例如:
        var person = { name: 'Bob', age: 20, tags: ['js', 'web', 'mobile'], city: 'Beijing', zipcode: null };
      • JavaScript對象的鍵都是字符串類型米愿,值可以是任意數(shù)據(jù)類型厦凤。
      • 通過對象變量.屬性名獲取對象的值
    • 變量
      • 變量名: a-z,A-Z,0-9,$,_來組成,且數(shù)字不能開頭
      • 變量名:不能是JavaScript的關鍵字
      • 變量名可以是中文育苟,但盡量不要這樣做
      • = 為變量賦值
      • 可以把任意數(shù)據(jù)類型賦值給變量较鼓,同一個變量可以反復賦值,而且可以是不同類型的變量违柏,但是要注意只能用var申明一次
      • 變量本身類型不固定的語言稱之為動態(tài)語言博烂,與之對應的是靜態(tài)語言。靜態(tài)語言在定義變量時必須指定變量類型勇垛,如果賦值的時候類型不匹配脖母,就會報錯士鸥。Java即為靜態(tài)語言闲孤。動態(tài)語言更靈活即基于此
      • 把賦值語句的等號等同于數(shù)學的等號
    • strict模式
      • 引入strict 模式的原因: 如果一個變量沒有通過var申明就被使用,那么該變量就自動被申明為全局變量
      • 使用var聲明的變量烤礁,則被限制在聲明變量的函數(shù)體內(nèi)
      • 后續(xù)的ECMAScript標準推出了strict模式讼积,即強制通過var聲明變量,為聲明則報錯
      • 啟用strict模式脚仔,在javascript的第一行加入'use strict';
      • 建議采用strict模式
  5. 字符串
    • 字符串表示形式
      • 采用''""表示字符串
      • 轉(zhuǎn)義字符:\ 例如:'I\'m OK!',\n,\t,\\
      • ASCII字符可以用\x##形式表示,如\x41 //等同于'A'
      • \u####表示一個Unicode字符
      • 多行字符串用...表示,如
        `這是一個
        多行字
        符串`
    • 常用字符串操作
      var s ="Hello, World!"; s.length;//13
      • length 獲取字符串的長度
      • 字符串可以通過指定的下標來獲取相關的字符值,如s[n] 例如:s[0];//'H'
      • 字符串是固定的勤众,不可通過某個索引賦值,雖不會有錯,但不會改變值
      • JavaScript為字符串提供了很多方法,調(diào)用這些方法不會改變原有的字符串的值鲤脏,而是生成一個新字符串
      • toUpperCase() 字符串變成大寫
      • toLowerCase() 字符串變成小寫
      • indexOf() 返回第一個指定字符串的所在的索引值,沒有返回-1
      • substring() 返回指定的索引區(qū)間的子串
      • 字符串方法匯總
方法 說明
charAt() 返回指定索引位置的字符
charCodeAt() 返回指定索引位置字符的Unicode值
concat() 連接兩個或多個字符串们颜,返回連接后的字符串
fromCharCode() 將字符轉(zhuǎn)換為Unicode值
indexOf() 返回字符串中檢索指定字符第一次出現(xiàn)的位置
lastIndexOf() 返回字符串中檢索指定字符最后一次出現(xiàn)的位置
localeCompare() 用本地特定的順序來比較兩個字符串
match() 找到一個或多個正則表達式的匹配
replace() 替換與正則表達式匹配的子串
search() 檢索與正則表達式相匹配的值
slice() 提取字符串的片斷,并在新的字符串中返回被提取的部分
split() 把字符串分割為子字符串數(shù)組 例如["hello".split("")可以直接將字符串轉(zhuǎn)變成Char數(shù)組]
substr() 從起始索引號提取字符串中指定數(shù)目的字符
substring() 提取字符串中兩個指定的索引號之間的字符
toLocaleLowerCase() 根據(jù)主機的語言環(huán)境把字符串轉(zhuǎn)換為小寫猎醇,只有幾種語言(如土耳其語)具有地方特有的大小寫映射
toLocaleUpperCase() 根據(jù)主機的語言環(huán)境把字符串轉(zhuǎn)換為大寫窥突,只有幾種語言(如土耳其語)具有地方特有的大小寫映射
toLowerCase() 把字符串轉(zhuǎn)換為小寫
toString() 返回字符串對象值
toUpperCase() 把字符串轉(zhuǎn)換為大寫
trim() 移除字符串首尾空白
valueOf() 返回某個字符串對象的原始值
  1. 數(shù)組
    • Array 簡介
      • JavaScript的Array可以包含任意數(shù)據(jù)類型,并通過索引來訪問每個元素
      • Array 通過屬性length獲取Array的長度,直接給Array的length賦值會導致Array大小的變化
      • Array 可以通過索引把對應的元素修改為新值,如果通過索引賦值超過了范圍,同樣會引起Array大小的變化
        var arr=[1,2,3]; arr[5]='x'; arr;//arr變成[1,2,3,undefined,undefined,'x']
      • 大多數(shù)的編程語言不允許直接改變數(shù)組的大小,越界會報錯,而JavaScript的Array卻不會報錯,但不建議直接修改Array的大小,訪問索引時,要確保索引不越界
    • Array的常用方法
      • indexOf Array也可以通過indexOf()來搜索一個指定元素的位置
      • slice() 對應字符串的substring()版本,截取Array的部分元素,然后返回一個新的Array,例:arr.slice(0,3) 從索引0到2,不包括索引3,arr.slice(3),從索引3到結(jié)束
      • slice()的起止參數(shù)包括索引,不包括結(jié)束索引,無參數(shù)時,從頭截到尾,利用此點可以復制一個Array
      • push()向Array的末尾添加若干元素
      • pop() 則把Array的最后一元素刪除掉,并返回移除的元素,空數(shù)組pop后,返回undefined
      • unshift()向頭部添加若干元素,shift()方法則把Array的第一個元素刪除掉,返回Array的長度,空數(shù)組shift(),則返回undefined
      • sort() 對Array排序,直接修改當前Array的元素位置,直接調(diào)用時,按照默認順序排序
      • reverse() 把整個Array元素反轉(zhuǎn)
      • splice() 修改Array的萬能方法
        var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle']; // 從索引2開始刪除3個元素,然后再添加兩個元素: arr.splice(2, 3, 'Google', 'Facebook'); // 返回刪除的元素 ['Yahoo', 'AOL', 'Excite'] arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle'] // 只刪除,不添加: arr.splice(2, 2); // ['Google', 'Facebook'] arr; // ['Microsoft', 'Apple', 'Oracle'] // 只添加,不刪除: arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因為沒有刪除任何元素 arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
      • concat() 方法把當前的Array和另一個Array連接到一起,并返回一個新的Array,concat方法可以接受任意個元素和Array,并自動Array拆開,然后全部添加到新的Array里,如:arr.concat(1,2,[3,4])
      • join方法是一個非常實用的方法,它把當前的Array的每個元素都用指定的字符串連接起來,然后返回連接后的字符串,若Array元素不是字符串,也將自動轉(zhuǎn)換為字符串后再連接
        var arr=['A','B','C',1]; arr.join('~');//'A~B~C~1'
      • 多維數(shù)組
        var arr=[[1,2,3],[400,500,600],'-'];
  2. 對象
    • 對象的定義及屬性訪問
      • 對象定義:JavaScript的對象是一種無序的集合數(shù)據(jù)類型,它由若干鍵值組成,例如:
        var xiaoming={ name:'test', birth:1980 }
      • JavaScript用一個{...}表示一個對象,鍵值對以xxx:xxx形式聲明,用,隔開,最后一個鍵值對末尾不需要,
      • 屬性訪問: a) 通過.操作符來訪問,但要求屬性名必須是一個有效的變量名 b) 通過xiaoming['xx']來得到變量 c)特殊的形式: 如果含有特殊字符,定義時必須'middle-school':'No.1 Middle Schoole',訪問時,只能通過['xx']來訪問 d) 屬性名盡量使用標準的變量名,這樣可以直接通過object.prop的形式訪問一個屬性
      • JavaScript對象的所有屬性都是字符串,不過屬性對應的值可以是任意數(shù)據(jù)類型
      • JavaScript規(guī)定:訪問不存在的屬性不報錯,而是返回undefined
    • 屬性的各種操作
      • JavaScript的對象是動態(tài)類型,你可以自由地給一個對象添加或刪除順序:
        xiaoming.age=18;//新增一個屬性 delete xiaoming.age;//刪除一個屬性
      • 檢測是否擁有某一屬性,可以用in操作符
        in 判斷一個屬性存在,這個屬性不一定是xiaoming的,可能是它繼承得到的
        'name' in xiaoming;//true 'toString' in xiaoming;//true
      • 要判斷一屬性是否xiaoming自身擁有的,而不是繼承的,可以用hasOwnProperty()方法
  3. 條件判斷
    • if() {...} else{...}
    • else 是可選的
    • 僅包含一條語句時,可以省略{},但不建議省略
    • 多重判斷 if(){...} else if {...} else{..}
    • 判斷條件不是true或false時,JavaScript把null,undefined,0,NaN和空字符串視為fasle,其他的一律視為true
  4. 循環(huán)
    • JavaScript的循環(huán)有兩種,一種for循環(huán),通過初始條件硫嘶、結(jié)束條件和遞增條件來循環(huán)執(zhí)行語句塊
    • for 循環(huán)最常用的地方是利用索引來遍歷數(shù)組
    • for循環(huán)的3個條件都可以省略,當沒有退出循環(huán)的判讀條件,必須使用break退出阻问,否則死循環(huán)
    • for...in 可以將一個對象的所有屬性依次循環(huán)出來,需過濾對象繼承的屬性,則需要要用hasOwnProperty()實現(xiàn)
    • 由于Array也是對象,每個元素的索引都被視為對象的屬性,因此,for...in循環(huán)可以直接循環(huán)出Array的索引
    • for...in對Array的循環(huán)得到的是String而不是Number
    • while循環(huán),for循環(huán)在已知循環(huán)的初始和結(jié)束條件時很有用,而while循環(huán)更適合只有一個判斷條件的情況
    • do...while 與while循環(huán)的唯一區(qū)別在于,不是在開始判斷條件,而是在結(jié)束時判斷條件
    • do...while 循環(huán)至少循環(huán)一次,而for和while可能一次也不執(zhí)行
    • 編寫循環(huán)代碼時,要注意初始條件和判斷條件,尤其邊界值,避免陷入死循環(huán)
  5. Map和Set
    • 類似Java中的Map,即一組鍵值對
    • ES6引入Map的目的為了解決對象的鍵只能為字符串沦疾,不能為Number等類型的問題
    • Map是一組鍵值對的結(jié)構(gòu),具有極快的查找速度
      var m = new Map(['Micha',94],['Box',12],['Nu',23]); m.get('Micha');
    • 初始化Map需要一個二維數(shù)組,或者直接初始化一個空的Map称近。
    • Map常見方法:
      var m=new Map(); m.set('Adam',3); m.set('Bob',4); m.has('Adam');//true m.get('Adam');//取得Value m.delete('Adam');//刪除
    • 一個Key對應一個Value,所有,多次對一個key放入value,后面的值會沖掉前面的
    • Set和Map類似,是一組key的集合,不存儲value,沒有重復的key
    • 創(chuàng)建Set需要提供一個Array作為輸入,或者直接創(chuàng)建一個空Set
      var a1 = new Set(); var a2 = new Set([1,2,3]);
    • 重復元素在Set中自動過濾
    • 添加和刪除方法a1.add(1); a1.delete(1);
  6. iterable
    • 為了遍歷Map和Set,ES6引入iterable類型

    • Array,Map,Set都屬于iterable類型

    • 具有iterable類型的集合可以通過新的for...of循環(huán)遍歷

    • for...infor...of區(qū)別: for...in是變量對象的屬性名稱,一個Array數(shù)組實際上也是一個對象,它的每個元素的索引被視為一個屬性,當手動添加額外屬性后第队,for...in循環(huán)將帶來一些意外效果
      var a = ['A', 'B', 'C']; a.name = 'Hello'; for (var x in a) { alert(x); // '0', '1', '2', 'name',卻沒有'length' }
      for...of則修復了上述問題,其僅循環(huán)集合本身的元素

    • 更好的方式是直接使用iterable內(nèi)置對象forEach方法,它接受一個函數(shù),每次迭代就自動回調(diào)該函數(shù)
      Array
      var a = ['A', 'B', 'C']; a.forEach(function (element, index, array) { // element: 指向當前元素的值 // index: 指向當前索引 // array: 指向Array對象本身 alert(element); });

      Map
      var a =new Map([[1,'A'], [2,'B'], [3,'C']]); a.forEach(function (value, key, map) { // value: 指向當前元素的值 // key: 指向當前key // map: 指向Array對象本身 alert(value); });

      Set
      var a = new Set(['A', 'B', 'C']); a.forEach(function (element,set) { // element: 指向當前元素的值 // set: 指向set對象本身 alert(element); });

    • JavaScript函數(shù)不要求參數(shù)必須一致,參數(shù)可以沒有,也可以多(多出的參數(shù)會變成undefined),對應順序必須一致,其余可以忽略


注釋:
1. 本文摘自廖雪峰JavaScript教程 廖雪峰網(wǎng)站地址:http://www.liaoxuefeng.com
2. 此筆記僅做個人日后查找使用,如有錯誤,煩請指正!
3. 歡迎轉(zhuǎn)載哦O(∩_∩)O


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刨秆,一起剝皮案震驚了整個濱河市凳谦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衡未,老刑警劉巖晾蜘,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異眠屎,居然都是意外死亡剔交,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門改衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖常,“玉大人,你說我怎么就攤上這事葫督〗甙埃” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵橄镜,是天一觀的道長偎快。 經(jīng)常有香客問我,道長洽胶,這世上最難降的妖魔是什么晒夹? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮姊氓,結(jié)果婚禮上丐怯,老公的妹妹穿的比我還像新娘。我一直安慰自己翔横,他們只是感情好读跷,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著禾唁,像睡著了一般效览。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荡短,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天丐枉,我揣著相機與錄音,去河邊找鬼肢预。 笑死矛洞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沼本,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼噩峦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抽兆?” 一聲冷哼從身側(cè)響起识补,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辫红,沒想到半個月后凭涂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡贴妻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年切油,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片名惩。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡澎胡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娩鹉,到底是詐尸還是另有隱情攻谁,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布弯予,位于F島的核電站戚宦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锈嫩。R本人自食惡果不足惜受楼,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祠挫。 院中可真熱鬧那槽,春花似錦、人聲如沸等舔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慌植。三九已至,卻和暖如春义郑,著一層夾襖步出監(jiān)牢的瞬間蝶柿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工非驮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留交汤,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像芙扎,于是被迫代替她去往敵國和親星岗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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

  • 注:本文所有知識點總結(jié)或摘抄自廖雪峰javascript教程戒洼,點擊查看更詳細的講解俏橘。 1.javascript簡介...
    hanyuntao閱讀 524評論 0 13
  • 前言:最近在前端這塊,發(fā)現(xiàn)自己生疏了圈浇,連最基本的js都忘的差不多了寥掐。于是趁著周末,參考了廖雪峰老師的JS教程以及自...
    SkyLine7閱讀 622評論 0 2
  • 1.HTML DOM (Document Object Model) document.getElementByI...
    廖馬兒閱讀 1,422評論 0 17
  • JavaScript基礎 JavaScript簡介JavaScript對象 JavaScript簡介 為什么使用j...
    廖少少閱讀 545評論 0 4
  • JavaScript學習(1)之JavaScript基礎 由于工作原因磷蜀,開發(fā)語言逐漸以JavaScript為主召耘,所...
    AlphaGL閱讀 420評論 0 2