javascript基礎

智雲程式設計發表於2019-06-27

前端知識點總結——JS基礎

1.javascript概述(瞭解)

1.什麼是javascript

javascript簡稱為js,是一種執行於js直譯器/引擎中的指令碼語言
js的執行環境:
1.獨立安裝的js直譯器(node)
2.嵌入在瀏覽器核心中的js直譯器

2.js的發展史

1.1992年Nombas公司為自己開發了一款指令碼語言SciptEase
2.1995年Netscape(網景)開發了一款指令碼語言LiveScrpt,後來更名javascript
3.1996年Microsoft在IE3.0版本中克隆javascript,JScript
4.1997年,javascript提交給ECMA(歐洲計算機制造商聯合會)。定義ECMAScript,簡稱ES5,ES6

3.js組成部分

1.核心(ECMAScript)
2.DOM (Document object model)文件物件模型
3.BOM (Browser object model)瀏覽器物件模型

4.js的特點

1.語法類似於c,java
2.無需編譯,由js直譯器直接執行
3.弱型別語言
4.物件導向的

2.JavaScript的基礎語法

1.使用javascript

1.搭建執行環境
  1.獨立安裝的JS直譯器-NodeJS
    1.在命令列介面:輸入node
  console.log("你好,世界");
  在控制檯列印輸出
  說明:js是可以獨立在js直譯器中執行
2.使用瀏覽器核心中嵌的js直譯器
  瀏覽器核心負責頁面內容的渲染,由兩部分組成:
     內容排版引擎-解析:HTML/CSS
     指令碼解釋引擎-解析:javascript
 1.直接在Console(控制檯)中輸入指令碼並執行
 2.將js指令碼嵌入在HTML頁面中執行
   1.html元素的事件中執行js指令碼
      事件-onclick-滑鼠單擊時要執行的操作
   2.在<script>中編寫指令碼並執行
      網頁的任何位置處,嵌入一對<script>標記,並且將指令碼編寫在<script>標記中。
       3.使用外部指令碼檔案(.js為字尾)
     1.建立指令碼檔案(.js)並在檔案中編寫指令碼
     2.在使用的網頁中引用指令碼檔案
        <script src="指令碼檔案的url"></script>
 3.js除錯,F12檢視錯誤,出錯時不影響其它程式碼塊,後續程式碼繼續執行。
   <script>
    /*這個指令碼錯誤*/
    document.writ("<h3>周芷若</h3>");
       </script>
      <script>
    /*繼續執行*/
        console.log("金花婆婆");  
      </script>
    3.透過語法規範
  1.語句:可執行的最小單元
          必須以;結束
      嚴格區分大小
      所有的符號必須是英文
      2.註釋:
    // :單行註釋
    /**/:多行註釋

3.變數和常量

1.變數宣告

1.宣告變數
  var 變數名;
2.為變數賦值
  變數名=值;
3.宣告變數是直接賦值
  var 變數名=值;
  ex:
  var uname="張無忌";
  var age=20;
 注意:
   1.允許在一條語句中宣告多個變數,用逗號隔開變數名。
     var uname="韓梅梅",uage=20;
   2.如果宣告變數,但未賦值,則值預設為undefined
   3.宣告變數時可以不適用var,但不推薦
     uname="tom";

2.變數名的規範

1.不允許以數字開頭
2.不允許使用關鍵詞和保留關鍵字
3.最好見名知意
  var uname; var uage;
4.允許包含字母,數字,下劃線(_),$
  var $name="Tom";
5.儘量使用小駝峰命名法
  var userName;
  var uname;
  var _uname;//下劃線
  var user_name;//下劃線
  var UserName;//大駝峰命名法

4.變數的使用

1.宣告變數未賦值,值預設為undefined
2.使用未宣告過的變數 報錯
3.賦值操作
  變數名出現在=的左邊,一律是賦值操作
    var uname="林妹妹";
4.取值操作
  變數只要沒出現在=的左邊,一律是取值操作
    var uage=30;
console.log(uage);
var num1=uage;

5.常量

1.什麼是常量
  在程式中,一經宣告就不允許被修改的資料就是常量。
2.語法
  const 常量名=值;
  常量名在程式中,通常採用大寫形式。
  const PI=3.1415926;

5.1資料型別

1.資料型別的作用

