Javascript

一.Javascript簡介javascript

1.web前端有三層:
html

  HTML:從語義的角度,描述頁面結構前端

  CSS:從審美的角度,描述樣式(美化頁面)java

  JavaScript:從交互的角度,描述行爲(提高用戶體驗)python

2.變量es6

  JavaScript中,只用定義一個變量:web

var a;

3.JavaScript是前臺語言數據庫

  JavaScript是前臺語言,而不是後臺語言。express

  JavaScript運行在用戶的終端網頁上,而不是服務器上,因此咱們稱爲「前臺語言」。JavaScript就是一個簡單的製做頁面效果的語言,就是服務於頁面的交互效果、美化、絢麗、不能操做數據庫。編程

  後臺語言是運行在服務器上的,好比PHP、ASP、JSP等等,這些語言都可以操做數據庫,都可以對數據庫進行「增刪改查」操做。Node.js除外

4.JavaScript的組成

JavaScript基礎分爲三個部分:

  ECMAScript:JavaScript的語法標準, 包括變量 , 表達式 , 運算符 , 函數 , if語句 , for語句等.

  DOM : 操做網頁上的元素的API. 好比讓盒子移動 , 變色 , 輪播圖等.

  BOM : 操做瀏覽器部分功能的API. 好比讓瀏覽器自動滾動

5.JavaScript的特色

  (1)簡單易用:可使用任何文本編輯工具編寫,只須要瀏覽器就能夠執行程序。

  (2)解釋執行(解釋語言):事先不編譯、逐行執行、無需進行嚴格的變量聲明。

  (3)基於對象:內置大量現成對象,編寫少許程序能夠完成目標

二.JavaScript的代碼

  在頁面中,咱們能夠在body標籤中放入<script type=」text/javascript」></script>標籤對兒,<script type=」text/javascript」></script>標籤對兒

<script type="text/javascript">

</script>

1.alert語句

<script type="text/javascript">
       alert("小馬哥");
</script>

alert(英文翻譯爲「警報」)的用途:彈出「警告框」

2.語法規則

  (1)JavaScript對換行、縮進、空格不敏感。

      備註:每一條語句末尾要加上分號,雖然分號不是必須加的,可是爲了程序從此要壓縮,若是不加分號,壓縮以後將不能運行。

  (2)全部的符號,都是英語的。好比括號、引號、分號。

  (3)JavaScript的註釋:

    單行註釋:

// 我是註釋

    多行註釋:

/*
    多行註釋1
    多行註釋2
*/

備註:sublime中,單行註釋的快捷鍵是ctrl+/,多行註釋的快捷鍵是ctrl+shift+/

3.JavaScript在網頁中輸出信息的寫法

  彈出警告框 : alert(" ")

  控制檯輸出 : console.log(" ")

console.log("")表示在控制檯中輸出。console表示「控制檯」,log表示「輸出」。

4.用戶輸入 : prompt()語句

  prompt()就是專門用來彈出可以讓用戶輸入的對話框。

<script type="text/javascript">
        var a = prompt('今天是什麼天氣?');
        console.log(a);
</script>

上方代碼中,用戶輸入的內容,將被傳遞到變量 a 裏面。

效果:

  prompt()語句中,用戶無論輸入什麼內容,都是字符串。

  alert和prompt的區別:

alert("從前有座山");                //直接使用,不須要變量
var a = prompt("請輸入一個數字");   // 必須用一個變量,來接收用戶輸入的值

5.直接量 : 數字和字符串

  "直接量"即常量, 也成爲"字面量". 看見什麼,他就是什麼.

 簡單的直接量有2種:數字、字符串。

  (1)數值的直接量的表達很是簡單,寫上去就好了,不須要任何的符號。例如:

alert(886);  //886是數字,因此不須要加引號。

  (2)字符串也很簡單,但必定要加上引號。能夠是單詞、句子等。

6.變量

  變量的定義和賦值

   var a = 100;

var是英語「variant」變量的縮寫。後面要加一個空格,空格後面的東西就是「變量名」,

  • 定義變量:var就是一個關鍵字,用來定義變量。所謂關鍵字,就是有特殊功能的小詞語。關鍵字後面必定要有空格隔開。

  • 變量的賦值:等號表示賦值,將等號右邊的值,賦給左邊的變量。

  • 變量名:咱們能夠給變量任意的取名字。

