前端之JavaScript篇
JavaScript
javaScript是一種指令碼語言,主要由下面三部分組成:
- 核心(ECMAScript)
- 文件物件模型(DOM) Document object model(整合js,css,html)
- 瀏覽器物件模型(BOM) Broswer object model(整合js和瀏覽器)
注意:ES6是指ECMAScript 6。
JavaScript引入方式
//第一種,在Script標籤內寫程式碼 <script> js程式碼 </script> //第二種,直接引入js檔案 《script src="myscript.js"></script>
JavaScript語言規範
// 這是單行註釋 /* 多行註釋 */ //結束符 是以分號為結束符號 ;
JavaScript語言基礎(與python做對比)
變數宣告
1、js的變數名可以使用字母、數字、_、$組成,同樣不能用數字開頭
2、用var、let (let是ES6後才支援的)來宣告變數
3、不能用關鍵字作為變數名
4、宣告常量用const,一旦宣告,該值就不能改變(ES6新增)
var userName='json' let id='111' const PI=3.14
注意:變數名是區分大小寫的
js推薦使用駝峰式命名規則:如userName
pyton則推薦用_下劃線命名規則:如user_name
var、let的區別:
var宣告的都是全域性變數,全域性變數容易受影響
let宣告的是區域性變數,所以let可以區分
JavaScript資料型別
js跟python一樣,都是擁有動態型別:
>var x; >var x=1; >var x='alex' >x
<alex
數值型別(Number)
js不區分整形和浮點型,就只用number這一種型別
var a=11 var b=11.11 typeof b <number //注意NaN也是number型別 typeof NaN <number //NaN 表示不是一個數字
型別轉換
parseInt('111') //返回 111 parseFloat('11.11') //返回11.11 parseInt('11sagljks') //返回11,如果是小數字符串則返回整數部分,如11.11返回11 parseInt("aljgla") //返回NaN //總結:只要是數字開頭就可以轉換,否則會報錯
字串型別(String)
js支援單引號、雙引號,但是不止三引號
python支援引號、雙引號、三引號
字串的拼接:
js推薦直接用+做拼接
python推薦用join做拼接
var a="json"; var a1='pytoh'; var a2='''hello''' //不支援 //模板字串 var aa=` my name is ${a1} , ${a2}world ` //返回 my name is pytoh ,hello world
//注意:${}會自動去前面尋找大括號內變數名對應的值,如果找不到,則會報錯。
字串常用的方法:
js方法 | 說明 | python |
.length | 返回長度 | .len() |
.trim() | 移除空白 | strip() |
.trimLeft() | 移除左邊空白 | lstrip() |
.trimRight() | 移除右邊空白 | rstrip() |
.charAt(n) | 返回第n個字元 | |
.concat(value,...) | 拼接 | join () |
.indexOf(substring,start) | 子序列位置 | index() |
.substring(from,to) | 根據索引獲取子序列 | []索引取值 |
.slice(start.end) | 切片 | [] |
.toLowerCase() | 小寫 | lower() |
.toUpperCase() | 大寫 | upper() |
.split(delimiter,limit) | 分割 | split() |
h="hellowold" h.length >9 h1=" hell " h1.trim() >"hell" h1.trimLeft() >"hell " h1.trimRight() >" hell" h.charAt(2) >"l" h.indexOf('ol') >6 h.substring(1,3) >"el" h.slice(0,-1) >"hellowol" h.toLowerCase() >"hellowold" h.toUpperCase() >"HELLOWOLD" h.split('o') >(3)["hell", "w", "ld"] name1='hello' name2='world' name1.concat(name2) >"helloworld"
注意:js使用切片的時候,用slice()方法
slice和substring的區別
string.slice(start, stop)和string.substring(start, stop):
兩者的相同點:
如果start等於end,返回空字串
如果stop引數省略,則取到字串末
如果某個引數超過string的長度,這個引數會被替換為string的長度
substirng()的特點:
如果 start > stop ,start和stop將被交換
如果引數是負數或者不是數字,將會被0替換
silce()的特點:
如果 start > stop 不會交換兩者
如果start小於0,則切割從字串末尾往前數的第abs(start)個的字元開始(包括該位置的字元)
如果stop小於0,則切割在從字串末尾往前數的第abs(stop)個字元結束(不包含該位置字元)
布林值
js中布林值都是小寫的。python中布林值首字母都是大寫
js布林值為false的情況有:空字串,NaN,0,undefined,null
null和undefined的區別
- null表示值是空,一般在需要指定或清空一個變數時才會使用
- undefined表示當宣告一個變數但是沒有初始化時,該變數預設值時undefined
注意:函式沒有設定return返回值的時候,函式返回的是undefined
物件(object)
js中一切皆物件,如:字串、數值、陣列、函式
js也提供了多個內建物件,如string、Data、array等
物件知識帶有屬性和方法的特殊資料型別
陣列
js的陣列類似於python中的列表
陣列常用的方法如下:
js陣列方法 | 說明 | python |
length | 陣列的大小 | len(列表名) |
push(ele) | 尾部追加元素 | append() |
pop() | 刪除並獲取尾部元素 | pop() |
unshift(ele) | 頭部插入元素 | insert(0,元素) |
shift() | 頭部移除元素並獲取該元素的值 | del l[0]/remove(l[0]) |
slice(start,end) | 切片 | l[0:2] |
reverse() | 反轉 | reverse() |
join(seq) | 將陣列元素連線成字串,join()裡面引數放連線符 | join(),相反,如:‘a’.join(l1) |
concat(val,...) | 連線陣列 | + |
sort() | 排序 | sort() |
forEach() | 將陣列的每個元素傳遞給回撥函式 | |
splice() | 刪除元素,並向陣列新增新元素 | |
map() | 將陣列的每個元素給函式處理後,返回一個處理後新的陣列 | map() |
//例子:
var l=[1,2,3] l.pop() >3 l.push(5) >3 l.unshift(6) >4 l >(4)[6, 1, 2, 5] l.shift() #刪除頭部元素 >6 l >(3)[1, 2, 5] l.slice(0,2) >(2)[1, 2] l.reverse() >(3)[5, 2, 1] l.join('a') >"5a2a1" var l2=["a","b","c"] l.concat(l2) >(6)[1, 2, 5, "a", "b", "c"] l.sort() >(3)[1, 2, 5]
forEach()方法例項:引數最多三個,第一個引數是必須的,第二個,可選,表示當前元素的索引值,第三個引數,可選,表示當前元素所屬的陣列物件
splice(index,howmany,item1)方法例項:同樣也是三個引數,第一個引數是必須的,表示起始位置,第二個引數也是必需的,表示刪除元素個數,必須是數字,也是是“0”。如果這個引數沒有設定,則會從index開始刪除到陣列最後一個元素,第三個引數,可選,表示要新增到陣列的新元素。
map()方法例項:引數性質跟forEach一致
運算子
//算數運算子 + - * / % ++ -- var x=1; var res1=x++; //結果是1 ,先賦值再運算 var res2=++x; //結果是3,先運算再賦值 //比較運算子 > >= < <= != == === !== //注意: 1=="1" //結果是true 。弱等於,會自動轉換資料型別 1===“1” //結果是false 。強等於,不會自動轉換資料型別 //邏輯運算子 /* 注意:python是 and or not js 是 && || ! 邏輯運算的時候,返回的是資料,而不是布林值 */ !5&&'5' >5 5&&'5' >5 0 || 1 >1
//賦值運算子 = += -= *= /+
流程控制
//if-else結構 if(條件){程式碼塊}else{程式碼塊} //if-else if - esle結構 if(條件){ 程式碼塊 }else if{ 程式碼塊 }else{ 程式碼塊 } //switch結構: switch(num){ case 0: 程式碼塊 barek; ..... default: console.log("...") } //注意:case子句通常要加break語句,否則程式會繼續執行後續case中語句 //for結構: for(條件){ 程式碼塊 } //while結構: while(條件){程式碼塊} //三元運算 /* python 三元運算子是 var res=1 if 1>2 else 3 js 三元運算子是 var res=1>3?1:3 */
函式
函式定義(可以帶引數,也可以不帶)
//python 是def js是function
function f(引數1,..){ 程式碼塊 } //匿名函式 var sum=function(a,b){ return a+b; } sum(1,2); //立即執行函式 (function(a,b){ return a+b; })(1,2); //箭頭函式(ES6才運許使用) var f=v =>v; //箭頭左邊是形參,右邊是返回值 //等價於 var f=function(v){ return v } var f=(arg1,arg2) => arg1+arg2; var f=function(arg1,arg2){ return arg1+arg2; }
注意:函式中arguments引數,是存放存入的引數。
函式只能返回一個值,如果要返回多個值,只能將其放在陣列或物件中返回
函式的全域性變數和區域性變數
區域性變數:在函式內部宣告的變數就是區域性變數,只能在函式內部訪問,函式執行完畢,該變數也會被刪除
全域性變數:在函式外部宣告的變數,該變數會在頁面關閉後被刪除
作用域:跟python作用域關係查詢一模一樣。
首先在函式內部查詢變數,找不到再到外層函式查詢,逐步找到最外層。
自定義物件
本質就鍵對集合,類似於python中中的字典。
#第一種建立自定義物件的方式 var d={'user':'hell','passwd':123} #第二種建立自定義物件的方式 var d1=new Object() d1.id='alex'; d1.password=123; //等價於 d1={'id':'alex','password':123}
//遍歷物件內容
for (var i in d1){
console.log(i,d1[i]);
}
Data物件
var d1=new Date(); var d2=new Date("2020/9/20 21:03") //引數是日期字串 var d3=new Date(1000) //引數是毫秒 var d4=new Date(2020,9,20,21,3,1,100) //引數是年月日時分秒毫秒 //Date物件方法 var d=new Date() getDate() // 獲取日 getDay () //獲取星期 getMonth () // 獲取月(0-11) getFullYear () // 獲取完整年份 getYear () //獲取年 getHours () //獲取小時 getMinutes () //獲取分鐘 getSeconds () //獲取秒 getMilliseconds () //獲取毫秒 getTime () //返回累計毫秒數(從1970/1/1午夜)
JSON物件
在python中序列化、反序列化
- dumps 序列化
- loads 反序列化
在js中序列化反、序列化
- JSON.stringify() 等價於dumps 序列化
- JSON.parse() 等價於loads 反序列化
RegExp物件
在python中,使用正則,需要藉助於re模組,
在js中,則需要建立正則物件
//第一種建立正則物件方法 let reg1= new RegExp("正則語句“) //eg: let reg1 =new RegExp(^[a-zA-Z][a-zA-Z0-9]{5,11}) //第二種 let reg2 = /正則語句/ //eg: let reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/ //匹配以字母開頭,長度在5~11 //匹配內容,呼叫test方法 reg1.test('helloworld) //全域性匹配缺陷 let reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/ g /* 全域性模式有一個lastIndex屬性,匹配結果為true是,lastIndex是字串的長度,下次匹配會從字串尾部開始匹配,匹配結果為false時,lastIndex會重新置0,從頭開始匹配。 */ reg2.test('helloworld') >true reg2.test('helloworld') //此時lastIndex是10,從字母d後面開始匹配,所以結果為false >false //第二個缺陷,當test(),不傳引數的時候,預設傳undefined