1. 程式人生 > >javascript基礎--6天學會js

javascript基礎--6天學會js

第一天:認識js
1.js是一種由瀏覽器解釋執行的語言,弱型別客戶端指令碼語言,目前js 有node.js也是可以作為後端語言的、
  
     解釋執行:程式碼不需要進行預編譯,程式在執行過程中逐行解釋執行
              不需要編譯,直接在網頁中執行
             跨平臺性好,一般瀏覽器都能支援js的
        強型別語言:需要編譯的語言,有c c++ php c# java ,執行效率要高一般運用於後臺
                   隨著技術的發展,js的一些框架如vue.js也包含了編譯器。可以達到一些特殊的運用
        弱型別語言:不需要明確變數的型別,變數的型別在執行中確定的
        
  客戶端指令碼語言:
        相對與b/s(browser/sever)架構而言,執行在客戶端的語言
         js不需要伺服器,用瀏覽器直接在本地開啟執行即可
        客戶端語言是對外公開的,重要的複雜的業務邏輯由後臺語言執行
     
js的組成:
        ECMAscript:包含js的語法
        DOM:文件物件模型,提供訪問和操作網頁內容的方法和介面
        BOM:瀏覽器物件模型,提供也瀏覽器進行互動的方法和介面
        ECMA:Eropean computer manufacturer association:歐洲計算機制造商協會
js的特點:
        簡單易學,語法和java類似 
        面向物件的程式設計思想,例如 Bom,dom的運用
        基於事件驅動,特效豐富,如滑鼠點選事件,鍵盤事件
        跨平臺性,編寫一次,可到處執行

知識擴充套件:
         js可以引入域外的指令碼,存在安全隱患,通過官網的CDN(雲加速器),相對較安全
         釋出專案的是否可以考慮使用

js語法:每條語句以分號;結束,區分大小寫
  <noscript></noscript>,需要在谷歌chrome中設定: 設定--內容設定--javaScript--不允許任何網站執行即可
  
 路徑問題:作為一名合格的工程師,路徑不應該是我們的問題
     相對路徑:
           1.在同一專案的相同資料夾下
           2.在同一專案的不同目錄下
     絕對路徑:引用其他網站的資源(外網)
 
 js載入順序:
       根據文件的由上而下的載入順序進行的,先出現先載入,後出現後加載
       這樣就會產生js阻塞文件載入:js載入時間較長的會影響頁面內容的渲染,使用者體驗感就會差
       如果一個js檔案要依賴別的js檔案,被依賴的別的js檔案需要在前面,載入順序不能顛倒的
   
 一般把js檔案放在body後面
       H5進行非同步載入,解決阻塞問題:
             <script  src="ttt.js" defer></script>  推薦defer,相容性,執行效率都好
             <script  src="ttt.js" async></script> 立即執行,不推薦
 

          

課程關鍵點:
第二天:js的變數(var定義)和型別
掌握 Number()   unicode編碼   tostring方法
  變數:
     命名規則:1.字母,數字,下劃線,$任意組合,不能數字開頭不能使用關鍵字和保留字
      使用變數3步驟:定義 初始化  使用
       語義化:寫的變數名儘量貼近實際的意思
       識別符號:用於標記某一特定作用的符號,比如變數 函式 屬性 方法的引數
 
  常量:賦值後不能在賦值,只能使用,關鍵字:const const PI=3.14;名稱需要全部大寫
 
   typeof()檢查變數資料的型別,返回字串型別
        返回的型別有:undefined   string  boolean  number  object function


javacript的除錯--日誌記錄  和 斷點     
控制檯輸出日誌資訊:
      1.使用prompt()接受使用者的資訊
      2.使用alert()彈出警示框
      3.confrim()詢問對話方塊。返回boolean型別

    格式化輸出:類似C語言
           %d表示按整型輸出      %f輸出小數   %s字串輸出
 
 顯示不同日誌級別資訊:
   console.log() console.debug() console.info() console.warn()  console.error()
 
 基本資料型別:
   任何型別的值都可以通過boolean返回其結果
   undefined和null的區別
        undefined屬於值型別,變數定義了但沒有賦值,如:var myname;console.log(mynanme)
        null屬於object.指向一個空物件,表示沒有引用任何物件