變量要先定義,才能使用。好比,咱們不設置變量,直接輸出:

<script type="text/javascript">
        console.log(a);
  </script>

控制檯將會報錯:

正確的寫法:

 var a;   // 定義
    a = 100;  //賦值
    console.log(a);  //輸出100

還能夠這樣:

var a = 100;    //定義,而且賦值100
console.log(a);  //輸出100

7.變量的命名規範

  變量名有命名規範:只能由英語字母、數字、下劃線、美圓符號$構成,且不能以數字開頭,而且不能是JavaScript保留字。

  大寫字母是可使用的,而且大小寫敏感。也就是說A和a是兩個變量。

8.變量的類型

  (1)數值型 : number

   若是一個變量中,存放了數字,那麼這個變量就是數值型的

    var a = 100;            //定義了一個變量a,而且賦值100
    console.log(typeof a);  //輸出a變量的類型

     typeof()表示「獲取變量的類型」,語法爲:

typeof 變量

  在JavaScript中,只要是數,就是數值型(number)的。不管整浮、浮點數(即小數)、不管大小、不管正負,都是number類型的。

  (2)字符串 : string

 

var a = "abcde";
    var b = "路飛";
    var c = "123123";
    var d = "哈哈哈哈哈";
    var e = "";     //空字符串

    console.log(typeof a);
    console.log(typeof b);
    console.log(typeof c);
    console.log(typeof d);
    console.log(typeof e);

 

  (3)連字符和加號的區別

    鍵盤上的+多是連字符,也多是數字的加號。

 console.log("我" + "愛" + "你");   //連字符,把三個獨立的漢字,鏈接在一塊兒了
    console.log("我+愛+你");           //原樣輸出
    console.log(1+2+3);             //輸出6

總結:若是加號兩邊都是數值,此時是加。不然,就是連字符(用來鏈接字符串)。

9.變量值的傳遞(賦值)

語句:

   a = b;

把b的值賦給a,b不變。

將等號右邊的值,賦給左邊的變量;等號右邊的變量,值不變。

舉個特殊的例子:

        var a = "3";
        var b = 2;
        console.log(a-b);   結果: 1

效果:(注意,字符串 - 數值 = 數值)

10.變量格式轉換

  (1)用戶的輸入

  prompt()就是專門用來彈出可以讓用戶輸入的對話框。重要的是:用戶無論輸入什麼,都是字符串。

  (2)字符串轉數字 : parseInt() 

  parseInt()能夠將字符串轉數字。parse表示「轉換」,Int表示「整數」(注意Int的拼寫)。

 parseInt(「5」);

parseInt()還具備如下特性

  (1)帶有自動淨化的功能;只保留字符串最開頭的數字,後面的中文自動消失。