規定了資料在記憶體中所佔的空間
10.1 64位 8個位元組
bit:位
8bit=1byte位元組
1024byte=1KB 
1024KB=1MB
1024MB=1G 
1024G=1T

2.資料型別詳解

1.資料型別分兩大類
  原始型別(基本型別)
  引用型別
  1.原始型別
    1.Number 型別
  數字型別
  作用:可以表示32位的整數,也可以表示64位的浮點數(小數)
  整數:
     1.十進位制
       10 
     2.八進位制
       由0-7八個數字組成,逢八進一
       八進位制中以0開始
       var num=010;
     3.十六進位制
       由0-9和A-f組成,逢十六進一
          A:10
      B:11
      C:12
      D:13
      E:14
      F:15
       十六進位制中以0X開始
      浮點數:又稱小數
    小數點計數法:12.58  
    指數計數法:3.4e3(3.4*10的3次方)
2.String型別
  字串型別
  作用:表示一系列的文字字元資料,如:姓名,性別,住址...
  字串中的每個字元,都是由Unicode碼的字元,標點和數字組成。
  Unicode碼:每個字元在計算機中都有一個唯一的編碼表示該字元,
  該碼就是unicode碼(他是十六進位制)
     1.查詢一個字元的unicode碼:
     "李".charCodeAt();
     //10進位制輸出
     "李".charCodeAt().toString(2);
     //二進位制輸出
     "李".charCodeAt().toString(16);
     //十六進位制
       李的unicode碼是:674e
     2.如何將674e轉換為漢字?
        用\u
       ex:
        var str="\u674e";
    console.log(str);//結果是“李”
    漢字的Unicode碼的範圍:
    \u4e00~\u9fa5
     3.特殊字元需要跳脫字元
       \n: 換行
       \t: 製表符(縮排)
       \": "
       \': '
       \\: \
3.Boolean型別
  布林型別
  作用:在程式中表示真或假的結果
  取值:
     true或false
  var isBig=true;
  var isRun=false;
  在參與到數學運算時,true可以當成1做運算,false可以當做0做運算。
  var res=25+true; //結果為26
    4.Undefined型別
  作用:表示使用的資料不存在
  Undefined型別只有一個值,即undefined當宣告的變數未賦值(未初始化)時,
  該變數的預設值就是undefined.
5.Null型別
  null用於表示不存在的物件。
      Null型別只有一個值,即null,如果函式或方法要返回的是物件,
      找不到該物件,返回的就是null。

5.2資料型別的轉換

1.隱式(自動)轉換
  不同型別的資料在計算過程中自動進行轉換
  1.數字+字串:數字轉換為字串
    var num=15;
var str="Hello";
var res=num+str; //結果:15Hello
  2.數字+布林:將布林轉換為數字true=1,false=0
    var num1=10;
var isSun=true;
var res1=num1+isSun;//結果:11
  3.字串+布林:將布林轉換為字串
    var str1="Hello";
var isSun1=true;
var res2=str1+isSun1;//結果:Hellotrue
  4.布林+布林:將布林轉換為數字
    true=1,false=0;
    var isSun2=true;
var isSun3=flase;
var res=isSun2+isSun3;//結果1
2.強制轉換 -轉換函式
  1.toString()
    將任意型別的資料轉換為字串
語法:
  var num=變數.toString();
  ex:
  var num=15;
  var str=num.toString();
  console.log(typeof(str));
  2.parseInt()
    將任意型別的資料轉換為整數
如果轉換不成功,結果為NaN(Not a Number)
語法:var result=parseInt(資料);
  3.parseFloat()
    將任意型別的資料轉換為小數
如果轉換不成功,結果為NaN
語法:var result=parseFloat(資料);
  4.Number()
    將任意型別資料轉為Number型別
注意:如果包含非法字元,則返回NaN
語法:var result=Number(資料);

6.執行符和表示式

1.什麼是表示式

由運算子連線運算元所組成的式子就是表示式。
ex:
  15+20
  var x=y=40
任何一個表示式都會有結果。

2.運算子

1.算術運算子
  +,-,*,/,%,++,--
  5%2=1;
  ++:自增運算,只做+1操作
  ++在前:先自增,再運算;
  ++在後:先運算,再自增;
  ex:
    var num=5;
console.log(num++);//列印5,變為6
console.log(++num);//變為7,列印7
ex:
    var num=5;
             5   (6)6   6(7)    (8)8
    var res=num+ ++num +num++ + ++num +num++ +num;  
  8(9)   9