boolean任何型別都可以通過boolean返回其結果
              boolean       true    false
              String     任意字元      ""
              number     非0         0或NaN
              object     任何物件       null
              undefined            undefined

NaN:
      1.除數為0,結果為NaN  
      2.NaN與任何操作,結果為NaN
      3.NaN與NaN的比較返回FALSE-----特殊

 --------isNaN()判斷是 不是一個數字
       isNaN(null);false   ----特殊
       isNaN(undefined);ture ---特殊
       console.log(Number(""));//0
       console.log(Number(null));//0
       console.log(parseInt(""));//NaN
       Number(this);//NaN---特殊
       Number(NaN);//NaN-----特殊
       Number(undefined);//NaN---特殊
 
數值範圍:
      最大值和最小值:Number.MAX_VALUE  1.7976931348623157e+308
                 Number.MIN_VALUE 5e-324
       超出範圍:Number.MAX_VALUE+Number.MAX_VALUE   Infinity
       使用isFinite()判斷是否在最小和最大值之間
       isFinite(Number.MAX_VALUE+Number.MAX_VALUE)  //false
             isFinite(10+10000)   //true 
 
 重要:
 unicode編碼:統一編碼識別符號是全球通用的,是國際開發的基礎,任何系統都能夠識別數字和字母的,由16進位制組成。
  uinicode的特殊字元:\n換行 \t製表    \b空格   \r換行   \\斜槓   \'單引號    \"雙引號
       \xnn 表示一個字元  如\x41 表示A 
       \unnnn 中文編碼   \u667A 表示“智”
      var  school =  "\u667A\u5b66\u65e0\u5fe7" ;
           console.log(school); //智學無憂
           console.log(school.length); //4,Unicode都會轉義成一個字元
 
  toString()任何一個非空物件都有toString()方法
          var  money = 100; var moneyStr = money.toString();  // "100"
          var  isPass =  true ; var  passStr = isPass.toString(); //"true"
 輸出轉化成對應進位制-- var  money = 10;  
      console.log(money.toString(2)); //1010 console.log(money.toString(8)); //12console.log(money.toString(16)); //a


 迴圈:
 1.使用標籤來跳出迴圈
  outer:
  for(var i=0;i<10;i++){
  inner:
  for(var j=0;j<5;j++){
   console.log("i=" + i + "\tj=" + j);
   var conf=confirm("是否結束整個迴圈");
   if(conf){ break outer;}
   }
  }
 2.通過設定與外迴圈,結束條件,結束外迴圈
 for(var i = 0; i < 10; i++) {
                     
                    for(var j = 0; j < 5; j++) {
                        console.log("i=" + i + "\tj=" + j);
                        var conf = confirm("是否結束整個迴圈");
                        if(conf) {
                            i=9;//通過設定與外迴圈,結束條件,結束外迴圈
                            break  ;
                        }
                    }
                }
        
try-catch的使用:
        try{
             var mymoney=10;
          console.log(mymoney);
        }catch(ex){//這個物件名是識別符號。
                console.log(ex);
              }finally{
              console.log("釋放資源")
              }
              console.log("程式結束");
    var xhr=new XMLHttpRequest();
      xhr.open    
    
空指標異常處理:
        var str =null;
        try{
        document.write(str.name);
        }catch(e){
         document.write(e+"<br/>");
        }
        document.write("程式結束");
----物件:  
Object:物件是具有相同屬性和行為的描述,是引用型別,js的世界也是物件的世界,Object是所有物件的根

建立物件的方式:
    var obj=new Object();//採用構造方法
    var obj={}; //推薦使用 ,字面量方式
    var obj=new Object; //省略構造方法,不推薦
  
