什么是JavaScript
一、概述
JavaScript是一門世界上最流行的腳本語言
一個合格的后端人員,必須要精通JavaScript
快速入門
一、引入JavaScript
-
內部標簽
<!-- script標簽(可以放到文件任何位置):里面寫JavaScript代碼 --> <script> //...... </script>
-
外部引入
<!-- 外部引入 --> <!-- 注意:script標簽必須成對出現 --> <script src="js/demo01.js"></script> <!-- 不用顯示定義type,默認為javascript --> <script type="application/javascript"></script>
二、基本語法
// 1.定義變量 [變量類型 變量名 = 變量值]
const score = 70;
// 2.條件控制
if (score === 70) {
alert("良好");
} else {
alert("其它");
}
//在瀏覽器的控制台輸出變量 console.log(score)
// 3.循環
// while循環 ( while(){} / do{}while() )
// for循環 ( for i / forEach()(ES5.1) / for of / for in(ES6) )
瀏覽器必備調試須知:
三、數據類型
數值、字符、布爾、文本、圖形、音頻、視頻等
-
數字 (number)
js不區分小數和整數12 //整數 12.1 //浮點數 1.12e2 //科學計數法 -99 //負數 NaN //非數值 Infinity //無窮大
-
字符串
'abc' "abc"
-
布爾值
true false
-
邏輯運算
&& || !
-
比較運算符(重要)
= == //等於(類型不一樣,值一樣,判斷為true) === //絕對等於(類型一樣,值一樣,判斷為true)
堅持不要使用==比較
注意:
- NaN與所有數值都不相等,包括自己
- 只能通過isNaN(NaN)來判斷,數值是否為NaN
浮點數問題
console.log((1/3) === (1 - (2 / 3))); //false
盡量避免使用浮點數進行運算,存在精度問題
Math.abs((1/3) - (1 - (2 / 3))) < 0.000000001 //解決方法
-
null 和 undefined
- null 空
- undefined 未定義
-
數組
Java的數組需要相同類型的對象,JS不需要。// 保證代碼的可讀性,盡量使用[] let array = [1, 2, 3, null, "hello", true]; array = new Array(1, 2, 3, null, "hello", true); // 越界輸出undefined console.log(array[2]);
-
對象
let person = { name: "ylf", age: 18, tags: ["java", "python", "c/c++"] }; console.log(person.age);
四、嚴格檢查模式
// 嚴格檢查模式,預防JavaScript的隨意性導致的問題(必須寫在第一行)
"use strict";
// 默認為全局變量,建議局部變量都是用let定義
let i = 1;
數據類型
一、字符串
-
正常字符串使用單引號或雙引號包裹
-
轉義字符
\' 單引號 \n 換行 \t 制表符 \u4e2d \u#### unicode字符 \x41 \x## ascii字符
-
多行字符串
// 反單引號 let msg = `Hello,world! nico,nico. `; console.log(msg);
-
模板字符串
let msg = "Hello, "; console.log(msg + "world!"); let name = "ylf!"; msg = `你好啊, ${name}`; console.log(msg);
-
字符串長度
string.length
-
字符串的可變性(不可變)
-
大小寫轉換(注意:不是屬性,是方法)
string.toUpperCase() string.toLowerCase()
-
string.indexOf("string")(通過子字符串獲取子字符串第一個字符位置)
-
string.substring()(截取字符串的一部分,返回一個新字符串)
[) string.substring(1) //從第一個字符截取到最后一個字符 string.substring(1,3) //[1,3)
二、數組
array可以包含任意的數據類型
let array = [1, 2, 3, null, "hello", true];
-
長度
array.length
注意:給array.length賦值,數組大小會發生變化:數組變大,增加下標對應元素為空;數組變小,元素丟失
-
indexOf()(通過元素獲取下標索引)
-
slice()(截取數組的一部分,返回一個新數組)類似字符串中的substring()
-
push(), pop()(尾部)
push() //將元素壓入到尾部 pop() //彈出尾部的一個元素
-
unshift(), shift()(頭部)
unshift() //將元素壓入到頭部 shift() //彈出頭部的一個元素
-
sort()(排序)
-
reverse()(元素反轉)
-
concat()
concat()沒有修改數組,只是返回一個新數組
-
join()(連接符)
打印拼接數組,使用特定的字符串連接
-
多維數組
三、對象
若干個鍵值對
let 對象名 = {
屬性名: 屬性值,
屬性名: 屬性值,
屬性名: 屬性值
}
JavaScript中的鍵都是字符串,值為任意對象!
- 對象賦值
- 使用不存在的對象屬性不報錯!undefined
- 動態刪減屬性
- 動態添加屬性
- 判斷屬性值是否在對象中
- 判斷屬性是否對象自身擁有的
四、Map和Set
ES6新特性
Map(鍵值對)
let map = new Map([["jack", 12], ["tom", 18], ["ylf", 20], ["jet", 30]]);
console.log(map.get("jack")); //獲取對應的鍵值
map.set("nico", 78); //添加鍵值對
map.delete("nico"); //刪除鍵值對
console.log(map.has("nico")); //判斷指定鍵值對是否存在
// 遍歷Map
for (let mapElement of map) {
console.log(mapElement);
}
Set(無序不重復集合)
let set = new Set([3, 1, 1, 2]);
set.add(4); //添加不重復元素到末尾
set.delete(4); //刪除指定元素
console.log(set.has(4)); //判斷指定元素是否存在
// 遍歷Set
for (let number of set) {
console.log(number);
}
函數
一、定義函數
// 定義方式一
function 函數名(形參) {
函數體;
return 返回值;
}
// 定義方式二
// function(){} 為匿名內部類,但是可以把結果賦值給變量名,通過變量名調用函數
let 函數名 = function(形參) {
函數體;
return 返回值;
}
// 如果沒有執行return,函數也會返回結果undefined
參數問題
JavaScript函數可以傳入任意個參數,也可以不傳入參數
傳入參數是否合法存在,不合法存在如何規避?
let abs = function(x) {
// 手動拋出異常來判斷
if (typeof x !== "number") {
throw "Not a number!";
}
if (x < 0) {
return -x;
} else {
return x;
}
};
arguments(包含所有傳入函數的參數,是一個數組)
多參數問題
rest(ES6引入新特性,獲取除了已經定義的參數之外的所有問題)
// 初始方法
if (arguments.length > 1) {
for (let i = 1; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
function fun(a, ...rest) {
for (let restElement of rest) {
console.log(restElement);
}
}
rest參數只能寫在最后面,必須用...標識
二、變量作用域
三、方法
對象里的叫方法
// 定義方法方式(方法就是把函數放入對象里,對象由屬性和方法構成)
let person = {
name: "YLF",
birth: 1999,
// 方法
age: function () {
let fullYear = new Date().getFullYear();
return fullYear - this.birth;
}
}
面向對象語言中 this 表示當前對象的一個引用。
但在 JavaScript 中 this 不是固定不變的,它會隨着執行環境的改變而改變。
- 在方法中,this 表示該方法所屬的對象。
- 如果單獨使用,this 表示全局對象。
- 在函數中,this 表示全局對象。
- 在函數中,在嚴格模式下,this 是未定義的(undefined)。
- 在事件中,this 表示接收事件的元素。
- 類似 call() 和 apply() 方法可以將 this 引用到任何對象。
內部對象
標准對象
一、Date
let date = new Date();
console.log("date: ");
console.log(date);
console.log("星期: ");
console.log(date.getDay());
console.log("月: ");
console.log(date.getMonth());
console.log("日: ");
console.log(date.getDate());
console.log("年: ");
console.log(date.getFullYear());
console.log("時: ");
console.log(date.getHours());
console.log("分: ");
console.log(date.getMinutes());
console.log("秒: ");
console.log(date.getSeconds());
console.log("時間戳: ");
// 表示從 1970 年 1 月 1 日 00:00:00 UTC 到給定日期之間經過的毫秒數
console.log(date.getTime());
二、JSON
早期所有數據傳輸習慣使用XML文件
- JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式
- 簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言
- 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網絡傳輸效率
JSON 與 JS 對象的關系
JSON 是 JS 對象的字符串表示法。它使用文本表示一個 JS 對象的信息,(JSON)本質是一個字符串。
如:
var obj = {a: 'Hello', b: 'World'}; //這是一個js對象,注意js對象的鍵名也是可以使用引號包裹的,這里的鍵名就不用引號包含
var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字符串,本質是一個字符串
JSON(格式字符串) 和 JS 對象(也可以叫JSON對象 或 JSON 格式的對象)互轉(JSON.parse 和 JSON.stringify)。
要實現從JSON字符串轉換為JS對象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //結果是 {a: 'Hello', b: 'World'} 一個對象
要實現從JS對象轉換為JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'}); //結果是 '{"a": "Hello", "b": "World"}' 一個JSON格式的字符串
說句不嚴謹的話:JSON.parse() 就是字符串轉 js 對象, JSON.stringify()就是 js 對象轉字符串,它們前提是要 json 格式才有意義。
三、Ajax
- 原生的js寫法 xhr 異步請求
- JQuery封裝的方法 $("選擇器").ajax("")
- axios請求
面向對象編程
一、什么是面向對象
JavaScript,Java,C#
類(JavaScript中又稱原型對象)
對象
二、原型繼承
let student = {
name: "student",
age: 0,
run: function () {
console.log(this.name + ", run!");
}
};
let me = {
name: "ylf"
};
me.__proto__ = student;
三、class繼承
定義類
// ES6之前
function Student(name) {
this.name = name;
// this.hello = function f() {
// alert("Hello");
// }
}
Student.prototype.hello = function () {
alert("Hello");
}
class關鍵字是ES6引入的
// ES6之后
class Student {
constructor(name) {
this.name = name;
}
hello() {
alert("Hello");
}
}
// class繼承
class Pupil extends Student {
constructor(name, grade) {
super(name);
this.grade = grade;
}
play() {
alert("play");
}
}
本質還是原型繼承
四、原型鏈
操作BOM對象(重點)
一、瀏覽器
Javascript 和瀏覽器的關系:Javascript誕生是為了能夠在瀏覽器運行
BOM(Browser Object Model):瀏覽器對象模型
內核
- IE 6 - 11
- Chrome
- Safari
- FireFox
三方
- QQ瀏覽器
- 360瀏覽器
二、window對象(重要)
window代表瀏覽器窗口
window.innerHeight
182
window.innerWidth
1488
window.alert('hello')
三、navigator對象
封裝了瀏覽器的信息
navigator.appName
'Netscape'
navigator.appVersion
'5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.62'
navigator.platform
'Win32'
盡量避免使用navigator對象,因為它會被認為修改
四、screen對象
// 屏幕分辨率
screen.width
1536
screen.height
864
五、location對象(重要)
代表當前頁面的URL信息
host: "developer.mozilla.org"
href: "https://developer.mozilla.org/zh-CN/docs/Web/API/Window/outerHeight"
protocol: "https:"
reload: ƒ reload() // 刷新網頁
// 設置新的地址
location.assign('https://www.baidu.com/')
六、document對象(重要)
代表當前頁面
獲取具體的文檔樹節點
<ul id="ul">
<li>Java</li>
<li>C++</li>
<li>Python</li>
</ul>
<script>
let ul = document.getElementById("ul");
console.log(ul);
</script>
獲取cookie
document.cookie
'BAIDUID_BFESS=A57FC6971D87A9172CD9952274273C6B:FG=1; BIDUPSID=A57FC6971D87A9172CD9952274273C6B; PSTM=1645402825; BD_UPN=12314753; baikeVisitId=37443825-845d-443f-aacd-9504a8d0e3eb; RT="z=1&dm=baidu.com&si=gpeanogruej&ss=l09ccw1h&sl=2&tt=1m3&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=24y&ul=e6v0&hd=e6xc"; ZD_ENTRY=bing; BD_HOME=1; H_PS_PSSID=34429_35106_31253_34584_35871_35908_35946_35972_35984_35315_26350; BA_HECTOR=a42k0l248la1850he71h210ue0q'
截取cookie原理
服務器端可以設置cookie為httpOnly保證安全
七、history對象
代表瀏覽器歷史記錄
history.forward()
history.back()
操作DOM對象(重點)
DOM:文檔對象模型
瀏覽器網頁就是一個DOM樹形結構
- 更新DOM節點
- 遍歷DOM節點
- 刪除DOM節點
- 添加DOM節點
操作DOM節點需要先獲取它!
一、獲取DOM節點
// 對應css選擇器
let elementsByTagName = document.getElementsByTagName("h1");
let elementById = document.getElementById("paragraph");
let elementsByClassName = document.getElementsByClassName("paragraph");
let container = document.getElementById("container");
let children = container.children; // 獲取父節點的所有子節點
let parentNode = elementById.parentNode; //獲取父節點
這是原生代碼,之后盡量使用JQuery
二、更新DOM節點
<div id="container">
</div>
<script>
let elementById = document.getElementById("container");
</script>
-
更新文本
elementById.innerText = 123 // 修改文本值 elementById.innerHTML = "<strong>123</strong>" // 可以解析HTML文本標簽
-
操作CSS
elementById.style.color = "red"; // 屬性值使用字符串 elementById.style.fontSize = "50px" // -轉駝峰命名問題
三、刪除DOM節點
步驟:先獲取父節點,然后通過父節點刪除自己
<div id="container">
<h1>標題一</h1>
<p id="paragraph">段落一</p>
<p class="paragraph">段落二</p>
</div>
<script>
let elementById = document.getElementById("paragraph");
let parentNode = elementById.parentNode; //獲取父節點
parentNode.removeChild(elementById);
</script>
注意:刪除節點時是動態的,children是時空變化的
四、創建和插入DOM節點
節點為空時,使用 innerText 或者 innerHTML 可以添加DOM節點,但不為空時,其會覆蓋原來的DOM節點
追加DOM節點
<p id="outerParagraph">外部段落</p>
<div id="container">
<p id="innerParagraph1">內部段落一</p>
<p id="innerParagraph2">內部段落二</p>
<p id="innerParagraph3">內部段落三</p>
</div>
<script>
let outerParagraph = document.getElementById("outerParagraph");
let container = document.getElementById("container");
// DOM父節點追加一個已存在的DOM節點
container.appendChild(outerParagraph);
// 創建新DOM節點,並追加到DOM父節點后面
let htmlParagraphElement = document.createElement("p");
// htmlParagraphElement.setAttribute("id", "newNode");
htmlParagraphElement.id = "newNode";
htmlParagraphElement.innerText = "newNode";
container.appendChild(htmlParagraphElement);
</script>
向前插入DOM節點
<p id="outerParagraph">外部段落</p>
<div id="container">
<p id="innerParagraph1">內部段落一</p>
<p id="innerParagraph2">內部段落二</p>
<p id="innerParagraph3">內部段落三</p>
</div>
<script>
let outerParagraph = document.getElementById("outerParagraph");
let innerParagraph2 = document.getElementById("innerParagraph2");
let container = document.getElementById("container");
container.insertBefore(outerParagraph, innerParagraph2);
</script>
操作表單(驗證)
一、什么是表單
目的:提交信息
二、獲取和修改表單提交信息
<form action="#" method="post">
<span>用戶名:</span> <input type="text" id="username"> <br>
<input type="radio" id="male" name="sex" value="male"> 男
<input type="radio" id="female" name="sex" value="female"> 女
</form>
<script>
let username = document.getElementById("username");
let male = document.getElementById("male");
let female = document.getElementById("female");
//獲取文本框提交信息 username.value
//修改文本框提交信息 username.value = '123'
//獲取單選框提交信息
if (male.checked = true) {
console.log(male.value);
}
</script>
三、表單提交驗證及密碼MD5加密
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表單提交驗證及密碼MD5加密</title>
<!-- MD5工具類 -->
<script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script>
</head>
<body>
<!--
表單綁定事件
1.事件處理程序的返回值
在JavaScript中通常事件處理程序不需要有返回值,這時瀏覽器會按默認方式進行處理;
但很多情況下需要使用返回值,來判斷事件處理程序是否正確進行處理。
2.返回值類型:boolean值
瀏覽器根據返回值的類型決定下一步如何操作。當返回值為true,進行默認操作; 當返回值為 false,阻止瀏覽器下一步操作。
3.基本語法:事件句柄=“return 函數名(參數);"
-->
<form action="https://www.baidu.com" method="post" onsubmit="return check()">
<p>
<span>用戶名:</span>
<input type="text" name="username" id="username">
</p>
<p>
<span>密碼:</span>
<input type="password" name="password" id="password">
</p>
<p>
<!-- 按鈕綁定事件 onclick 被點擊 -->
<input type="submit" value="提交">
</p>
</form>
<script>
function check() {
let username = document.getElementById("username");
let password = document.getElementById("password");
// MD5加密
password.value = md5(password.value);
return false;
}
</script>
</body>
</html>
JQuery
JQuery庫,里面存在大量的JavaScript函數
一、JQuery入門
- 下載JQuery
-
引入JQuery
<!-- 方法一:CDN引入 --> <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <!-- 方法二:下載JQuery鏈接引入 --> <!-- <script src="../lib/jquery-3.6.0.js"></script> -->
-
使用JQuery
<a href="#" id="test-jquery">超鏈接</a> <script> // JQuery使用語法:$(選擇器).事件(事件函數) $("#test-jquery").click(function () { alert("Hello, JQuery!"); }) </script>
二、選擇器
jQuery API 中文文檔 | jQuery API 中文在線手冊 | jquery api 下載 | jquery api chm (cuishifeng.cn)
三、事件
鼠標事件、鍵盤事件、其它事件
獲取鼠標當前坐標
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>獲取鼠標當前坐標</title>
<script src="../lib/jquery-3.6.0.js"></script>
<style>
body {
height: 500px;
}
span {
width: 100px;
height: 100px;
display: block;
}
</style>
</head>
<body>
鼠標當前坐標:<span id="coordinate"></span>
<script>
// 當頁面加載完畢之后,響應事件
$(function () {
$("body").mousemove(function (coordinate) {
$("#coordinate").text("X坐標:" + coordinate.pageX + "\t" + "Y坐標:" + coordinate.pageY);
});
})
</script>
</body>
</html>
四、操作DOM對象
// 操作文本
//text(),html() 無參獲取文本值,有參設置文本值 html()可以解析HTML文本標簽
console.log($("#test-ul li[name=python]").text());
console.log($(".java").html());
// 操作CSS
$(".java").css({"color": "red", "font-size": 50});
// 元素展示和隱藏
$(".java").hide() //本質disply: none
$(".java").show()