結果:42
2.關係運算子(比較)
  >,<,>=,<=,==,===(全等),!=,!==(不全等)
  關係運算的結果:boolean型別(true,false)
  問題:
    1. 5 > "10" 結果:false
   關係運算子兩端,只要有一個是number的話,另外一個會隱式轉換為number型別,再進行比較。
2."5">"1 0" 結果:true
  "5".charCodeAt(); //53
  "1".charCodeAt(); //49
  "張三丰" > "張無忌" 結果:false
    19977  >   26080
3."3a" > 10 結果:false
  Number("3a")--->NaN
  注意:
    NaN與任何一個資料做比較運算時,結果都是false.
    console.log("3a">10); false
    console.log("3a"==10); false
    console.log("3a"<10); false
    isNaN()函式:
       語法:isNaN(資料);
       作用:判斷指定資料是否為非數字,如果不是數字,返回值為true,是數字的話返回的值為false
       console.log(isNaN("3")); //false
       console.log(isNaN("3a")); //ture 
       console.log("3a"!=10);//true
3.邏輯運算子
  !,&&,||
  !:取反
  &&:並且,關聯的兩個條件都為true,整個表示式的結果為true
  ||:或者,關聯的兩個條件,只要有一個條件為true,整個表示式的結果就為true
  短路邏輯:
     短路邏輯&&:
     當第一個條件為false時,整體表示式的結果就為false,不需要判斷第二個條件
     如果第一個條件為true,會繼續判斷或執行第二個條件
 短路邏輯||:
     當第一個條件為true時,就不再執行後續表示式,整體結果為true。
     當第一個條件為false時,繼續執行第二個條件或操作。
4.位運算子
  <<,>>,&,|,^
  右移是把數變小,左移是把數變大
  &:按位與,判斷奇偶性
     任意數字與1做按位與,結果為1,則為奇數,結果為0,則為偶數。
     var num=323;
 var result=num & 1
 console.log(result); //結果為1
  |:按位或,對小數取整
     將任意小數與0做按位或,結果則取整數部分。
  ^:按位異或,用於交換兩個數字
      二進位制位數,逐位比較,不同則為1,相同則為0
   a=a^b;
   b=b^a;
   a=a^b;
5.賦值運算子和擴充套件賦值運算子
  1.賦值運算 =
    var uname="TOM";
  2.擴充套件賦值運算子
    +=,-=,*=,/=,%=,^=...
a=a+1 a+=1;a++;++a
a=a^b
a^=b
6.條件(三目)運算子
  單目(一目)運算子,只需要一個運算元或表示式
  ex: a++,b--,!isRun
  雙目(二元)運算子,需要兩個運算元或表示式
   +,-,*,/,%,>,<,>=,<=,==,!=,===,!==,&&,||,&,|,^
  三目(三元)運算子,需要三個運算元或表示式
     條件表示式?表示式1:表示式2;
        先判斷條件表示式的值,
    如果條件為true,則執行表示式1的操作
    如果條件為false,則執行表示式2的操作
  ex:成績大於60及格,否則,輸出不及格

7.函式-function

1.什麼是函式

函式,function,也稱為方法(method)
函式是一段預定義好,並可以被反覆執行的程式碼塊。
   預定義:提前定義好,並非馬上執行。
   程式碼塊:可以包含多條可執行的語句
   反覆執行:允許被多次呼叫
函式-功能
   parseInt();
   parseFloat();
   Number();
   console.log();
   alert();
   document.write();

2.定義和使用函式

1.普通函式的宣告和呼叫(無引數無返回值)
  1.宣告
    function 函式名(){
   //函式體
     若干可執行的語句
}
  2.呼叫函式
    在任意javascript合法的位置處透過 函式名(); 對函式進行呼叫。
2.帶參函式的宣告和呼叫
  1.宣告
    function 函式名(引數列表){
   //函式體
}
引數列表:可以宣告0或多個引數,多個引數間用逗號隔開
宣告函式時,宣告的引數,稱之為“形參”
 2.呼叫
   函式名(引數值列表);
   注意:呼叫函式時,傳遞的引數數值,稱之為“實參”。
         儘量按照宣告函式的格式進行呼叫