js的運算子:
    賦值 :    變數=表示式      連續賦值: var j=k=x=0 
       奇葩 賦值  var  num=.5 
                  var num=0b1010;// 二進位制賦值
                  var num=010;//八進位制賦值  
                  var num=0xa10;//十六進位制賦值
 算術運算子:
   +  加法   字串連線符   
   - 減法   也當作負號   
   /除法  
         特殊1:除數為0,var num=1/0,返回 undefined
         特殊2:與強型別的一點區別,js除法正確。  
          java除法取整數
                int num=1/2; // java 語言的結果:0
          javascript除法取正確數
                 var nun=1/2;//  js 語言結果:0.5
    ++ --與java一致
    取模%: 5%2 返回1(兩數相除取餘數) 
  負數求模:-10%3  -10%-3 返回都為-1  -10.5%2返回-0.5---前者為負數,結果為負數
   負數取模: 餘數是正數還是負數要看被除數
              
第三天:函式
  Math.random()  Math.round() 
  Math.ceil()返回最接近的最大整數,適合用於後面的分頁
  Math.floor()返回最接近的最小整數
  eval()檢查js程式碼並執行,動態執行js
  encodeRUI():將文字字串編碼為一個有效的統一資源識別符號,開發過程用的上 對 : /  ? ;  這4個字元不進行編碼
  decodeRUI():解碼

