javascript
JavaScript基础总结(1)
Javascript簡介
弱類型的腳本語言。代碼是逐行執(zhí)行的
分為嵌入式,外鏈式{<script scr=''></script>}
與用戶交互
1.alert :彈出警示框 2.prompt:彈出輸入框
3.console.log:在控制臺上打印 4.document.write:在頁面輸出、顯示
一. 變量
1.JS定義或者叫做聲明變量
語法: var 變量名 = 值
var 定義變量的關鍵字
空格 分割變量名和關鍵字的 必須有空格
變量名 你自己起的一個名字用來代表后面的一串東西的
等于號 在js里面 等于號就是賦值的意思 把右邊的內容賦值給左邊的變量名
值 你定義的變量代表的內容
##變量的命名規(guī)范和命名規(guī)則
1.規(guī)則:
1.1 一個變量只能有數字(0-9) 字母(a-zA-Z) 美元符($) 下劃線(_) 組成
1.2 一個變量不能有數字開頭
1.3 在JS中嚴格區(qū)分大小寫 比如說 num Num nUm nuM 等等都不是同一個變量
1.4 不能使用關鍵字或者保留字
關鍵字:現在JS語法中正在使用的關鍵字(比如說var)
保留字:現在JS還沒用 但是將來可能會用
2.規(guī)范:建議你去遵守,因為大家都這樣
2.1 不要使用中文命名
2.2 變量命名應該語義化
2.3 駝峰命名法 當一個變量是由多個單詞組成的時候 第二個單詞開始 首字母大寫
變量的語法:
| var age;console.log(age); | 只聲明,不賦值 | undefined |
| console.log(age); | 不聲明,不賦值直接使用 | 報錯 |
| age=10;console.log(age); | 不聲明,只賦值 | 10 |
console.log(num);變量提升//undefined
var num=1;
2.數據的類型
1.數值類型 number (表示整數和浮點數)
2.字符型 string (表示字符串)
3.布爾型 boolean{有兩個值1.ture 2.false} flag是布爾型的變量
4.未定義型 undefined (聲明變量,但沒有給值)
5.空型 null (清空變量)
6.數組 arr
7.對象 obj
2.1數據類型的轉換
1.數組類型轉換為字符串類型 to string()
var num=100;
console.log(num tostring());
console.log(typeof num tostring()) {這里typeof是檢測數據類型的}
2.利用string() 這是強制轉換,任何數據類型都可以轉換為子符串
var num1=100;
console.log(string(num1));
console.log(typeof string(num1))
3.利用加號拼接字符串的方法實現轉換效果
var num2=100;
console.log(num2+' ');
console.log(typeof (num2+' '))
4.其他類型的轉換位數字型
1.parseInt() 得到的是整數,沒有四舍五入
2.paseFloat() 得到的是浮點小數
3.number 強制轉換
二.比較、執(zhí)行算數運算
1.算數運算符
1.是由數字運算符變量等組成的式子。表達式最終都會有一個結果,返回給我們
2.遞增遞減
1.讓變量自己加一,不管是放在變量前面還是后面,遞增運算符都必須配合變量使用
++num 前置遞增 先自加一后返回值
num++ 后置遞增 先返回值后自加一
3.比較運算符
1.比較運算符
兩個數據進行比較的符號
// 1. > 左邊大于右邊 得到true
左邊不大于右邊 得到false
// 2. < 左邊小于右邊 得到true
// 左邊不小于右邊 得到false
// 3. >=
// 左邊大于或者等于右邊 得到true
// 左邊小于右邊 得到false
// 4. <=
// 左邊小于或者等于右邊 得到true
// 左邊大于右邊 得到false
// 5. ==
// 比較兩邊的數據值是不是相等,不管數據類型
// 6. ===
// 比較兩邊的數據是不是相等 值和數據類型都要比較
// 7. !=
// 比較兩邊的數據值是不是不等 不管數據類型
// 8. !==
// 比較兩邊的數據是不是不等 值和數據類型都要比較
// 值不一樣那可定是true 當數據類型不一樣的時候 那就是true 不再管值了
4.邏輯運算符
1.&& 邏輯與 都要滿足。兩側都為真的,一個假的,結果就是假的
2.|| 邏輯或 多個條件有一個都可以滿足 兩側只要一個為真,他就是真。兩側只要都是假,結果就是假
3.! 邏輯非 就是取反的意思 console.log(!true) //false 真的都能變?yōu)榧俚?/p>
5.賦值運算符
//賦值運算符:進行數據賦值的符號
// 1. =
// 賦值:把等于號右邊的賦值給左邊的變量
// 2. +=
// 這個是加法和賦值的合作
// a+=b 等價于 a=a+b 注意順序一定不能寫反了 就是自己在自己的基礎上疊加
// 因為你在計算數的時候是一樣的 a+b 和 b+a 沒區(qū)別
// 但是字符串在拼接的時候誰在前面誰在后面就有區(qū)別了
// 3. *=
// 這個是乘法和賦值的合作
// a=b 等價于 a=ab
// 在自己的基礎上進行疊加
// 4. /=
// 5. %=
// 6. -=
// = 直接賦值 var num=10;
// += -= 加減一個數后再賦值 var age=10; age+=5; console.log(age)
// = /= %= 乘等 除等 取模賦值 var age=2; age=5; console.log(age)
6.運算符的優(yōu)先級(權重)
優(yōu)先級 運算符 順序
// 1 小括號 ()
// 2 一元運算符 ++ -- !
// 3 算術運算符 先* / % 再+ -
// 4 關系運算符 > >= < <=
// 5 相等運算符 == != === !==
// 6 邏輯運算符 先邏輯與&& 再邏輯或 ||
// 7 賦值運算符 =
// 8 逗號運算符 , 聲明多個變量用逗號隔開
// 總結 一元運算符里面的邏輯非 ! 優(yōu)先級很高
// 邏輯與比邏輯或優(yōu)先級高
2.短路運算符
1.表達式1&&表達式2如果表達式1為真則返回表達式2,如果表達式均為真,則返回為真的最后一個表達式如果表達式1為假則返回表達式1,如果表達式中任何一個為真,則返回第一個為假的表達式如果有空或者否定意義的為假,其余都是真的 2.表達式1||表達式2(多個兩兩比較)如果1為真,則返回表達式1,后面的不在運算如果表達式為假,則返回最后一個為假的表達式如果表達式為1為假,則返回表達式2五種情況下為假:0,'_',Nan,null,undefined三.流程控制
流程控制:簡單理解就是控制我們的代碼按照什么結構順序來執(zhí)行,以便達到不同的運算結果
流程控制主要有三種結構:順序結構 分支結構 循環(huán)結構 代表三種代碼執(zhí)行順序
順序流程控制:是程序中最簡單,最基本的流程控制,他沒有特定的語法結構,程序會按照代碼的先后順序,依次執(zhí) 行,程序中大多是這樣執(zhí)行的,我們以前寫的代碼大部分就是按照順序結構來執(zhí)行的
分支流程控制:就是由上到下的執(zhí)行過程中,可以根據不通的條件,執(zhí)行不同的路徑代碼,從而得到不同的結果。
分支流程控制主要有兩種語句:if語句 switch語句
語句:理解成一個行為或者小動作 循環(huán)語句和分支語句就是典型的語句,一個程序有很多的語句構成,一般情況下,會分割成一個一個的語句。
1.if語句
1.1if條件語句:四種書寫方式
-
// 1-1. if(條件){要執(zhí)行的代碼} (分支結構)
-
// 當條件滿足的時候(也就是表達式為true)的時候 執(zhí)行大括號里面的代碼
-
// 當條件不滿足的時候(也就是表達式為false)的時候 不執(zhí)行大括號里面的代碼
-
// 1-2. if(條件){要執(zhí)行的代碼} else {要執(zhí)行的代碼} (雙分支語句)
-
// 當條件滿足的時候 執(zhí)行if后面大括號里面的代碼
-
// 當條件不滿足的時候 執(zhí)行else后面大括號里面的代碼
-
// 1-3. if(條件1){ 條件1要執(zhí)行的代碼} else if(條件2){條件2要執(zhí)行的代碼} (多分支語句)
-
// 從第一個開始 哪一個條件滿足了 就執(zhí)行哪一個{}里面的代碼
-
// 如果前面的滿足了 那么后面的就都不執(zhí)行了
-
// 若干個大括號 最多只能夠執(zhí)行一個
-
// 1-4. if(條件1){條件1要執(zhí)行的代碼} else if(條件2){條件2要執(zhí)行的代碼} else{所有的條件都不滿足的時候執(zhí)行的代碼}
-
// 從第一個開始 滿足哪一個條件 執(zhí)行哪一個大括號里面的代碼
-
// 前面的滿足了 后面的就都不執(zhí)行了
-
// 所有的條件都不滿足的時候 執(zhí)行else里面的代碼
-
// 若干個大括號 必然會執(zhí)行其中的一個
-
// 1-1 if語句
? //var n = 28;// if (n >= 18) {// ? ? console.log('可以進入網吧');// }// console.log('后續(xù)的代碼');
2.三元表達式
結構:條件表達式?表達式1:表達式2; var result=num<5?'你答對了':'你答錯了'; alert(result) 由?和冒號組成的式子叫三元表達式3.switch case 多分支判斷語句
switch(){case 1;console.log('');break;case 2;console.log('');default; } switch 語句執(zhí)行效率更高比if else語句。但主要適用于針對特殊值四.循環(huán)結構
1.for循環(huán)for(var i=1;i<=100;i++){console.log();循環(huán)體}var i=1;初始變量 i<=100;終止條件 ?目的:可以重復使用此代碼 2.for雙循環(huán)for(){for(){}}外層for循環(huán)是遍歷的次數,內層是交換的次數 3.while 循環(huán)var n = 8;while (n < 10) {console.log('我被執(zhí)行了');n++;}console.log('后續(xù)代碼'); 4.do while循環(huán)var i = 8;do{console.log('我被執(zhí)行了');i++;}while(i<=100);continue和break的區(qū)別:
1.continum 結束本次循環(huán),繼續(xù)執(zhí)行下一次代碼//continue案例 求1——100之間,除了能被7整除的數字之和 ?var sum = 0;for (var i = 1; i <= 100; i++) {if (i % 7 == 0) { //如果能夠被7整除continue; //就結束當前循環(huán)};sum += i; ?}console.log(sum);2.break ? 結束整個循環(huán),只要遇到break,立馬退出循環(huán)for (var i = 1; i <= 5; i++) {if (i == 3) {break;}console.log('我正在吃第' + i + '個包子');}console.log('沒吃飽'); ?五.數組
-
1.Array 數組:有兩種
-
var arr=new Array();
-
var arr=[ ];
-
總:數組和變量之間的區(qū)別:普通變量一次只能存儲一個值(數值型,字符串,布爾型,空值和undefined),數組一次可以存儲多個值,其中可含有有多個數據類型
-
2.數組的訪問 [ ]索引號
-
索引號,就是數組對象中每個數組 元素對應的序號從0開始
-
不僅可以通過索引號來訪問咱們的數組元素,還可以通過索引來設置,修改相對應得數組元素 數組名[索引]=值
-
給數組添加新元素通過數組名[新的索引]
-
-
3.數組遍歷
-
本質就是把數組的元素從頭到尾訪問一次 ,用for循環(huán)
-
for里面的數組元素 arr[i],里面的i是計數器,把i當做數組的索引號來用,從0開始;
-
-
4.數組長度
-
arr.length(長度)
-
通過length這個屬性來完成數組的長度。arr.length可以監(jiān)測數組元素的個數
-
數組的索引號和數組的長度有什么關系呢?
-
索引號是從0開始的,數組長的是元素的個數
-
-
-
數組的最大值
-
max 最大值 min 最小值
//遍歷數組中的最大值 // [2,6,1,77,52,25,7] //案例分析 //1.聲明一個保存最大值的變量max //2.默認最大值就是取數組中的第一個元素 //3.遍歷這個數組,把里面的每個數組元素和max相比較 //4.如果這個數組元素大于max就把這個數組元素保存到max里面,否則繼續(xù)下一輪比較 //5.最后輸出這個max即可 //var arr = [2, 6, 1, 77, 52, 25, 7, 102, 89, 98, 253];var max = arr[0];for (var i = 0; i < arr.length; i++) {// console.log(arr[i]);if (arr[i] > max) { max = arr[i];}}console.log('這個數組的最大值就是:' + max); 最小值同理
-
-
新增數組元素
-
修改length的長度來新增數組
-
修改索引號在結尾添加數組,但不要給數字名字直接賦值
//1.新增數組元素的方法有兩種//1.新增數組元素 通過修改length長度 增加空元素var arr = ['關羽', '張飛', '劉備', '諸葛亮'];console.log(arr.length); //4arr.length = 7; //把我的數組長度改為7,里面應該有7個數組元素 本來就4個,強制改成7,就會在原來基礎上加上3個空元素console.log(arr); //['關羽', '張飛', '劉備', '諸葛亮','empty','empty','empty'];console.log(arr[4]); //新增的空元素只是聲明了,沒有給賦值,所以就是undefinedconsole.log(arr[5]); //新增的空元素只是聲明了,沒有給賦值,所以就是undefinedconsole.log(arr[6]); //新增的空元素只是聲明了,沒有給賦值,所以就是undefined//2.新增數組元素 通過修改索引號 追加數組元素 增加或者替換實體元素var arr1 = ['關羽', '張飛', '劉備', '諸葛亮'];console.log(arr1); //['關羽', '張飛', '劉備', '諸葛亮']arr1[4] = '趙云';console.log(arr1); //索引號沒出現的叫做追加元素/['關羽', '張飛', '劉備', '諸葛亮','趙云']arr1[5] = '馬超';console.log(arr1); //索引號沒出現的叫做追加元素arr1[0] = '曹操';console.log(arr1); //索引號出現的叫做替換arr1 = '三國混戰(zhàn)';console.log(arr1); //千萬不要直接給數組名字賦值,否則里面的數組元素都沒有了
-
-
翻轉數組
(var i=arr.length-1;i >=0;i - -)
1.//將數組['關羽','張飛','趙云','馬超','諸葛亮']的內容反過來存放//1.聲明一個新數組 newArr//2.把舊數組的索引號第5個取過來(arr.length-1),給新數組索引號第0個元素(newArr.length)//3.我們采取遞減的方式 ? i--var arr = ['關羽', '張飛', '趙云', '馬超', '諸葛亮', '曹操'];var newArr = [];for (var i = arr.length - 1; i >= 0; i--) {newArr[newArr.length] = arr[i];}console.log(newArr);2.var str1='Hell0 world';console.log(str1.split('').reverse().join('')) 這里的split('')不能添加任何東西 -
篩選元素
-
數組去重或刪除指定的元素 數組名+索引的格式
//將數組[2,0,6,1,77,0,52,0,25,7]中大于等于10的數組元素篩選出來,并且放到新數組//1.聲明一個新的數組用于存放大于等于10的數組元素 var newArr//2.遍歷原來的舊數組,找出大于等于10的元素//3.使用新數組的數組長度屬性 ? newArr.length 剛開始length是0//4.依次追加給新數組newArrvar arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7, 105];var newArr = [];for (var i = 0; i < arr.length; i++) {if (arr[i] >= 10) {//新數組索引號應該從0開始,依次遞增newArr[newArr.length] = arr[i];//newArr.push(arr[i]);}}console.log(newArr);
-
-
冒泡排序
-
執(zhí)行的是從小到大,從大到小
-
比如:1---4 arr.length 4---1 arr.length-1
-
外層for遍歷的是次數 內層for交換的次數
-
if(比較運算符決定了從大到小還是從小的大)
-
轉換 var a=10,b=20;
-
var temp=' ';
-
temp=a;
-
a=b;
-
b=temp;
-
- var arr=[1,3,5,7,9,10]; for(var i=0;i<arr.length;i++){for(var j=0;j<arr.length-1;j++){第一種if(arr[j]>arr[j+1]){var temp=arr[j]arr[j]=arr[j+1]arr[j+1]=temp}第二種if(arr[j]>arr[j+1]){[arr[j],arr[j+1]]=[arr[j+1],arr[j]]}} } console.log(arr) ?
-
六.函數
-
用function表示,是聲明函數的關鍵字。
-
就是封裝了一段代碼可以重復執(zhí)行調用的代碼塊
-
目的:讓大量的代碼可以重復使用
-
使用函數分為兩部分:聲明函數和調用函數
-
function 函數名(){
}
函數名()
函數不調用,自己不執(zhí)行
-
-
函數的參數
function 函數名(形參){代碼塊 } 函數名(實參) 形參是接受實參 多個參數之間用逗號隔開 -
函數的返回值
function 函數名(){return; } 函數名() reture需要返回的結果 函數reture的特點 1.終止函數,reture后面的代碼不會被執(zhí)行 2.只能返回一個值,返回的結果是最后一個值.(誰在最后返回誰,逗號的情況下) 當我們的函數有return的時候,則返回return后面的的值,如果沒有return則返回undefined 總結: //break和continue和return的區(qū)別//break:結束當前循環(huán)(如for,while循環(huán))//continue:就跳出本次循環(huán),繼續(xù)執(zhí)行下次循環(huán)(如for,while循環(huán)) ?//上面兩個主要針對循環(huán) ?//return 不僅可以退出循環(huán),還能夠針對函數,結束當前函數,并且返回return語句后面的值 -
arguments使用
-
只有函數才可以使用arguments,arguments是函數所獨有的內置對象,存放所有的參數,arguments是一個偽數組,并不是真正意義上的數組
-
//1.具有數組的length屬性
//2.按照索引的方式進行存儲
//3.它沒有真正數組的一些方法 pop() push()等
簡單總結一下: ?? ? //什么是arguments arguments是函數所獨有的內置對象 它的展示形式就是一個偽數組 ?? ? //做什么用 ? ? 里面存放了用戶傳遞過來的所有實參 ?? ? //什么情況下使用: 當我們也不知道用戶到底傳多少個實參的時候,就用arguments ?? ? //有了arguments,我們不需要再去寫形參了,這就是arguments ? ?//利用arguments求任意個數的最大值function getMax() { //這里的arguments就相當于數組[1,2,3,4] 就是求數組[1,2,3,4]中的最大值var max = arguments[0];for (var i = 1; i < arguments.length; i++) {if (arguments[i] > max) {max = arguments[i];}}return max;}console.log(getMax(1, 2, 3, 4)); ?
-
-
函數的兩種聲明
//函數的兩種聲明方式//1.利用函數關鍵字定義函數(命名函數)function fn() { ?}fn();//2.利用函數表達式(匿名函數)聲明函數 不傳參數//var 變量名=function(){}var fun = function() {console.log('我是函數表達式'); ?}fun(); ?//傳參數var fun1 = function(aru) {console.log(aru); ?}fun1('陳飛燕');//1.fun是變量名 不是函數名//2.函數表達式聲明方式跟變量聲明差不多,只不過變量里面存的是值,var num=10 而函數表達式里面存的是函數//3.函數表達式也可以進行傳遞參數
七.作用域
-
分為兩種
-
1.全局作用域
-
在整個script標簽中,或者是一個單獨的JS文件(鏈入)
-
-
2.局部作用域
-
(又稱為函數作用域),在函數內部就是局部,這個代碼的名字只在函數內部起效果和作用
-
-
作用域:就是代碼名字(經常使用變量),在摸個范圍內起作用和效果,目的是為了提高程序的可靠性。更重要的是減少命名沖突
-
javascript 沒有塊級作用域,但在ES6新增了塊級
-
塊級作用域:{}表示的,如:if{},for{}
-
-
作用域鏈
-
1.內部函數訪問外部函數的變量,采取的是鏈式查找的方式來決定取哪個值,這種結構我們稱之為作用域鏈
-
采取就近原則
- //作用域鏈案例2var a = 1; ?function fn1() {var a = 2;var b = '22';fn2();console.log(b); ? ?function fn2() {var a = 3;fn3();console.log(b)console.log(a); ? ?function fn3() {var a = 4;console.log(a);console.log(b); ? ?}}}fn1();
-
八.預解析
-
js引擎運行js代碼分為兩步:預解析, 代碼執(zhí)行
-
1.什么叫預解析?
-
JS引擎會把JS里面的所有的var,還有function提升到當前作用域的最前面
-
-
2.什么叫代碼運行?
-
按照代碼書寫順序從上往下執(zhí)行
-
-
預解析分為兩種:變量預解析(變量提升)和函數預解析(函數提升)
-
1.變量提升:就是把所有變量提升到當前作用域的最前面,不提升賦值操作
-
2.函數提升:就是把所有函數聲明提升到當前作用域的最前面,不調用函數
- //案例2// var num = 10;// function fn() {// ? ? console.log(num);// ? ? var num = 20;// ? ? console.log(num);// }// fn();// console.log(num);//相當于執(zhí)行以下代碼// var num;// function fn() {// ? ? var num;// ? ? console.log(num); //undefined// ? ? num = 20;// ? ? console.log(num); //20// }// num = 10;// fn();
-
九.對象
-
object 對象·簡稱 obj
-
是一組無序的相關屬性和方法的集合具體的實實在在存在的
-
對象是由屬性和方法組成的
-
屬性:事物的特征(常用名字)
-
方法:事物的行為(常用動詞)
-
-
創(chuàng)建語法格式
-
對象的字面量{ }大括號
- 語法格式var obj = {uname: '可可',type: '阿拉斯加犬',age: '5歲',hair: 'Brownish red', //hair 頭發(fā)skill: function() {return '技能是:' + '汪汪汪' + '演電影'; ?}}; ?console.log(obj);console.log(obj.uname);console.log(obj['type']);console.log(obj.age);console.log(obj.hair);console.log(obj.uname, obj['type'], obj.age, obj.hair, obj.skill()); 符號:毛豆//區(qū)別//變量 單獨聲明并且賦值 使用的時候直接寫變量名 單獨存在//屬性 在對象里面的不需要聲明 使用的時候必須是 對象.屬性 對象['屬性']//2.函數和方法的相同點 都是實現某種功能 做某件事情//函數是單獨聲明的 并且調用的時候是 ? 函數名() ? 函數是單獨存在的//方法 在對象里面 ? 調用的時候 是 對象.方法()//變量:單獨聲明賦值 單獨存在//屬性:對象里面的變量稱為屬性,不需要聲明,用來描述該對象的特征//函數:單獨存在的 通過函數名()的方式就可以調用//方法:對象里面的函數稱為方法,方法不需要聲明,使用 對象.方法名()方式就可以調用 方法是用來描述對象的行為和功能
-
用new object 創(chuàng)建對象
- //利用new Object創(chuàng)建對象var obj = new Object(); //這里創(chuàng)建一個空對象obj.uname = '張三豐'; //等分obj.age = 18;obj.sex = '男';obj.sayHi = function() {console.log('我的子彈已經準備好了,臭哥哥');};//注意 (1)我們是利用等號賦值的方法 追加對象的屬性和方法// ? ? (2)每個屬性和方法之間用分號結束//在調用對象的時候是一樣的方法console.log(obj.uname);console.log(obj['sex']);obj.sayHi();符號:等分
-
構造函數
-
就是把我們對象里面一些相同的屬性和方法抽取出來封裝到函數里面
-
泛指某一大類,首字母要大寫,不需要reture就可以返回結果
-
調用構造函數必須使用new new star()
- 語法格式 function Star(name, age, sex) {this.name = name;this.age = age;this.sex = sex;this.skill = function() {return '唱歌';} ?}console.log(new Star('張學友', '18歲', '男'));
-
-
遍歷對象
-
用for in
-
語法格式
- for(變量 in ? 對象名){}
-
-
對象總結
-
對象是復雜類型:object
-
簡單的數據類型:number,string,boolean,nall,undefined
-
本質:是一組無序的相關屬性和方法的集合
-
-
九.內置對象
##
-
javascript分為三種:自定義,內置,瀏覽器 對象是獨有的
-
優(yōu)點:幫助我們快速開發(fā)
-
Math.pI 圓周率,屬性不帶小括號,方法帶小括號
-
Math.min()最小值
-
1.絕對值和三個取整
-
Math.abs()
-
Math.random() 隨機數
-
-
2.三個取整
-
1.Math.floor()向下取整,往小的取
-
2.Math.ceil()向上取整,往大的取
-
3.Math.round()四舍五入
-
得到一個兩數之間的隨機整數,可以取得到最小值,但最大值取不到
-
Math.floor(Math.randow()*(max-min))+min
-
-
兩個數都可以取到
-
Math.floor(Math.randow()*(max-min+1))+min
-
-
是的,沒有高深的知識,沒有進階的技巧。只要肯努力相信你也可以成為大佬的。一起加油(^U^)ノ~YO
總結
以上是生活随笔為你收集整理的JavaScript基础总结(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信内网页分享,分享者能看到分享的图片(
- 下一篇: 微服务Spring Boot 整合 Re