3.帶返回值函式宣告和呼叫
  1.宣告
    function 函式名(引數){
   //函式體
   return 值;
   //return關鍵字,程式碰到return關鍵詞,就立馬跳出並且把值帶出去
}
注意:最多隻能返回一個值
  2.呼叫
    允許使用一個變數接收函式的返回值
    var result=函式名(實參);

8.作用域

1.什麼是作用域
  作用域表示的是變數或函式的可訪問範圍。
  JS中的作用域分兩種:
     1.函式作用域
   只在函式範圍內有效
 2.全域性作用域
   程式碼的任何位置都有效

2.函式作用域中變數

 又稱為區域性變數,只在宣告的函式中有效
 ex:
   function test(){
     var num=10;
   }

3.全域性作用域中的變數

 又稱為全域性變數,一經宣告,任何位置都能用
 1.不在function中宣告的變數,為全域性變數
 2.宣告變數不使用var,無論任何位置宣告,都是全域性變數(不推薦)
 注意:
   全域性變數和區域性變數衝突時,優先使用區域性變數。
 3.變數的宣告提前
   1.什麼是宣告提前
     在JS程式正式執行之前,function宣告的函式,
     會將所有var宣告的變數,都預讀(宣告)到所在作用域的頂部,但賦值還是保留在原位。

9.按值傳遞

1.什麼是按值傳遞

原始(基本)型別的資料(number,string,bool),在做引數傳遞時,
都是按照“值傳遞”的方式進行傳參的。
值傳遞:真正傳遞引數時,實際上傳遞的是值的副本(複製出來一個值),
而不是原始值。

2.函式的作用域

1.分為兩種
  1.區域性函式
    在某個function中宣告的函式。
  2.全域性函式
    在最外層(<script>中)定義的函式就是全域性函式,全域性函式一經定義,
    任何位置處都能呼叫。

10.ECMAScript提供一組全域性函式

1.parseInt()
2.parseFloat()
3.isNaN()
4.encodeURI()

URL:uniform resource locator路徑
URI:uniform resource Identifier
作用:對統一資源識別符號進行編碼,並返回編碼後的字串
所謂的進行編碼,就是將地址中的多位元組文字編成單位元組的文字
(英文數字:單位元組,漢字2-3位元組不等)

5.decodeURI()

作用:對已經編碼的URI進行解碼,並返回解碼後的字串。

6.encodeURIComponent()

在encodeURI的基礎上,允許對特殊符號進行編碼。

7.decodeURIComponent()

解碼特殊符號

8.eval()

作用:執行以字串表示的js程式碼

11.遞迴呼叫

遞迴:在一個函式的內部再一次呼叫自己
問題:

 1*2*3*4*5
 5*4*3*2*1
 求5!(5*4*3*2*1) 4!(4*3*2*1) 3!(3*2*1)
       2!(2*1) 1!(1*1)
   5!=5*4!
   4!=4*3!
   3!=3*2!
   2!=2*1!
   1!=1
   透過一個函式,求數字n的階乘
   10!=10*(10-1)!
   效率:
     在本次呼叫還未結束時,就開始下次的呼叫,本次呼叫就會被掛起,
     直到所有的呼叫都完成之後,才會依次返回,呼叫的次數越多,效率越低。

12.分支結構

1.if結構

if(條件){
   語句塊;
}
注意:
  條件儘量是boolean的,如果不是boolean,以下情況會當做false處理
   if(0){...}
   if(0.0){...}
   if(""){...}
   if(undefined){...}
   if(null){...}
   if(NaN){...}
注意:if後的{}可以省略,但是不推薦,只控制if後的第一句話。

2.if...else...結構

語法:
  if(條件){
     語句塊
  }else{
     語句塊
  }

3.if....else if...else...

語法:
  if(條件1){
    語句塊1
  }else if(條件2){
     語句塊2
  }else if(條件3){
     語句塊3
  }else{
     語句塊n
  }

4.switch...case

1.作用:(使用場合)
  等值判斷
2.語法
  1.switch(值/表示式){
     case 值1:
    語句塊1;
    break;//結束switch結構,可選的
 case 值2:
    語句塊2;
    break;
    ...
 default:
   語句塊n;
   break;
   }
  2.特殊用法
    執行相同操作時:
   switch(值/表示式){
       case 值1:
       case 值2:
       case 值3:
          語句塊;
   }

12.迴圈結構

1.特點