非常重要,開發使用的:處理url的
encodecompent(“http://serch.jd.com?www.baidu.com?name=jack&age=20”)
這是傳遞網址進行編碼,防止歧義,    對地址怎麼處理呢?
decodecompent()解碼

eval()檢查並執行,動態執行js指令碼

函式:包括系統函式和自定義函式(無參,帶引數)
使用function關鍵字定義函式,不能與系統函式重名,引數可有引數和無引數

js的沒有函式過載的概念,可以使用argument獲取物件引數資訊
 例子:function abount(){
                 console.log("方法的引數如下");
                 for (var i=0;i<arguments.length;i++){
                     console.log(arguments[i]);
                 }
             }
            abount(3,2);
 
 匿名函式:在jquery中使用的較多(js稱為函式表示式)
   即時函式,會形成一個私有的作用域
  return:退出當前的函式
 函式呼叫的3種方式:
1.通過函式表示式   var myFunc=function(){console.log("ok")}  
 2.即時函式 (function(){console.log("ok")})();
 3.通過事件 window.onload=funciton(){ console.log("ok")}
 4.通過使用連結呼叫
    <a href="javascript:Func()">ddd</a>
    <a href="javascript:void(0)">ddd</a>
 
 重要:in   for..in /    instanceof    
 測試物件中是否存在該屬性:---in   ----- 常用
 var a = new Array("a","b"); var isIn=length in a; console.log(isIn);  ---true
 結合for迴圈,遍歷所有屬性 for(var w in window){console.log(w);}
  
instanceof 資料型別:指變數是否可以強轉指定的型別,檢測型別的時候相容


作用域:
      變數的使用範圍與變數定位的位置 有關係

  全域性變數:在整個js執行過程中都能訪問
        注意:
           對於沒有使用var定義的變數是隱式全域性變數,要先執行一遍後才才生效,否則就是沒有定義的變數,不推薦使用,會汙染
          使用var 定義的變數會自動新增到最近的環境中
   
  區域性變數:
  js中沒有塊級作用域,在ES5中新增加let定義塊級作用域,新增const定義常量  這也是塊級別作用域
  
 物件:
 Object可以理解成一個變數,可以含有多個變數,只通過一個變數來操作
 1.通過new來建立 
 2.通過字面量來建立--推薦使用

第4天:常見的引用型別
1.Object


2.Array陣列-----對資料操作
  什麼是陣列:
    1.一次排列多個值,每個值都有對應的編號,從0開始
    2.陣列元素的型別可以不一樣
    3.陣列的作用在對資料的管理,方便對資料的操作
  建立陣列:
      js中的陣列沒有真正意義上的下標,而是屬性。所以不存在陣列越界
  
  常用建立方式:
    var Array=[];空陣列
    var Array=["aa","bb","cc","dd"]
 賦值:邊建立,邊賦值。先建立,在賦值
 給陣列新增屬性:
  注意: [ ] 除了陣列中索引號,也可以用來給物件新增屬性,獲取物件的屬性值
 
 陣列的截斷:--通過length
       var arr=[1,2,3,4,5]
        arr.length=3  arr.length=0(清空)

陣列型別的判斷:
   1.Array.isArray() ES5的提供的API
        var arr=["javas","html"]; Array.isArray(arr);  //true
   2.instanceof操作符
       var arr=["javas","html"]; console.log(arr instanceof Array);  //true
   3. constructor屬性
        var arr=["javas","html"]; arr.constructor===Array  //true
常見的陣列操作方法:
  Array.join()---分隔成陣列,把字元連線成陣列的元素,並將結果返回
      var arr=[2,6,9,10]; var str=arr.join();  console.log(str);  // "2,6,9,10"

  str.split()---分隔成陣列
       var str="web前端/java/css/json";
       var webs=str.split("/"); console.log(typeof webs);
       console.log(webs); //["web前端","java","css","json"]  

 棧方法(陣列元素新增與刪除):
        push()   pop()       shift()       unshift()
      1.向陣列末尾新增元素 push() 
            var arr=[]; arr.push(1); arr.push(3); // 2 表示新增的個數      arr變為 [2,3]
                     向陣列末尾移除最後的元素pop()
            var arr=[2,3]; arr.pop();//[3],表示移除的元素     arr變為[2]
      2.shift() 新增與unshift()移除   --對第一個元素進行操作
           var arr=["A","B","C"]; arr.shift();//[A]   arr變為["B","C"]
            arr.unshift("DE");//3 --當前元素的個數   arr變為["DE","B","C"]
陣列元素的排序:   
      reverse()     sort()      sort(compareFn)
       3.陣列的元素的翻轉 reverse()
         var arr=["A","B","C"];  arr.reverse();  //["C","B","A"]
       4.sort()
         sort()不帶引數是預設按照字串升序排列,在比較的時候,會將元素轉化成字串在比較,比較的是第一個字元
               var arr=["java","ajax","css"]; arr.sort(); //["ajax","css","java"]
               var  arr=[11,15,22,56,33,3,5,6];arr.sort();//[11,15,22,3,33,5,56,6]---哈哈,不合理了吧

         sort(compareFn)----;sort()提供了一個帶比較函式的引數
               var  arr=[11,15,22,56,33,3,5,6];
                arr.sort(function(num1,num2){ return num1-num2;}); console.log(arr);//[3,5,6,11,15,22,33,56]
                arr.sort(function(num1,num2){ return num2-num1;}); console.log(arr);//降序

陣列的其他操作:連線  擷取 剪接
          concat()    slice()   splice()
      1. concat()連線兩個陣列
          var arr1=["A","B","C"];var arr2=[2,3];var arr=arr1.concat(arr2);console.log(arr);//["A","B","C",2,3]
      2. slice(start,end)擷取陣列,返回擷取後的陣列,包含start位置,不包含end位置 -- 不影響原來的陣列
           var  arr=[11,15,22,56,33,3,5,6]; 
           console.log(arr.slice(3,7));//[56,33,3,5]
           console.log(arr.slice(3));//[56,33,3,5,6];
           console.log(arr);//[11,15,22,56,33,3,5,6];//原來陣列不變,即不影響原來的陣列
     3.  splice()陣列剪接,可以對陣列做很多新增、刪除、更新的操作------應用頻率要高,功能較強大
           splice(start,deleteCount,items) 
           start:可選引數,操作的起始位置,從0開始計數的
           deleteCount:刪除的個數
           items:替換刪除位置的值
           var  arr=[11,15,22,56,33,3,5,6]; 
           arr.splice();//不做操作
           arr.splice(3,2,100,101,102);//[56,33]
           console.log(arr)//[11,15,22,100,101,102,3,5,6]
           var arr1=[11,15,22,56,33,3,5,6];
           arr1.splice(0,0,200,300); console.log(arr1);//[200,300,11,15,22,56,33,3,5,6]

陣列找位置:
 indexOf()   lastIndexOf()   str.substring()
 indexOf():通過找陣列中的某個元素,返回這個元素的位置,找不到返回-1
      var arr=["java","ajax","hh","css","aa","hh"];
      console.log(arr.indexOf("css")); //3
      console.log(arr.indexOf("css22222"));//-1找不到返回-1

lastIndexOf():通過尋找陣列中最後出現的某個元素(假設有重複元素),返回這個元素的位置
      console.log(arr.lastindexOf("hh"));//5,找的是後面那個“hh” ,找不到-1

str.substring()---擷取字串
    var str="Hello world!"
    document.write(str.substring(3)) //lo world
      document.write(str.substring(3,7)) //lo w
陣列的幾種迭代操作:
  forEach()    filter()    map()   reduce()

1.forEach()
      var num=[10,20];
      num.forEach(function(item,index,array){console.log("item="+item+"index="+index+"array="+array)});
      //輸出item=10 index=0 array=10,20   item=20 index=1 array=10,20
      item:表示遍歷陣列的元素 index:元素的下標 array:原始陣列物件

2.filter()陣列過濾
      var num=[10,20,30,40,50,60];
      var newnum=num.filter(function(item,index,array){return item%3==0;});
         console.log(newnum);//[30,60]
         console.log(num);//[10,20,30,40,50,60]
3.map()陣列對映   ,給符合條件的資料重新賦值
     var num=[10,20,30,40,50,60];
     var newnum=num.map(function(item,index,array){if(item%3==0){return item+2};});
       console.log(newnum);//[undefined,undefined,32,undefined,undefined,62]
       console.log(num);//[10,20,30,40,50,60]
4.reduce()縮小方法:迭代所有的元素最終返回一個值    reduceRight()表示從右邊開始遍歷
      //prev:當前一個值  cur:當前值  index:當前下標  array:原始陣列
      var num=[10,20,30,40,50,60]; 
      var newnum=num.reduce(function(prev,cur,index,array){return prev});//10
      var newnum=num.reduce(function(prev,cur,index,array){return cur});//60
      var newnum=num.reduce(function(prev,cur,index,array){return prev+cur});//210相當於求和
      console.log(newnum);
      console.log(num);

-----日期物件
Data日期型別:
 Data物件的構造:
          var date=new Date(); //以當前時間來構造
          var  date=new Date(2017,04,01); //以指定的時間來構造
  比較特殊:1--12月在js中是0--11  週一-週五 1-5 週日是0
  獲取 date.getFullYear()   getMonth()  getDate()-日  getHours() getMinutes() getSeconds() getMillseconds()-毫秒  getDay()-星期
 date.getTime()---把正常時間寫法轉為 獲取自1970-1-1到現在的毫秒數
設定時間:對應使用 set
var now=Date.now()獲取1970-1-1到現在的毫秒數

日期的轉換:
      1.字串轉日期  
        var str="2017-5-3"  var date=Date.parse(str); console.log(date); //輸出的是毫秒數
          毫秒數再轉成日期格式 var newdate=new Date(date) //Mon May 01 2017 00:00:00 GMT+0800 (中國標準時間)
      2.日期轉字串 
        var date=new Date();
        console.log(date.toLocaleDateString()); //轉本地日期格式 2017/5/8
        console.log(date.toLocaleTimeString()); //轉本地時間格式  下午3:23:56
        console.log(date.toLocaleString()); //轉本地日期+時間   2017/5/8 下午3:23:56


--BOM物件
BOM:
      window物件:對位址列,儲存資料,文件之類的互動操作
      window===this;//true
      1.BOM的基本概念
      2.window物件與ECMAscript的聯絡
      3.window的全域性作用域
      4.自動的擴充套件屬性和window新增的屬性的細微區別
       區別一:自動的擴充套件屬性不能夠直接刪除
        var address="深圳";
        delete address;//false
        window.age=20;
         delete age;//true
        區別二:定義的變數查詢方式不一樣
        var myAge=age;//報錯,在作用域鏈上查詢,找不到(在本地找)
        var myAge=window.age;//undefined,直接在window物件上找,找不到返回undefinded
        在js中明確呼叫的物件是一個好的習慣,也能提升程式的效能


重要: 
navigator: 瀏覽器型別的判斷
      var browser=navigator.userAgent;
      if(browser.indexOf("MSIE")>0){
            console.log("IE瀏覽器")}
      else if(browser.indexOf("Chrome")>0){
            console.log("Google瀏覽器");
      }else if(browser.indexOf("Firefox")>0){
            console.log("Google瀏覽器");
      }else{
            console.log("其他瀏覽器");
      }


window的幾個屬性: location  screen  history 
location:host hostname href port protocol  reload() replace()  search:獲取引數資訊

----定時器(延時器)
setTimeout() clearTimeout()-----
setInterval() clearInterval()----週期性延時器

cookie: 
    cookie儲存在客戶端,開啟瀏覽器傳送請求,cookie會自動傳送到伺服器,由伺服器讀取,cookie的資料持續時間由使用者自己定義
 但cookie大小有限一般在4096位元組,即3K限制,cookie一般安全隱患較大,一般不要把登入註冊的重要資訊用cookie儲存,cookie只 儲存一些不是很重要的標識資訊。
 計算機中,使用者一般設定為禁用!!
 cookie特點:
   cookie的內容:採用key=value;key=value..儲存,引數名自定義
   cookie的過期時間:使用引數 expires
   cookie的路徑:使用path,  “/”表示這個網站的網頁,不推薦。容易造成衝突
       注意: 形如“/pro/index.html” 路徑,在google瀏覽器正常,在IE瀏覽器得不到值

設定cookie : var name="jack",pwd="123" var now=new Date(); now.settime(now.getTime()+1*24*60*60*1000);  //轉毫秒
         document.cookie =  "name="  + name +  ";expires="  + now.toUTCString() +  ";path="  + path; //姓名
         document.cookie =  "pwd="  + pwd +  ";expires="  + now.toUTCString() +  ";path="  + path;   //密碼
讀取cookie  :var data=document.cookie;
刪除cookie  : var name=null,pwd=null,now=new DAte()

其他儲存 方式:
html5 的web儲存:
localStorage:本地儲存
    1.使用key-value的形式儲存資料,資料只能是String資料
    2.使用setItem()儲存,使用getItem()獲取
    3.資料是永久儲存的,即便是瀏覽器關閉或者電腦重啟資料不丟失。
    4.有效訪問:針對同一個客戶端,瀏覽器、網站有效(只能在同一中瀏覽器上,同一個網站下,localStore的值是按照網站名稱來儲存。
                同一個網站下面的所有頁面都是能夠訪問的)

頁面間的傳值:
      第一種:使用cookie
       步驟:
         第一頁:進行獲取輸入的內容,設定cookie儲存   
         第二頁:通過var data=document.cookie獲取cookie內容;主要是獲得key,那就要通過indexOf(),在通過substring()找到key對應的value值
      第二種:使用queryString(url引數傳值)
      步驟:
        第一頁:
           通過節點獲得內容,利用url="getquerystring.html?myname="+strName;
           strName需要encodeURIComponent(strName),指定開啟方式//    本視窗location.href=url;
            另起視窗    window.open(url,"cookie");
          第二頁:獲得顯示內容,寫一個獲取引數的方法,裡面解析通過location.location.search.substring(1):"" 解析url

第6天:Document
      document的方法:
      getElementById("id")--返回對應標籤的元素物件,都繼承HTMLElement,引數大小區分大小寫
      getElecmentsByClassName("xx") --返回HTMLCollection,引數區分大小寫
      getElecmentsByName("yy")--返回Nodelist
      getElecmentsByTagName("div")--根據標籤獲取元素,返回HTMLCollection,引數區分大小寫
      getRootNode() --獲取根節點,返回document物件
      querySelector()--返回HTMLElement物件,引數不區分大小寫
      querySelectorAll()--返回Nodelost,引數不區分大小寫

document的屬性:
  常用的: 
      document.documentElement --始終返回<html>... </html>