狂神说js学习笔记
文章目錄
- 0、前端知識體系
- 0.1前端三要素
- 0.2、結構層(HTML)
- 0.3、表現層(CSS)
- 0.4、行為層(JavaScript)
- 0.5、三端同一
- 1、什么是JavaScript
- 1.1、概述
- 1.2、歷史
- 2、快速入門
- 2.1、引入JavaSciprt
- 2.2、基本語法入門
- 2.3、數據類型
- 2.4、嚴格檢查格式
- 3、數據類型
- 3.1、字符串
- 3.2 數組
- 3.3、對象
- 3.4、流程控制
- 3.5、Map 和 Set
- 3.6、 interator
- 4、函數
- 4.1、定義函數
- 4.2、變量的作用域
- 4.3、方法
- 5、內部對象
- 5.1、Date
- 5.2、JSON
- 5.3、Ajax
- 6、面向對象編程
- 7、操作BOM對象(重點)
- 8、操作DOM對象(重點)
- 9、操作表單(驗證)
- 10、jQuery
0、前端知識體系
想要成為真正的“互聯網Java全棧工程師”還有很長的一段路要走,其中前端是繞不開的一門必修課。本階段課程的主要目的就是帶領Java后臺程序員認識前端、了解前端、掌握前端,為實現成為“互聯網Java全棧工程師”再向前邁進一步。
0.1前端三要素
- HTML(結構):超文本標記語言(Hyper Text Markup Language),決定網頁的結構和內容。
- CSS(表現):層疊樣式表(Cascading Style Sheets),設定網頁的表現樣式。
- JavaScript(行為):是一種弱類型腳本語言,其源碼不需經過編譯,而是由瀏覽器解釋運行,用于控制網頁的行為
0.2、結構層(HTML)
- 略
0.3、表現層(CSS)
CSS層疊樣式表是一門標記語言,并不是編程語言,因此不可以自定義變量,不可以引用等,換句話說就是不具備任何語法支持,它主要缺陷如下:
- 語法不夠強大,比如無法嵌套書寫,導致模塊化開發中需要書寫很多重復的選擇器;
- 沒有變量和合理的樣式復用機制,使得邏輯上相關的屬性值必須以字面量的形式重復輸出,導致難以維護;
這就導致了我們在工作中無端增加了許多工作量。為了解決這個問題,前端開發人員會使用一種稱之為【CSS預處理器】的工具,提供CSS缺失的樣式層復用機制、減少冗余代碼,提高樣式代碼的可維護性。大大的提高了前端在樣式上的開發效率。
什么是CSS預處理器?
- CSS預處理器定義了一種新的語言,其基本思想是,用一種專門的編程語言,為CSS增加了一些編程的特性,將CSS作為目標生成文件,然后開發者就只需要使用這種語言進行CSS的編碼工作。轉化成通俗易懂的話來說就是“用一種專門的編程語言,進行Web頁面樣式設計,再通過編譯器轉化為正常的CSS文件,以供項目使用”。
- 常用的CSS預處理器有哪些:
- SASS:基于Ruby ,通過服務端處理,功能強大。解析效率高。需要學習Ruby語言,上手難度高于LESS。
- LESS:基于NodeJS,通過客戶端處理,使用簡單。功能比SASS簡單,解析效率也低于SASS,但在實際開發中足夠了,所以如果我們后臺人員如果需要的話,建議使用LESS。
0.4、行為層(JavaScript)
JavaScript一門弱類型腳本語言,其源代碼在發往客戶端運行之前不需要經過編譯,而是將文本格式的字符代碼發送給瀏覽器,由瀏覽器解釋運行。
- JavaScript框架:
- JQuery:大家熟知的JavaScript庫,優點就是簡化了DOM操作,缺點就是DOM操作太頻繁,影響前端性能;在前端眼里使用它僅僅是為了兼容IE6,7,8;
- Angular:Google收購的前端框架,由一群Java程序員開發,其特點是將后臺的MVC模式搬到了前端并增加了模塊化開發的理念,與微軟合作,采用了TypeScript語法開發;對后臺程序員友好,對前端程序員不太友好;最大的缺點是版本迭代不合理(如1代–>2 代,除了名字,基本就是兩個東西;截止發表博客時已推出了Angular6);
- React:Facebook 出品,一款高性能的JS前端框架;特點是提出了新概念 【虛擬DOM】用于減少真實 DOM 操作,在內存中模擬 DOM操作,有效的提升了前端渲染效率;缺點是使用復雜,因為需要額外學習一門【JSX】語言;
- Vue:一款漸進式 JavaScript 框架,所謂漸進式就是逐步實現新特性的意思,如實現模塊化開發、路由、狀態管理等新特性。其特點是綜合了 Angular(模塊化)和React(虛擬 DOM) 的優點;
- Axios:前端通信框架;因為 Vue 的邊界很明確,就是為了處理 DOM,所以并不具備通信能力,此時就需要額外使用一個通信框架與服務器交互;當然也可以直接選擇使用jQuery 提供的AJAX 通信功能。
- UI框架:
- Ant-Design:阿里巴巴出品,基于React的UI框架;
- ElementUI、iview、ice:餓了么出品,基于Vue的UI框架;
- BootStrap:Teitter推出的一個用于前端開發的開源工具包;
- AmazeUI:又叫“妹子UI”,一款HTML5跨屏前端框架。
- JavaScript構建工具:
- Babel:JS編譯工具,主要用于瀏覽器不支持的ES新特性,比如用于編譯TypeScript。
- WebPack:模塊打包器,主要作用就是打包、壓縮、合并及按序加載。
0.5、三端同一
- 混合開發(Hybrid App)
- 主要目的是實現一套代碼三端統一(PC、Android:.apk、iOS:.ipa)并能夠調用到設備底層硬件(如:傳感器、GPS、攝像頭等),打包方式主要有以下兩種:
- 云打包:HBuild -> HBuildX,DCloud 出品;API Cloud
- 本地打包: Cordova(前身是 PhoneGap)
1、什么是JavaScript
1.1、概述
JavaScript是一門世界上最流行的腳本語言
Java、JavaScript
開發歷程10天~
一個合格的后端人員,必須要精通JavaScript
1.2、歷史
https://blog.csdn.net/kese7952/article/details/79357868
ECMAScript它可以理解為是JacaScript的一個標準
最新版本已經到se6版本~
但是大部分瀏覽器還只停留在支持es5代碼上!
開發環境—線上環境,版本不一致
2、快速入門
2.1、引入JavaSciprt
1、內部標簽
<script>//...... </script>2、外部引入
abs.js
//。。。test.html
<script src="abs.js"></script>測試代碼
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><title>Title</title><!-- script標簽內,寫javascript代碼 --><!-- <script>alert("hello,world");</script> --><!-- 外部引入 --><!-- 注意:script標簽必須承兌出現 --><script src="js/qj.js"></script><!-- 不用顯示定義type,也默認就是jacascript --><select type="text/jacascript"> </select></head><body><!-- 這里也可以存放 --></body> </html>2.2、基本語法入門
<!-- JavaScript嚴格區分大小寫! --><script type="text/javascript">// 1. 定義變量 變量類型 變量名 = 變量值;var score = 61; // alert(num); // 2.條件控制if(score>60 && score<70){alert("60~70");}else if(score>70 && score<800){alert("70~80");}else{alert("other");}// console.log(score) 在瀏覽器的控制臺打印變量! System.out.println();/* 多行注釋asdf*/</script>瀏覽器必備調試須知:
2.3、數據類型
數值,文本,圖形,音頻,視頻。。。。
變量
var 王者榮耀 = "倔強青銅"//高級符號和數字不能用來定義number
js不區分小叔和整數,Number
123 //整數123 123.1 //浮點數123.1 1.123e3 //科學計數法 -99 //負數 NaN // not a number 不是一個數字 Infinity //表示無限大字符串
‘abc’ “abc”
布爾值
true (真) ,false (空)
邏輯運算
&& 與, 兩個都為正,結果為真|| 或 , 一個為正,結果為真! 非 ,真即假,假即真比較運算符 !!!!!重要!
= 賦值符號 1 “1” == 等于(類型不一樣,值一樣,也會判斷為true) === 絕對等于(類型一樣,值一樣,結果為true)這是一個JS的缺陷,堅持不要使用==比較
須知:
- NaN==NaN,這個與所有的數值都不相等,包括自己
- 只能通過isNaN(NaN)來判斷這個數是否是NaN
浮點數問題:
console.log((1/3 === (1-2/3)))盡量避免使用浮點數進行運算,存在精度問題!
Math.abs(1/3-(1-2/3))<0.000000001null和undefined
- null 空
- undefined 未定義
數組
Java的數值必須列想通類型的對象,JS中不需要這樣!
//保證代碼的可讀性,盡量使用【】var arr = [1,2,3,4,5,"hello",null,true];new Array(1,12,3,4,4,5,"hello");取數組下標:如果越界了,就會
undefined對象
對象是大括號,數組是中括號~~
每個屬性之間使用逗號隔開,最后一個不需要添加
// Person person = new Person(1,2,3,4,5);var person = {name: "qingjiang",age: 3,tags: ['js','java','web','...']}取對象的值
person.name >"qingjiang" person.age >32.4、嚴格檢查格式
<!DOCTYPE html> <html><head><meta charset="utf-8"><title>Title</title><!-- 前提:IEDA 需要支持es6語法'use strict'; 嚴格檢查模式,預防JavaScript的隨意性導致產生的一些問題 必須寫在JavaScript第一行局部變量建議都使用let去定義~--><script>'use strict';// 全局變量let i = 1;// Es6 let </script></head><body></body> </html>3、數據類型
3.1、字符串
1、正常字符串我們使用 ’ 單引號,或者 “ 雙引號包裹
2、注意轉義字符 \
\' 字符串 \n 換行 \t tabe \u4e2d \u#### Unicode字符 中 \X41 Asc11字符3、 多行字符串編寫
// tab上面,esc下面 `var msg = `helloworld你好ya你好`4.模板字符串
// tab上面,esc下面 ` let name = "qingjiang";let age = 3;let msg = `你好呀,${name}` //模板字符串 ${}5、字符串長度
console.log(str.length) //字符串長度為 36、字符串的可變性,不可變
7、大小寫轉換方法
//注意,這里是方法,不是屬性了 console.log(student.toUpperCase()) //轉換為大寫 console.log(student.toLowerCase()) //轉換為小寫8、student.indexOf(‘t’)
console.log(student.indexOf('t')) //輸出為1,輸出t在字符中的第幾個位置9、substring
[) console.log(student.substring(1)) //輸出tudent,作用為截取字符第1個字符串到最后一個字符串 console.log(student.substring(1,3)) //輸出tu [1,3)從第一個字符串截取到第三個字符中間的字符(有第0個字符串)3.2 數組
Array可以包含任意的數組類型
var arr = [1,2,3,4,5,6]; //通過下標取值和賦值 arr[0] arr[0] = 11、長度
arr.length //輸出為6 arr.length = 10 //輸出為10,(10) [1, 2, 3, 4, 5, 6, 空 ×4]注意:假如給arr.length賦值,數組大小就會發生變化~,如果賦值過小,元素就會丟失
2、indexOf,通過元素獲得下標索引
arr = [1,2] arr.indexof(2) //輸出為1,代表2在arr中是第一個位置。(數字1為0的位置)字符串的“1”和數字 1 是不同的
arr = [1,2,3,4,5,6,"1","2"] //(8) [1, 2, 3, 4, 5, 6, '1', '2'] arr.indexOf(1) //0 arr.indexOf("1") //63、slice() 數組版的substring,截取Array的一部分,返回一個新數組
類似于String中的substring
arr = [1,2,3,4,5,6,"1","2"] arr.slice(3) //(5) [4, 5, 6, '1', '2'] arr.slice(1,5) //(4) [2, 3, 4, 5]4、push() : 壓入到尾部,在數組的后面添加元素
? pop (): 彈出尾部的一個元素,在數組的后面刪除元素
? (括號中添加數字效果不變)
arr //(8) [1, 2, 3, 4, 5, 6, '1', '2'] arr.push('a','b') //10 arr //(10) [1, 2, 3, 4, 5, 6, '1', '2', 'a', 'b'] arr.pop() //'b' arr //(9) [1, 2, 3, 4, 5, 6, '1', '2', 'a'] arr.pop(4) //'a' arr //(8) [1, 2, 3, 4, 5, 6, '1', '2'] arr.pop('4') //'2' arr //(7) [1, 2, 3, 4, 5, 6, '1']5、unshif() ,shift() 頭部
? unshif() 壓入到頭部,在頭部添加元素
? shif() 彈出頭部的一個元素,在頭部彈出元素
arr //(7) [1, 2, 3, 4, 5, 6, '1'] arr.unshift('a','b') //9 arr //(9) ['a', 'b', 1, 2, 3, 4, 5, 6, '1'] arr.shift() //'a' arr.shift() //'b' arr //(7) [1, 2, 3, 4, 5, 6, '1']6、排序 sort()
arr //(3) ['B', 'C', 'A'] arr.sort() //(3) ['A', 'B', 'C']7、元素反轉 reverse()
//(3) ['A', 'B', 'C'] arr.reverse() //(3) ['C', 'B', 'A']8、concat()
//(3) ['C', 'B', 'A'] arr.concat([1,2,3]) //(6) ['C', 'B', 'A', 1, 2, 3] arr //(3) ['C', 'B', 'A']注意: concat()并沒有修改數組,只是會返回一個新的數組
9、連接符 join
打印拼接數組,使用特定的字符串連接
//(3) ['C', 'B', 'A'] arr.join('-') //'C-B-A'10、多維數組
arr = [[1,2],[3,4],["5","6"]]; arr[1][1] //4 第一個1代表著數組里面的第一個數組,第二個1代表第一個數組里面的第一個元素數組:存儲數據(如何存,如何取,方法都可以自己實現!)
3.3、對象
若干個鍵值對
var 對象名 = {屬性名: 屬性值,屬性名: 屬性值,屬性名: 屬性值,} //定義了一個person對象,它具有person屬性 var person = {name: "kuangshen",age: 3,email: "123456789@qq.com",score: 0}js中對象,{…}表示一個對象,鍵值對描述屬性xxxx: xxxx,多個屬性之間使用逗號隔開,最后一個屬性不加逗號!。
JavaScript中所有的鍵都是字符串,值是任意對象!
1、對象賦值
person.name //'kuangshen' person.name = "qingjiang" //'qingjiang' person.name //'qingjiang'2、使用一個不存在的對象屬性,不會報錯! undefined
person.haha //undefined3、動態的刪減屬性,通過 delete刪除對象屬性
person //{name: 'qingjiang', age: 3, email: '123456789@qq.com', score: 0} delete person.name //true person //{age: 3, email: '123456789@qq.com', score: 0}4、動態的添加
person.haha = "haha" //'haha' person //{age: 3, email: '123456789@qq.com', score: 0, haha: 'haha'}5、判斷屬性值是否在這個對象中! xxx in xxx!
person //{age: 3, email: '123456789@qq.com', score: 0, haha: 'haha'} 'age' in person //true//繼承 'toString' in person //true6、判斷一個屬性是否是這個對象自身擁有的 hasOwnProperty()
person.hasOwnProperty('toString') //false person.hasOwnProperty('age') //true3.4、流程控制
if 判斷
<script>'use strict'var age = 3;if(age>3){ //第一個判斷alert("haha");}else id(age<5){ //第二個判斷alert("kawa~");}else { //否則,,alert("kuwa~~");}</script>while循環,避免程序死循環
<script>'use strict'var age = 3;while(age<100){ //當age小于3age = age +1; //新的age等于舊的age+1console.log(age) //開始輸出新的age,小于100繼續 循環,直到等于或大于100} do{age = age + 1;console.log(age) }while(age<100)//do循環一定會執行,while循環會先判斷,有可能不執行</script>死循環
'use strict'var age = 3; while(true){alert(123)} //頁面會出現一個關不掉的內容為123的彈窗for循環
for(let i = 0; i <100 ; i++){console.log(i) }//打印1-99forEach 循環
5.1引入的
var age = [12,3,12,3,12,3,12,31,23,123];//函數,跟方式一樣age.forEach(function(value){console.log(value)}) //打印出數組? forEach 語法:
forEach方法中的function回調有三個參數:
第一個參數是遍歷的數組內容,
第二個參數是對應的數組索引,
第三個參數是數組本身
[ ].forEach(function(value,index,array){
for…in
var age = [12,3,12,3,12,3,12,31,23,123];/*for(Type ste: el){}*///for(var index in object){}for(var num in age){if(age.hasOwnProperty(num)){console.log("存在")console.log(age[num])}} //index為數組的下標索引,num //假設不知道age(object)的num大小情況下使用會快一點3.5、Map 和 Set
ES6的新特性~
Map:
'use strict'//ES6 Map //學生的成績,學生的名字//var names = ["tom","jack","haha"];//var scores = [100,90,80];var map = new Map([['tom',100],['jack',90], ['haha',80]])var name = map.get('tom'); //使用get方法通過key獲得 valuemap.set('admin',123456); //通過set方法添加key(在尾 部)console.log(name);map.delete("tom"); //刪除Set: 無序不重復的集合
var set = new Set([3,1,1,1,1,1,"123",123,'123']); //set可以去重(包括字符串、數字。。)set.add(2) //add方法添加元素set.delete(1) //delete方法刪除元素 console.log(set.has(3)); //打印set數組里是否含有3console.log( Array.from(set) ); //打印set里的所有元素3.6、 interator
ES6的新特性~
作業:使用 interator 來遍歷迭代我們Map,Set!
遍歷數組
//通過for of / for in 下標 var arr = [3,4,5]for(var x of arr){ //of換成in打印索引,of打印具體的值console.log(x)}遍歷map
var map = new Map([["tom",100],["jack",90],["haha",80]]);for (let x of map){console.log(x)}遍歷set
var set = new Set([5,6,7]);for (let x of set){console.log(x)}4、函數
方法:對象(屬性,方法)
函數:放到外面就是函數,放的位置不同
4.1、定義函數
定義方式一
絕對值函數
//public 返回值類型 方法名(){ // return 返回值; //} function abs(x){ //函數 方法名if(x>=0){return x;}else{return -x;} }一但執行到 return代表函數結束,返回結果!
如果沒有執行 return,函數執行完也會返回結果,結果就是undefined
定義方式二
var abs = function(x){if(x>=0){return x;}else{return -x;} }function(x){…}這是一個匿名函數。但是可以把結果賦值給 abs,通過 abs就可以調用函數!
方式一和方式二等價!,表達起來一樣,個人習慣用哪個方法
調用函數
abs(10) //10 abs(-10) //10參數問題: javaScript 可以傳任意個參數,也可以不傳遞參數~
參數進來是否存在的問題?
假設不存在參數,如何規避?
var abs = function(x){ //手動拋出異常來判斷,如果x不等于 number,則打印Not a Numberif(typeof x!== 'number'){throw 'Not a Number';}if(x>=0){return x;}else{return -x;} }arguments
arguments是一個JS免費贈送的關鍵字;
代表,傳遞進來的所有的參數,是一個數組!
var abs = function(x){ //傳送11,打印11,傳送11,12 打印成數組console.log("x=>"+x);for(var i =0; i<arguments.length;i++){console.log(arguments[i])}if(x>=0){return x;}else{return -x;} }問題: arguments包含所有的參數,我們有時候想使用多余的參數來進行附加操作。需要排除已有參數~
rest
以前:
if (arguments.length>2){for (var i = 2; i<arguments.length;i++){} }ES6 引入的新特性,獲取出了已經定義的參數之外的所有參數~。。。
function aaa(a,b,...rest){console.log("a=>"+a);console.log("b=>"+b);console.log(rest);}rest 參數只能寫在坐后面,必須用 … 標識。
4.2、變量的作用域
在javascript中,var 定義的變量實際是有作用域的。
假設在函數體中聲明,則在函數體外不可以使用~ (非要想實現的話,后面可以研究一下 閉包)
'use strict'function qj() {var x = 1;x = x + 1;}x = x + 2; //Uncaught ReferenceError: x is not defined如果兩個函數使用了想通的變量名,只要在函數內部,就不沖突
function qj() {var x = 1;x = x + 1;} function qj2() {var x = 'A';x = x + 1;}內部函數可以訪問外部函數的成員,反之則不行
function qj() {var x = 1;// 內部函數可以訪問外部函數的成員,反之則不行function qj2() {var y = x + 1; //2}var z = y + 1; //變量的作用域.html:28 Uncaught ReferenceError: y is not define}假設,內部函數變量和外部函數的變量,重名!
function qj() {var x = 1;function qj2() {var x = 'A'; console.log('inner'+x); //outer1}console.log('outer'+x); //innerAqj2()}qj()假設在javascript中 函數查找從變量自身函數開始~,由 “內” 向 “外“查找。假設外部存在這個同名的函數變量,則內部函數會屏蔽外部函數的變量。
(如上,內部跟外部函數都有x,先算內部x)
提升變量的作用域
function qj(){var x = "x" + y;console.log(x);var y = 'y';}qj(); //xundefined結果:xundefined
說明:js 執行引擎,自動提升了y的聲明,但是不會提升變量y的賦值;
function qj(){var y = 'y';var x = "x" + y;console.log(x); }qj(); // xy這個是在JavaScript建立之初就存在的特性。養成規范:所有的變量定義都放在函數的頭部,不要亂放,便于代碼維護;
function qj2(){ var x = 1,y = x + 1,z,i; //undefined // 之后隨意用}全局函數
//全局變量var x = 1;function f(){console.log(x);}f();console.log(x);全局對象 window
var x = 'xxx';alert(x); alert(window.x); //默認所有的全局變量,都會自動綁定在 window 對象下;? 電腦會彈出兩個內容為 ‘xxx’ 的彈窗
!!! alert() 這個函數本身也是一個 window 變量
var x = 'xxx';window.alert(x); // winidow.alert(window.x); //默認所有的全局變量,都會自動綁定在 window 對象下;var old_alert = window.alert;// old_alert(x);window.alert = function (){};// 發現alert()失效了,只彈窗xxxwindow.alert(123);//恢復window.alert = old_alert;window.alert(456);JavaScript 實際上只有一個全局作用域,任何變量(函數也可以視為變量),假設沒有在一個函數的作用范圍內找到,就會向外查找,如果在全局作用域都沒有找到,就會報錯 RefrenceError
規范
由于我們所有的全局變量都會綁定到我們的 window 上。如果不痛的 js 文件,使用了相同的全局變量,就會產生沖突~> 如何能夠減少沖突?
// 唯一全局變量var KuangApp = {};//定義全局變量KuangApp.name = 'kuangshen';KuangApp.add = function (a,b){return a + b;}把自己的代碼全部放入自己定義的唯一空間名字中,降低全局命名沖突的問題~
jQuery
!!! 局部作用域 let
function aaa(){for (var i = 0;i < 100; i++){console.log(i)}console.log(i+1); //問題? i 出了這個作用域還可以使用} //打印 1~101ES6 let 關鍵字,解決局部作用域沖突問題
function aaa(){for (let i = 0;i < 100; i++){console.log(i)}console.log(i+1); //問題? i 出了這個作用域還可以使用} //打印 1~99,然后報錯 Uncaught ReferenceError: i is not defined at aaa建議大家都是用 let 去定義局部作用域的變量;
常量 const
在 ES6 之前,怎么定義常量:只有用全部大寫字母命名的變量就是常量;建議不要修改這樣的值
var PI = '3.14';console.log(PI);PI = '123'; //可以改變z這個值console.log(PI);在 ES6 引入了常量關鍵字 const
const PI = '3.14'; //只讀console.log(PI);PI = '123'; //Uncaught TypeError: Assignment to constant variable.console.log(PI);4.3、方法
定義方法
方法就是把函數放在對象的里面,對象只有兩個東西:屬性和方法
var kuangshen = {name: '秦疆',bitrh: 1999,// 方法age: function(){// 今年 - 出生的年var now = new Date().getFullYear();return now-this.bitrh;}} //屬性 kuangshen.name //方法,一定要帶 () kuangshen.age()this. 代表什么?拆開上面的代碼看看~
function getAge(){// 今年 - 出生的年var now = new Date().getFullYear();return now-this.bitrh; }var kuangshen = {name: '秦疆',bitrh: 1999,age: getAge}// kuangshen.age() ok// getAge() 打印 NAN windowthis 是無法指向的,是默認指向調用它的那個對象;
apply
在js中可以控制this指向!
function getAge(){// 今年 - 出生的年var now = new Date().getFullYear();return now-this.bitrh; }var kuangshen = {name: '秦疆',bitrh: 1999,age: getAge}; // kuangshen.age() ok getAge.apply(kuangshen,[]); //this, 指向 kungshen,參數為空5、內部對象
標準對象
typeof 123 'number' typeof '123' 'string' typeof true 'boolean' typeof NaN 'number' typeof [] 'object' typeof {} 'object' typeof Math.abs 'function' //函數類型 typeof undefined 'undefined'5.1、Date
基本使用
var now = new Date(); //Thu Mar 10 2022 16:00:07 GMT+0800 (中國標準時間)now.getFullYear(); //現在的年now.getMonth(); //現在的月 0~11 代表月,老外now.getDate(); //現在的日now.getDay(); //星期幾now.getHours(); //現在的時now.getMinutes(); //現在的分now.getSeconds(); //現在的秒now.getTime(); //時間戳 全世界統一 1970 1.1 0:00:00 毫秒數console.log(new Date(1646899612102)) //時間戳轉為時間轉換
now = new Date(1646899612102) //Thu Mar 10 2022 16:06:52 GMT+0800 (中國標準時間) now.toLocaleString //注意,調用是一個方式,不是一個屬性! //? toLocaleString() { [native code] } now.toLocaleString() //'2022/3/10 16:06:52' now.toGMTString() //'Thu, 10 Mar 2022 08:06:52 GMT'5.2、JSON
json 是什么
早期,所有數據傳輸習慣使用 XML 文件!
- JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。
- 簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。
- 易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升網絡傳輸效率。
在JavaScript 一切皆對象、任何 js 支持的類型都可以用JSON來表示;number, string…
格式:
- 對象都用 {}
- 數組都用 []
- 所有的鍵值對 都是使用 key:value
JSON 字符串和 JS 對象的轉換
var user = {name : "qinjiang",age : 3,sex : '男'}//對象轉化為json字符串 {"name":"qinjiang","age":3,"sex":"男"}// stringify 轉化層,對象轉化為字符串var jsonUser = JSON.stringify(user)//json 字符串轉化為對象 參數為 json 字符串,parse解析,把字符串解析為對象var obj = JSON.parse('{"name":"qinjiang","age":3,"sex":"男"}')很多人搞不清楚,JSON 和 JS 對象的區別
var obj = {a: 'hello',b:'hellob'}; var json = '{"a": "hello","b":"hellob"}';5.3、Ajax
- 原生的 js 寫法 xhr 異步請求
- jQuey 封裝好的 方法 $("#name").ajax("")
- axios 請求
6、面向對象編程
原型對象
javascript、Java、c#。。。。面向對象; javascript 有些區別!
- 類:模板 原型對象
- 對象:具體的實例
在 JavaScript 這個需要大家換一下思維方式!
原型:
var Student = {name : "qinjiang",age : 3,run: function(){console.log(this.name + "run...");}};var xiaoming = {name: "xiaoming"};//原型對象xiaoming.__proto__ = Student;var Bird = {fly: function(){console.log(this.name + "fly...");}};//小明的原型 是 Birdxiaoming.__proto__ = Bird; function Student(name) {this.name = name;}// 給student 新增一個方法Student.prototype.hello = function(){alert('Hello')};class 繼承
class 關鍵字,是在ES6引入的
1、定義一個類,屬性,方法
//ES6 之后==========// 定義一個學生的類class Student{constructor(name){ //constructor 構造器this.name = name;}hello(){alert('hello')}} var xiaoming = new Student("xiaoming") var xiaohong = new Student("xiaohong") xiaoming.hello() //彈出內容為hello 的窗口2、繼承
<script>// 定義一個學生的類class Student{constructor(name){ //constructor 構造器this.name = name;}hello(){alert('hello')}}class XiaoStudent extends Student{ //extends 繼承的意思constructor(name,grade) {super(name); //super 調用繼承了的構造類 namethis.grade = grade;}myGrade(){alert('我是一名小學生')}}var xiaoming = new Student("xiaoming")var xiaohong = new XiaoStudent("xiaohong",1) </script>本質:查看對象原型
原型鏈
— proto —:
7、操作BOM對象(重點)
瀏覽器
JavaScript 和 瀏覽器關系?
JavaScript 誕生就是為了能夠讓他在瀏覽器中運行!
BOM:瀏覽器對象模型
- IE 6 ~ 11
- Chrome
- Safari
- FireFox Linux的默認瀏覽器
- Opera
三方
- QQ瀏覽器
- 360瀏覽器
window (重要)
window 代表 瀏覽器窗口
window.alert(1) undefined window.innerHeight 322 window.innerWidth 1536 window.outerHeight //外部高度 824 window.outerWidth 1536 window.innerHeight //內部高度 194 //打架可以調整瀏覽器窗口試試。。。Navigator(不建議使用)
Navigator,封裝了瀏覽器的信息
window.Navigator.appName undefined navigator.appName 'Netscape' navigator.appVersion //當前瀏覽器版本 '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.36' navigator.userAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.36' navigator.platform 'Win32'多數時候,我們不會使用 navigator 對象,因為會被人為修改!
不建議使用這些屬性來判斷和編寫代碼
screen
screen.width 1536 px screen.height //計算機屏幕 864 px //screen代表全屏幕屬性代表屏幕尺寸
location (重要)
location 代表當前頁面的URL信息
hash: "" host: "www.baidu.com" //主機 hostname: "www.baidu.com" href: "https://www.baidu.com/" //當前指向的位置 origin: "https://www.baidu.com" pathname: "/" port: "" protocol: "https:" //協議 reload: ? reload() //方法,重新加載,刷新網頁 //設置新的地址 location.assign('https://hao123.com/')document (內容;DOM)
document 代表當前的頁面, HTML DOM文檔樹
document.title '百度一下,你就知道' document.title='狂神說' '狂神說'獲取具體的文檔樹節點
<dl id="app"><dt>Java</dt><dd>JavaSE</dd><dd>JavaEE</dd> </dl><script>var dl = document.getElementById('app'); //獲取節點 </script>獲取 cookie
document.cookie 'pglt-edgeChromium-ntp=43;劫持 cookie 原理
www.taobao.com
<script src="aa.js"></script> <!-- 惡意人員:獲取你的cookie上傳到他的服務器 -->服務器端可以設置 cookie:httpOnly //只讀
hisory (不建議使用)
history.back() //后退 history.forward() //前進hisory 代表瀏覽器的歷史紀錄
8、操作DOM對象(重點)
DOM:文檔對象模型,
核心
整個瀏覽器網頁就是一個Dom 樹形結構!
- 更新:更新Dom節點
- 遍歷dom節點:得到Dom節點
- 刪除:刪除一個Dom節點
- 添加:添加一個新的節點
要操作一個Dom節點,就必須要先獲得這個Dom節點
獲得Dom節點
//對應 css 選擇器var h1 = document.getElementsByTagName('h1'); //標簽選擇器var p1 = document.getElementById('p1'); //id選擇器var p2 = document.getElementsByClassName('p2'); //class選擇器var father = document.getElementById('father');var childrens = father.children[index]; //獲取父節點下的所有子節點//father.firstChild 獲取第一個節點//father.lastChild 獲取第二個節點//father.nextSibling 獲取下一個節點這是原生代碼,之后我們盡量都是使用jQuery();
更新節點
<div id="id1"> </div> <script>var id1 = document.getElementById('id1'); </script>操作文本
- id1.innerText=“123” 修改文本的值
- id1.innerHTML=’< strong >123</ strong>’ 可以解析HTML文本標簽
操作 JS,CSS
id1.style.color = 'red'; //屬性使用 字符串 包裹 'red' id1.style.fontSize='20px' //- 轉 駝峰命名問題 '20px' id1.style.padding='2em' '2em'刪除節點
刪除節點的步驟:先獲取父節點,再通過父節點刪除自己
<div id="father"> <h1>標題一</h1> <p id="p1">p1</p> <p class="p2">p2</p> </div> <script>var self = document.getElementById('p1'); var father = p1.parentElement;father.removeChild(self)//刪除是一個動態的過程。father.removeChild(father.children[0])father.removeChild(father.children[1])father.removeChild(father.children[2]) </script> father.removeChild()注意:刪除多個節點的時候,children 是在時刻變化的,刪除節點的時候一定要注意!(就是1被刪除的時候,2會自動變成1)
插入節點
我們獲得了某個Dom節點,假設這個dom節點是空的,我們通過 innerHtmL 就可以增加一個元素了,但是這個DOM節點已經存在元素了,我們就不能這么干了!會產生覆蓋
追加
<p id="js">JavaScript</p> <div id= "list"><p id="se">JavaSE</p><p id="ee">JavaEE</p><p id="me">JavaME</p> </div><script>var js = document.getElementById('js');var list = document.getElementById('list');list.appendChild(js) //追加到后面//原先js在瀏覽器中list(div)的前面,現在在me的后面//JavaScript JavaSE//JavaSE JavaEE//JavaEE JavaME//JavaME JavaScript </script>效果
創建一個新的標簽,實現插入
<script>var js = document.getElementById('js'); //已存在的節點var list = document.getElementById('list');//通過 JS 創建一個新的節點var newP = document.createElement('p');// 創建一個p標簽newP.id = 'newP';newP.innerText = 'Hello,Kuangshen';//list.appendChild(newP);// 可以創建一個Style標簽var myStyle = document.createElement('style'); //創建了一個空sstyle標簽myStyle.setAttribute('type','text/css');myStyle.innerHTML = 'body{ background-color: chartreuse;}'; //這是標簽內容document.getElementsByTagName('head')[0].appendChild(myStyle); </script>insert(插入)
<p id="js">JavaScript</p> <div id= "list"><p id="se">JavaSE</p><p id="ee">JavaEE</p><p id="me">JavaME</p> </div> <script>var ee = document.getElementById('ee');var js = document.getElementById('js');var list = document.getElementById('list');var me = document.getElementById('me');var se = document.getElementById('se');//要包含的節點.insertBefore(newNode,targetNode)list.insertBefore(js,ee);//在list里面,新的一個js插入在ee的前面9、操作表單(驗證)
表單是什么 form DOM 樹
- 文本框 text
- 下拉框 < select >
- 單選框 radio
- 多選框 checkbos
- 隱藏域 hidden
- 密碼框 password
- 。。。
表單的目的:提交信息
獲得要提交的信息
<form action="post"><p><span>用戶名:</span><input type="text" id="username"></p><!-- 多選框的值,就是定義好的 value 值 --><p><span>性別:</span><input type="radio" name="sex" value="man" id="boy"/> 男<input type="radio" name="sex" value="women" id="girl"/> 女</p></form><script>var input_text = document.getElementById('username');var boy_radio = document.getElementById('boy');var girl_radio = document.getElementById('girl');//得到輸入框的值input_text.value//修改輸入框的值input_text.value = '123'// 對于單選框,多選框等等固定的值boy_radio.value 只能取到當前的值boy_radio.checked //查看返回的結果,是否為true,若果為true,則被選中~// false// girl_radio.checked// truegirl_radio.checked = true; //賦值//trueboy_radio.checked = true//true</script>提交表單。md5 加密密碼,表單優化
<!-- 表單綁定提交事件 onsubmit= 綁定一個提交檢測的函數 , true, false 將這個結果返回表單, 使用 onsubmit 接受! onsubmit="return aaa()" --> <form action="https://www.baidu.com/" method="post" onsubmit="return aaa()"><p><span>用戶名:</span> <input type="text" id="username" name="username"></p><!-- 多選框的值,就是定義好的 value 值 --><p><span>密碼:</span> <input type="password" id="input-password" ></p><input type="hidden" name="password" id="md5-password" /><!-- 綁定時間 onclick 被點擊 --><button type="submit" >提交</button></form><script>function aaa() {alert(1);var uname = document.getElementById('username');// var pwd = document.getElementById('password');var pwd = document.getElementById('input-password');var md5pwd = document.getElementById('nd5-password');// console.log(uname.value);// console.log(pwd.value);// // MD5 算法// pwd.value = md5(pwd.value);// console.log(pwd.value);md5pwd.value = md5(pwd.value);// 可以效驗判斷表單內容, true就是通過提交,false,阻止提交return true;}</script>10、jQuery
JavaScript
jQuery庫,里面存在大量的 Javascript函數
獲取
公式: $(selector).action()
符號(選擇器). 事件(事件函數)
選擇器
//原生 js,選擇器少,麻煩不好記//標簽document.getElementsByTagName();//IDdocument.getElementById();//類document.getElementsByClassName();// jQuery css 中的選擇器它全都可以用$('p').click(); //標簽選擇器$('#id1').click(); //id選擇器$('.class1').click(); //id選擇器文檔工具站:http://jquery.cuishifeng.cn/
事件
鼠標事件,鍵盤事件,其他事件
設置捕獲鼠標動態定位
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><title>Title</title><script src="lib/jquery-3.6.0.js"></script><style>#divMove{width: 500px;height: 500px;border: 1px solid red;}</style></head><body><!-- 要求:獲取鼠標當前的坐標 -->mouse: <span id="mouseMove"></span><div id="divMove">在這里移動鼠標試試</div><script>//當網頁元素加載完畢之后,響應事件// $(document).ready(function (){// 默認文檔 默認加載完// }) 的簡寫如下$(function () {$('#divMove').mousemove(function (e) {$('#mouseMove').text('x:'+e.pageX + 'y:'+e.pageY)})});</script></body> </html>操作DOM
節點文本操作
$('#test-ul li[name="python"]').text(); //屬性選擇器;獲得值 $('#test-ul li[name="python"]').text('設置值'); //設置值 $('#test-ul ').html(); //獲得值 $('#test-ul ').html(); //設置值 //區別:text()只能改變文本,html()可以改變頁面標簽代碼css的操作
$('#test-ul li[name="python"]').css("color","red");元素的顯示和隱藏:本質 display = none;
$('#test-ul li[name="python"]').show(); //顯示 $('#test-ul li[name="python"]').hide(); //隱藏娛樂測試
$(window).width() //1536 $(window).height() //287 $('#test-ul li[name="python"]').toggle();未來 ajax();
$('#from').ajax()$.ajax({ url: "test.html", context:docment.body, success: function(){$(this).addclass("done"); }})小技巧
1、如果鞏固 JS (看jQuery 源碼)
2、鞏固HTML.CSS (扒網站,全部down下來,然后對應修改看效果~)
Layer 彈窗組件
Element-ui
總結
- 上一篇: AI 作画:Stable Diffusi
- 下一篇: 【Shell】 sed/tr替换换行符