1.迴圈條件:迴圈的開始和結束
2.迴圈操作:要執行的相同或相似的語句

2.迴圈-while

語法:
   while(條件){
      //迴圈體-迴圈操作
  //更新迴圈條件
   }

3.迴圈的流程控制

1.break
  作用:終止整個迴圈的執行
2.continue
  作用:終止本次迴圈的執行,繼續執行下一次迴圈
 ex:
   迴圈從彈出框中錄入資訊,並且列印,直到輸入exit為止。

4.迴圈-do...while

1.語法
  do{
     //迴圈體
  }while(條件);
 執行流程:
     1.先執行迴圈體
 2.再判斷迴圈條件
   如果條件為真,則繼續執行迴圈體
   如果條件為假,則跳出迴圈操作

5.迴圈-for

語法:
  for(表示式1;表示式2;表示式3){
     //迴圈操作
  }
  表示式1:迴圈條件的宣告
  表示式2:迴圈條件的判斷
  表示式3:更新迴圈變數
  執行流程:
     1.先執行表示式1
 2.判斷表示式2的結果(boolean型別)
 3.如果2條件為真,則執行迴圈體,否則退出
 4.執行完迴圈體後,再執行表示式3
 5.判斷表示式2的結果
  ex: for(var i=1;i<=10;i++){
      console.log(i);
   }

13.for的特殊用法

1.for(表示式1;表示式2;表示式3;){}

1.省略表示式
  三個表示式可以任意省略,分號不能省
  但一定在迴圈的內部或外部將表示式補充完整
2.表示式1和表示式3 允許寫多個表示式,用逗號隔開表示式

14.迴圈巢狀

1.迴圈巢狀

在一個迴圈的內部,又出現一個迴圈
  for(var i=1;i<100;i++){ //外層迴圈
     for(var j=1;j<=10;j++){
    //內層迴圈
 }
  }
 外層迴圈走一次,內層迴圈走一輪

15.陣列

1.什麼是陣列

在一個變數中儲存多個資料。
陣列是按照線型順序來排列的-線型結構
陣列中:除了第一個元素外,每個元素都有一個直接的"前驅元素"。
陣列中:除了最後一個元素外,每個元素都有一個會直接的"後繼元素"。

2.宣告陣列

1.語法
  1.var 陣列名=[];
    var names=[];
  2.var 陣列名=[元素1,元素2,元素3...];
    var names=["孫悟空","豬八戒","沙和尚"];
  3.var 陣列名=new Array();
    var names=new Array();
  4.var 陣列名=new Array(元素1,元素2...);
    var names=new Array("林黛玉","賈寶玉","王熙鳳");

3.陣列的使用

1.取值和賦值操作
  取值:
   陣列名[下標]
   var newArr=["tom","lilei"];
   newArr[0]
  賦值:
    陣列名[下標]=值;
     newArr[2]="韓梅梅";
2.獲取陣列的長度
  陣列長度:陣列中元素的個數
  屬性:length
  語法:陣列名.length
3.配合迴圈,遍歷陣列中的每個元素
  for(var i=0;i<names.length;i++){
      i:表示陣列中每個元素的下標
      names[i]:每個元素
  }
  length表示陣列中即將要插入的元素的下標
  var names=["tom","lili","lucy"];
      names[names.length]="lilei";

16.關聯陣列

1.關聯陣列
  以字串作為元素的下標的陣列,就是關聯陣列。
  以數字作為下標的陣列,就是索引陣列。
$array=["name"=>"tom"]
2.js中的關聯陣列
  var array=[];
  array["字串下標"]=值;
  注意:
    1.關聯陣列中,字串下標的內容是不記錄到length中的
2.只能透過 字串 做下標取值
3.for...in
  遍歷出任意陣列中的字串下標 以及 索引下標
  語法:for(var 變數 in 陣列名){
       //變數:字串下標 或 索引下標
  }

17.氣泡排序

1.什麼是冒泡
  排序演算法之一,將一組資料進行排序,小的數字往前排,大的數字往後排。
  兩兩比較,小的靠前。
  var arr=[9,23,6,78,45]; 5個數  比4輪
  第一輪:比較了4次
  第二輪:比較了3次
  第三輪:比較了2次
  第四輪:比較了1次
  1.n個數字,則比較n-1輪
    for(var i=1;i<arr.length;i++)
  2.輪數增加,比較的次數較少
    for(var j=0;j<arr.length-i;j++)
          第一輪  5     -1=4次
      第二輪  5     -2=3次
              第三輪  5     -3=2次
      第四輪  5     -4=1次
      兩兩比較 小的靠前
      if(arr[j]>arr[j+1])
         arr[j]^=arr[j+1];
         arr[j+1]^=arr[j];
         arr[j]^=arr[j+1]