console.log(parseInt("2018你真帥!!");

  (2)自動帶有截斷小數的功能:取整,不四捨五入

var a = parseInt(5.8) + parseInt(4.7);
console.log(a);   #9


 var a = parseInt(5.8 + 4.7);
 console.log(a);   #10

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
         // 聲明變量
         // 聲明並賦值
         var a = 2;
         var b;
         b = 3;
         var c = '2';

         // window能夠省略不寫
         console.log(window.a);
         console.log(b);
         console.log(c);
         // typeof 檢測數據類型
         console.log(typeof a);
         console.log(typeof c);
         // 一個數值+一個字符串 瀏覽器會把數值類型隱式轉換。
         console.log(a+c);
         // 隱式轉換==》數值類型轉換字符串
         console.log(a+'');
         // alert(c);

         // var a = prompt('今天是什麼天氣?');
         // console.log(a);

         // Uncaught ReferenceError: e is not defined
         // console.log(e);


         var e;
         // undefined
         console.log(e);
         console.log(typeof e);
         console.log("我" + "愛" + "你");

         // console.log(c-a); 
         console.log(parseInt(c));
         console.log(parseInt("2018你真帥!!"));

         // ***
         var a1 = 5/0;
         console.log(a1); //Infinity無限大
         console.log(typeof a1);

         /**/
    </script>
</head>
<body>
        
</body>
</html>
JavaScript的代碼

三.數據類型

數據類型包括:基本數據類型和引用數據類型

基本數據類型指的是簡單的數據段,引用數據類型指的是有多個值構成的對象。

當咱們把變量賦值給一個變量時,解析器首先要確認的就是這個值是基本類型值仍是引用類型值

1.基本數據類型

  number

var a = 123;
//typeof 檢查當前變量是什麼數據類型
console.log(typeof a)
//特殊狀況
var a1 = 5/0;
console.log(typeof e1) //Infinity 無限大. number類型

  string

var str  = '123'
console.log(typeof str)

  boolean

var b1 = false;
console.log(typeof b1)

  null

var c1 = null;//空對象. object
console.log(c1)

  undefined

var d1;
//表示變量未定義
console.log(typeof d1)

2.引用數據類型

  • Function
  • Object
  • Arrray
  • String
  • Date

四.運算符

1.賦值運算符

   以var x = 12,y=5來

2.算數運算符

  var a = 5,b=2

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript" src="./index.js"></script>
    <script>
        // alert(2);
        var a = 5;
        
        //var x = a++; 先將a的值賦值給x,x輸出5,再對a++ a就是6
        // var x = a++;
        // console.log(a); //6
        // console.log(x); //5

        var x = ++a;
        // 先a++,再賦值
        console.log(a); //6
        console.log(x); //6
    </script>
    
</body>
</html>
a++

3.比較運算符

  var x = 5;

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        var a = 2;
        var b = '2';

        // 比較的是值
        console.log(a==b);

        // python中is  它比較的是數值+數據類型(內存地址)
        console.log(a===b);

        console.log(a!=b);

    </script>
</body>
</html>
比較運算符

4.特殊狀況

  字符串拼接+字符串運算

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    
    <script>

        /*

        2003年3月20日,伊拉克戰爭爆發,以美軍爲主的聯合部隊僅用20多天就擊潰了薩達姆的軍隊。這是繼十多年前的海灣戰爭後,美軍又一次取得的大規模壓倒性軍事勝利

        */

        
        var name = '伊拉克';
        var am = '美軍';
        // 字符串拼接
        // var str = "2003年3月20日,"+name+"戰爭爆發,以美軍爲主的聯合部隊僅用20多天就擊潰了薩達姆的軍隊。這是繼十多年前的海灣戰爭後,"+am+"又一次取得的大規模壓倒性軍事勝利。";
        // var str = "2003年3月20日,"+name+"戰爭爆發,以美軍爲主的聯合部隊僅用20多天就擊潰了薩達姆的軍隊。這是繼十多年前的海灣戰爭後,美軍又一次取得的大規模壓倒性軍事勝利";

        // ***** es6的模塊字符串 tab鍵上面的反引號 `` 添加變量使用${變量名}*****
        var str = `2003年3月20日,${name}戰爭爆發,以${am}爲主的聯合部隊僅用20多天就擊潰了薩達姆的軍隊。這是繼十多年前的海灣戰爭後,美軍又一次取得的大規模壓倒性軍事勝利。`;

        console.log(str);

        var a1 = '1';
        var a2 = '2';
        console.log(a1-a2);
        var b1 = 'one';
        var b2  = 'two';

        console.log(b1*b2); //NaN  not a number

        console.log(typeof(b1*b2)); //number

    </script>
</body>
</html>
字符串的拼接
// 不能對字符串進行+運算 只能拼接
var a1 = '1';
var a2 = '2';
console.log(a1-a2) //12


var b1 = 'one';
var b2  = 'two';

// NaN. ==== not a number 是number類型
console.log(typeof(b1*b2))

五.數據類型的轉換

1.將數值類型轉換成字符串類型

  隱式轉換

var n1 = 123;
var n2 = '123';
var n3 = n1+n2;
// 隱式轉換
console.log(typeof n3);

  強制類型轉換

// 強制類型轉換String(),toString()
var str1 = String(n1);
console.log(typeof str1);

var num = 234;
console.log(num.toString())

2.將字符串類型轉換成數值類型

var  stringNum = '789.123wadjhkd';
var num2 =  Number(stringNum);
console.log(num2)

// parseInt()能夠解析一個字符串 而且返回一個整數
console.log(parseInt(stringNum))
console.log(parseFloat(stringNum));

 3.任何數據類型均可以轉換爲boolean類型

var b1 = '123';
var b2 = 0;
var b3 = -123

var b4 = Infinity; 
var b5 = NaN;

var b6; //undefined
var b7 = null;

// 非0既真
console.log(Boolean(b7))

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <script>
            
        //String() toString() 強制類型轉換
        var a = 123;
        var astr = String(a);
        console.log(astr);

        console.log(a.toString());


        var stringNum = '789.123dadadad';
        var num2 =  Number(stringNum); //NaN
        console.log(num2);


        var b1 = '123'; //true
        var b3 = -123; 
        var b4 = Infinity; 



        var b5 = NaN; //false
        var b2 = 0; //false
        var b6; //undefined
        var b7 = null;
        // 非0既真
        console.log(Boolean(b7));

    </script>
    
</body>
</html>
數據類型的轉換

六.流程控制

1. if  , if-else , if-else if-else

var ji  = 20;
if(ji >= 20){
    console.log('恭喜你,吃雞成功,大吉大利')
}
alert('alex');//下面的代碼還會執行



var ji  = 20;
if(ji>=20){
    console.log('恭喜你,吃雞成功,大吉大利')
}else{
    console.log('很遺憾 下次繼續努力')

}



if (true) {
   //執行操做
}else if(true){
    //知足條件執行            
}else if(true){
   //知足條件執行        
}else{
  //知足條件執行
}

2.邏輯與&& , 邏輯或||

//1.模擬  若是總分 >400 而且數學成績 >89分 被清華大學錄入
//邏輯與&& 兩個條件都成立的時候 才成立
if(sum>400 && math>90){
    console.log('清華大學錄入成功')
}else{
    alert('高考失利')
}


//2.模擬 若是總分>400 或者你英語大於85 被複旦大學錄入
//邏輯或  只有有一個條件成立的時候 才成立
if(sum>500 || english>85){
    alert('被複旦大學錄入')
}else{
    alert('高考又失利了')
}

3.switch

var gameScore = 'better';

switch(gameScore){

//case表示一個條件 知足這個條件就會走進來 遇到break跳出。break終止循環。若是某個條件中不寫 break,那麼直到該程序遇到下一個break中止
    case 'good':
    console.log('玩的很好')
    //break表示退出
    break;
    case  'better':
    console.log('玩的老牛逼了')
    break;
    case 'best':
    console.log('恭喜你 吃雞成功')
    break;

    default:
    console.log('很遺憾')

}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <script>
        // switch (expression) {
        //     case label_1:
        //         // statements_1
        //         break;
        //     default:
        //         // statements_def
        //         break;
        // }

        /*
        var age = 31;
        switch(age){
            case 18:
            console.log('成年了');
            break;
            case 26:
            console.log('成年了2');
            break;
            case 30:
            console.log('成年了3');
            break;
            default:
              console.log('很遺憾')
        }
        */
        
    </script>
</body>
</html>
switch

4.while循環

循環三步走:

  1.初始化循環變量

  2.判斷循環條件

  3.更新循環變量

var i = 1; //初始化循環變量

while(i<=9){ //判斷循環條件
    console.log(i);
    i = i+1; //更新循環條件
}

5.do_while

//無論有沒有知足while中的條件do裏面的代碼都會走一次
var i = 3;//初始化循環變量
do{

    console.log(i)
    i++;//更新循環條件

}while (i<10) //判斷循環條件

6.for循環

for(var i = 1;i<=10;i++){
     console.log(i)
 }

 

for(var i = 1;i<=100;i++){
    if(i%2==0){
        //是偶數
        console.log(i)
    }
}
求偶數
var sum = 0;
for(var j = 1;j<=100;j++){
    sum = sum+j
}
console.log(sum)
1-100之間的全部數之和

  雙重for循環

for(var i=1;i<=3;i++){
            
   for(var j=0;j<6;j++){
        document.write('*')
    }
            
   document.write('<br>')
 }

 

for(var i=1;i<=6;i++){
   for(var j=1;j<=i;j++){
        document.write("*");
   }
                
     document.write('<br>');
}
輸出直角三角形
for(var i=1;i<=6;i++){ //行數
                
                //控制咱們的空格數
                for(var s=i;s<6;s++){
                    document.write('&nbsp;')
                }
            

                for(var j=1;j<=2*i-1;j++){
                    document.write('*')
                }
                document.write('<br>')
                
            }
輸出等腰三角形

七.經常使用內置對象

數組Array

1.數組的建立方式

  子面量方式建立

var colors = ['red','color','yellow'];

  使用構造函數的方式建立 使用new關鍵詞對構造函數進行建立對象

 var colors2 = new Array();

2.數組的賦值

var arr = [];
//經過下標進行一一賦值
arr[0] = 123;
arr[1] = '哈哈哈';
arr[2] = '嘿嘿嘿'

3.數組的經常使用方法

3.1 數組的合併 concat()

var north = ['北京','山東','天津'];
var south = ['東莞','深圳','上海'];
        
var newCity = north.concat(south);
console.log(newCity)

3.2 join() 將數組中的元素使用指定的字符串鏈接起來,它會造成一個新的字符串

var score = [98,78,76,100,0];
var str = score.join('|');
console.log(str);//98|78|76|100|0

3.3 將數組轉換成字符串 toString()

var score = [98,78,76,100,0];
//toString() 直接轉換爲字符串  每一個元素之間使用逗號隔開
           
var str = score.toString();
console.log(str);//98,78,76,100,0

3.4 slice(start,end); 返回數組的一段,左閉右開

var arr = ['張三','李四','王文','趙六'];
var newArr  = arr.slice(1,3);
console.log(newArr);//["李四", "王文"]

3.5 pop 移除數組的最後一個元素

var arr = ['張三','李四','王文','趙六'];
var newArr  = arr.pop();
console.log(newArr);//["張三", "李四","王文"]

3.6 push() 向數組最後添加一個元素

var arr = ['張三','李四','王文','趙六'];
var newArr  = arr.push('小馬哥');
console.log(newArr);//["張三", "李四","王文","趙六","小馬哥"]

3.7 reverse() 翻轉數組

var names = ['alex','xiaoma','tanhuang','angle'];
       
//4.反轉數組
names.reverse();
console.log(names);

3.8 sort對數組排序

var names = ['alex','xiaoma','tanhuang','abngel'];
names.sort();
console.log(names);// ["alex", "angle", "tanhuang", "xiaoma"]

 3.9 判斷是否爲數組:isArray()

 布爾類型值 = Array.isArray(被檢測的值) 

4.字符串String

字符串方法

4.1 chartAt() 返回指定索引的位置的字符

var str = 'alex';
var charset = str.charAt(1);
console.log(charset);//l

4.2 concat 返回字符串值,表示兩個或多個字符串的拼接

var str1 = 'al';
var str2  = 'ex';
console.log(str1.concat(str2,str2));//alexex

4.3 replace(a,b) 將字符串a替換成字符串b

var a = '1234567755';
var newStr = a.replace("4567","****");
console.log(newStr);//123****755

4.4 indexof() 查找字符的下標,若是找到返回字符串的下標,找不到則返回-1 。跟seach()方法用法同樣

var str = 'alex';
console.log(str.indexOf('e'));//2
console.log(str.indexOf('p'));//-1

4.5 slice(start,end) 左閉右開 分割字符串

var str = '小馬哥';
console.log(str.slice(1,2));//馬

4.6 split('a',1) 以字符串a分割字符串,並返回新的數組。若是第二個參數沒寫,表示返回整個數組,若是定義了個數,則返回數組的最大長度

var  str =  '個人天呢,a是嘛,你在說什麼呢?a哈哈哈';
console.log(str.split('a'));//["個人天呢,", "是嘛,你在說什麼呢?", "哈哈哈"]

4.7 substr(statr,end) 左閉右開

var  str =  '個人天呢,a是嘛,你在說什麼呢?a哈哈哈';
console.log(str.substr(0,4));//個人天呢

4.8 toLowerCase()轉小寫

var str = 'XIAOMAGE';
console.log(str.toLowerCase());//xiaomage

4.9 toUpperCase()轉大寫

var str = 'xiaomage';
console.log(str.toUpperCase());

特別:

//1.將number類型轉換成字符串類型
var num = 132.32522;
var numStr = num.toString()
console.log(typeof numStr)
//四捨五入
var newNum = num.toFixed(2)
console.log(newNum)

5.Date日期對象

建立日期對象只有構造函數一種方式,使用new關鍵字

//建立了一個date對象
var myDate = new Date();

複製代碼
//建立日期對象
var myDate=new Date();
        
//獲取一個月中的某一天
console.log(myDate.getDate());

//返回本地時間
console.log(myDate().toLocalString());//2018/5/27 下午10:36:23
複製代碼

6.Math 內置對象

經常使用內置對象

 6.1 Math.ceil() 向上取整,'天花板函數'

var x = 1.234;
//天花板函數  表示大於等於 x,而且與它最接近的整數是2
var a = Math.ceil(x);
console.log(a);//2

6.2 Math.floor 向下取整,'地板函數'

var x = 1.234;
// 小於等於 x,而且與它最接近的整數 1
var b = Math.floor(x);
console.log(b);//1

6.3 求兩個數的最大值和最小值

//求 兩個數的最大值 最小值
console.log(Math.max(2,5));//5
console.log(Math.min(2,5));//2

6.4 隨機數 Math.random()

var ran = Math.random();
console.log(ran);[0,1)

若是讓你取100-200之間的隨機數,怎麼作?

背過公式:min - max之間的隨機數: min+Math.random()*(max-min)

八.函數

  函數:就是將一些語句進行封裝,而後經過調用的形式,執行這些語句。

函數的做用:

  1.將大量重複的語句寫在函數裏, 之後須要這些語句的時候 , 能夠直接調用函數,避免重複勞動。

  2.簡化編程 , 讓編程模塊化

  console.log("hello world");
    sayHello();     //調用函數
    //定義函數:
    function sayHello(){
        console.log("hello");
        console.log("hello world");
    }

  第一步 : 函數的定義

函數定義的語法:

function 函數名字(){

    }

解釋:

  function: 是一個關鍵字. 中文是"函數"  ,  "功能"

  函數名字: 命名規定和變量的命名規定同樣,  只能是字母、數字、下劃線、美圓符號,不能以數字開頭。

  參數:後面有一對小括號,裏面是放參數用的。

  大括號裏面,是這個函數的語句。

  第二步 : 函數的調用

函數調用的語法:

 函數名字();

函數的參數: 形參和實參

  注意:實際參數和形式參數的個數,要相同。

        sum(3,4);
        sum("3",4);
        sum("Hello","World");

        //函數:求和
        function sum(a, b) {
            console.log(a + b);
        }

函數的返回值

       console.log(sum(3, 4));

        //函數:求和
        function sum(a, b) {
            return a + b;
        }

九.僞數組 arguments

arguments表明的是實參。有個講究的地方是:arguments只在函數中使用

  (1)返回函數實參的個數:arguments.length

    fn(2,4);
    fn(2,4,6);
    fn(2,4,6,8);

    function fn(a,b,c) {
        console.log(arguments);
        console.log(fn.length);         //獲取形參的個數
        console.log(arguments.length);  //獲取實參的個數

        console.log("----------------");
    }

結果:

  (2)之因此說arguments是僞數組,是由於:arguments能夠修改元素,但不能改變數組的長短

    fn(2,4);
    fn(2,4,6);
    fn(2,4,6,8);

    function fn(a,b) {
        arguments[0] = 99;  //將實參的第一個數改成99
        arguments.push(8);  //此方法不經過,由於沒法增長元素
    }

清空數組的幾種方式:

   var array = [1,2,3,4,5,6];

    array.splice(0);      //方式1:刪除數組中全部項目
    array.length = 0;     //方式1:length屬性能夠賦值,在其它語言中length是隻讀
    array = [];           //方式3:推薦
相關文章
相關標籤/搜索