18.陣列的常用方法

1.toString();

作用:將陣列轉換為字串,並返回轉換後的結果。
語法: var str=陣列物件.toString();

2.join()

作用:將陣列的元素透過指定的字元連線到一起,並返回連線後字串
語法:var str=陣列物件.join("字元");

3.concat()

作用:拼接兩個或更多的陣列,並返回拼接後的結果
語法:var res=陣列物件.concat(陣列1,陣列2,...);

19.陣列的函式

1.slice()

作用:擷取子陣列,從指定的陣列中,擷取幾個連續的元素組成一個新的陣列
語法:var arr=陣列名.slice(start,[end]);
      start:從哪個下標位置處開始擷取,取值為正,從前向後算; 
      取值為負,從後向前算          0      1      2
   var arr=["中國","美國","俄羅斯"];
             -3      -2    -1 
      end:指定結束位置處的下標(不包含自己),該引數可以省略,
      如果省略的話,就是從strat開始一直擷取到尾。

2.splice()

作用:允許從指定陣列中,刪除一部分元素,同時再新增一部分元素
語法:arr.splice(start,count,e1,e2...);
      start:指定新增或刪除元素的起始下標
  count:指定要刪除元素的個數,取值為0表示不刪除
  e1:要增加的新元素,可以多個
  返回值:返回一個由刪除元素所組成的陣列

3.reverse()

作用:將一個陣列反轉
語法:陣列名.reverse();
注意:該函式會改變當前陣列的內容

4.sort()

作用:排序,預設情況下按照陣列元素們的Unicode碼進行升序排序。
語法:陣列名.sort();
特殊:
   允許自定義排序函式,從而實現對數字的升序或降序的排序
   ex:
     var arr=[12,6,4,115,78];
 //排序函式(升序)
 function sortAsc(a,b){
    return a-b;
 }
 arr.sort(sortAsc);
  原理:
    1.指定排序行數sortAsc,定義兩個引數a和b,表示陣列中相鄰的兩個數字
2.將排序函式指定給陣列sort()函式,陣列會自動傳遞資料到sortAsc()中,
  如果sortAsc()的返回值>0,則互動兩個數字的位置,否則不變。
  使用函式完成升序排序:
     arr.sort(
       function(a,b){  //匿名函式
         return a-b;
       }
    )

20.進出棧操作

JS是按照標準的“棧式操作”來訪問陣列
所有的“棧式操作”的特點就是“後進先出”
1.push()

入棧,在棧頂新增指定的元素,並返回新陣列的長度
 var arr=[10,20,30];
 //向棧頂增加新的資料40
 var len=arr.push(40); //4

2.pop()

出棧,刪除(刪除棧頂資料)並返回刪除元素
注意:改變原來陣列

3.shift()

刪除陣列頭部(第一個)的元素並返回刪除元素
語法:陣列名.shift();

4.unshift()

在陣列的頭部(第一個)元素的位置處,增加元素,返回的是陣列的長度。
語法:陣列名.unshift(增加的資料);

3.二維陣列
1.什麼是二維陣列

在一個陣列中的元素又是一個陣列,也可以稱為:陣列的陣列。

2.二維陣列的使用

var names=[
    ["孫悟空","豬八戒","沙和尚"],
["大喬","小喬","曹操"],
["林黛玉","賈寶玉","薛寶釵"]
];
 //列印輸出“小喬”
   console.log(names[1][1]);

如果有想一起學習web前端,想製作酷炫的網頁,可以來一下我的前端群:731771211,從最基礎的HTML+CSS+JavaScript【炫酷特效,遊戲,外掛封裝,設計模式】到移動端HTML5的專案實戰的學習資料都有整理好友都會在裡面交流,分享一些學習的方法和需要注意的小細節,每天也會準時的講一些前端的專案實戰,及免費前端直播課程學習


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901074/viewspace-2649011/,如需轉載,請註明出處,否則將追究法律責任。

相關文章