1. 程式人生 > 其它 >JS基礎課程學習筆記

JS基礎課程學習筆記

技術標籤:筆記javascript

學習web前端開發一個月思考總結

經過半個多月的學習 js基礎課程已經學習完畢 昨天也用一天的時間看完了JQ的基礎課 老師說在出現三大框架之前JQ非常盛行 我也體會到JQ相比於直接寫JS要簡單方便很多 而且執行速度也更快 但即使這麼好用 還是會被速度更快 效能更完善的框架代替 技術的發展與迭代還是很快的 但基礎知識非常重要 各種框架的使用都離不開JS的基礎知識 框架只是讓JS更快更靈活 是一種方便開發者的工具 作為一名開發者 基礎紮實 保持學習 無論如何更新迭代都可以跟的上技術的腳步
以下為js基礎學習筆記:

1變數

js裡兩個等號表示相等,三個等號表示絕對相等


賦值

var name=“zhangsan”;

var name=1,age=2;(建議分開寫)

1.1語法

1、區分大小寫

2、命名規則:以字母、下劃線、或$符號開頭,由以上和數字組成,不能把保留字和關鍵字作為識別符號

1.2資料型別

js資料型別分為5種基本資料型別和複雜資料型別

基本資料:

console.log(typeof )判斷資料型別

1.2.1 Undefined:

使用了var宣告但沒有賦值,系統預設賦值undefined;

1.2.2 Null:

undefined派生與null,兩者幾乎相等,null是一個空物件值;

兩者對比:null表示沒有物件,本不該有值;undefined表示缺少物件,本該有值但是沒有找到。

       console.log(typeof undefined) //"undefined"
       console.log(typeof null) //"object"null是objec的一種
       console.log(null==undefined) //true 兩者預設轉換為false 所以兩者相等輸出true
       console.log(null===undefined) //false 兩者不同型別 所以輸出false

1.2.3 Boolean(布林型別返回布林值):只有兩種值true和fales;

0、null、undefined和空值返回false;非空和非零值返回true。

       var myBoolean = new Boolean("") //false
       var myBoolean = new Boolean("abc") //true

1.2.4 Number:

字面量:所見即所得

十進位制沒有字首

八進位制字首0o

十六進位制字首0x

特例 NAN==NAN // false可通過console.log(isNAN( ))來判斷

parseInt("")可將字串轉換為數字

parseFloat("")可將字串轉換為浮點數

1.2.5 String:

unicode所有字元編碼庫; GBK(GB231)字型檔是中文字元庫; 字母的返回值通過ASCⅡ碼庫查詢

字串用單引號或雙引號包裹 var a=“123abc”

JavaScript 轉義序列

序列 代表字元

\0 Null字元(\u0000)

\b 退格符(\u0008)

\t 水平製表符(\u0009)

\n 換行符(\u000A)

\v 垂直製表符(\u000B)

\f 換頁符(\u000C)

\r 回車符(\u000D)

" 雙引號(\u0022)

’ 撇號或單引號(\u0027)

\ \ 反斜槓(\u005C)

正常字元前加反斜槓""會被js忽略


變數.tostring()可以將數值、布林值、物件、字串的資料型別轉換為字串

複雜:

1.2.6 例 Object型別(物件):

物件有方法和行為,行為用函式表示

兩種建立方法,沒有本質區別

var obj1={}
var obj2=new object()

1.3 布林操作符

1.3.1 邏輯非(!)

邏輯取反 在值的最前面寫"!" 返回值為布林值

1.3.2 邏輯與(&&)

都是布林值時 兩個值全為ture才會返回ture

第一個布林值是false則返回第一個值(第二個值會被短路操作)
第一個是true返回第二個值

1.3.3 邏輯或(||)

都是布林值時 兩個值有一個ture則返回ture

第一個布林值是ture則返回第一個值同時對第二個值進行短路操作

第一個是false 則返回第二個值

1.3.4 其他常用操作符

加(可以將字串連線起來)減乘除、取餘%、逗號操作符

三目運算子:

var a=1 ;var b=(a==1)?2:3;//如果a==1為ture則返回2,否則返回3

賦值操作符:

var a=1;
a+=3;//相當於a=a+3;
a*=3;//相當於a=a*3;

關係操作符:等於“”、不等於“!”、恆等於“=”、不恆等“!

2 語句與函式

2.1 條件語句(if、else if、switch)

2.1.1 if語句:

var hour=1;
if(hour<18){
    greeting="Good day";
}else{
    greeting="Good evening";
}
console.log(greeting);

2.1.2 switch語句:

switch (new Date().getDay()) {
            case 0:
                day = "星期天";
                break;
            case 1:
                day = "星期一";
                break;
            case 2:
                day = "星期二";
                break;
            case 3:
                day = "星期三";
                break;
            case 4:
                day = "星期四";
                break;
            case 5:
                day = "星期五";
                break;
            case 6:
                day = "星期六";
                break;
            default:
                day = "不存在”;"
                break;
        }
        console.log(day)

2.2迴圈語句

2.2.1 for(最常用)

語法:
for(語句1;語句2;語句3){需要執行的程式碼塊}

語句1在迴圈開始前執行;
語句2定義執行迴圈程式碼塊的條件,ture則執行程式碼塊,false則跳出迴圈;
語句3會在迴圈程式碼塊每次被執行後執行;

        var text="";
        for (var i=0;i<5;i++) {
            text = "數字為" + i;
            console.log(text);
        }
        //數字為0
        //...
        //數字為4

2.2.2 while迴圈(注意不要出現死迴圈)

        var i=0;
        var text="";
        while (i<10){
            text += "數字是"+i;
            i++;
        }
        console.log(text);
        //數字是0數字是1數字是2數字是3數字是4數字是5數字是6數字是7數字是8數字是9

2.2.3 do while迴圈(至少會執行一次 先執行再判斷)

2.2.4 break和continue語句

2.3 函式

語法:function 函式名(引數1,引數2,引數3){執行程式碼區}

function sayHi(name,message){
    alert("Hello"+name+","+message);
}
sayHi("zhangsan", "how are you today?");

2.4 引用型別和基本型別的引數傳遞

基本型別的資料按值儲存,儲存在棧記憶體中,賦值基本資料型別a(形式引數)=b(實際引數)後再更改b的值不影響a的值;

複雜資料型別按地址儲存,儲存在堆記憶體中,在棧記憶體中儲存的是一個堆記憶體中實際資料的地址,賦值複雜型別x=y後,再更改x的值,y的值也會隨之改變。

2.5 執行環境和作用域

作用域查詢變數時是按區域性環境到全域性環境的順序查詢

var宣告的變數是在當前環境中存在的 如果在區域性環境裡宣告 就只存在於當前區域性作用域 並且此函式作用域不被呼叫時 就查詢不到此變數

2.6 垃圾回收

js系統週期性自動回收記憶體 不在執行環境的記憶體會被回收

2.7 引用型別

2.7.1 object型別

是js中最頂層的物件也是最通用的物件
兩種建立方法,沒有本質區別

//1
var obj1={
    age:18;
    name:tiantian;
}
//2
var obj2=new object()
obj2.age=19;
obj2.name=Diane;

2.7.2 Array型別(陣列)

a 建立方法:

var arr=[1,2,3,true,"Diane"]
var arr=new Array(3)//建立一個包含3項的陣列

b 下標

陣列的下標是從零開始的arr[0]表示第一項 最後一個項的下標是arr[arr.length-1]

c 判斷

arr.isArray();//輸出值為true和false

d 棧方法:後進先出原則

arr.push(1)//推入1這個元素,從尾部推入

arr.pop()//彈出棧頂的第一個元素

e 佇列:先進先出原則

arr.unshift(3,12)//入隊
arr.shift()//出隊 從數列頭部開始出

f 陣列排序

        var arr=[7,5,3,1]
        for (var i=0;i<arr.length-1;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
                }
            }
        }
        console.log(arr);//(4) [1, 3, 5, 7]

g 陣列操作

新增:arr1.concat(arr2)表示把arr2新增到arr1的尾部;

查詢位置:arr.indexOf(元素),元素在陣列內會返回元素下標,否則返回-1;

2.7.3 Date型別

    var d=new Date()
console.log(d)//Fri Dec 18 2020 17:04:20 GMT+0800 (中國標準時間)

d.getTime()可以獲得當前時間戳 可以用於獲取唯一值

2.7.4 正則表示式 RegExp型別

用來匹配或提取字串,多用於驗證手機號、郵箱地址等資料校驗功能,很多可以在網上直接複製使用

var reg=new RegExp(’\d’,‘gi’)返回值為true和false

修飾符Flags:

i表示忽略大小寫匹配

g表示全域性匹配

m表示多行匹配

2.7.5 Function型別

函式名相當於一個存放在棧記憶體中的指標,指向堆記憶體中函式的地址

js沒有過載 相同函式名的函式,前面的函式會被後面會覆蓋,所以儘量不要出現相同函式名的函式

函式宣告:

函式宣告會自動在全域性環境預解析,自動調到所有程式碼的最前面執行 如果在全域性聲明瞭一個函式A那麼在全域性任何地方都可以呼叫

function sayHi(name,message) {
alert("Hello,"+name+","+message);
}
sayHi("zhangsan", "how are you today?");

函式表示式:

函式表示式不會預解析 只有在執行到這段程式碼的時候才可以被呼叫

var sum=function(a,b){
    return a+b;
}

函式內部屬性 this和arguments

arguments表示引數組成的陣列

this指向的是呼叫這個函式的物件 全域性環境的函式this指向window

2.7.6 基本包裝型別

Boolean、number、string型別會被js自動預設包裝成物件,可以呼叫屬性和方法

string型別

var str='abc 123 789'
console.log(str.split(" "))//用空格分割字串所得的項
console.log(str.indexOf("b"))//返回b的下標

2.7.7 Math物件

js內建物件

min和max

var max= Math.max(1,2,3,4);
var min= Math.min(1,2,3,4);

舍入方法

var d=3.1415926
Math.round(d) //3 四捨五入的整數
Math.ceil(d) //4 向上取整
Math.floor(d) //3 向下取整

隨機數

Math.random() //返回一個[0,1)之間的隨機數

3 面向物件開發

3.1 工廠模式

使用建構函式建立物件

3.2 建構函式

js有內建建構函式Object\Array等 也可自己建立建構函式 一般首字母大寫

通過new+函式名呼叫的就是建構函式

通過函式名(引數)呼叫的就是普通函式

3.3 原形模式prototype

建構函式名.prototype.方法/物件

使用原型物件可以減少記憶體使用

4 BOM瀏覽器物件模型

將整個瀏覽器看作一個物件,js中所有成員變數、成員方法都是瀏覽器物件中的物件和方法。

4.1 window物件

視窗大小、視窗偏移

延遲執行:setTimeout(function(){程式碼,毫秒數})

定期執行(定時器):setInterval;迴圈停止:clearInterval

彈窗:alert

4.2 location物件

包含有關當前URL的資訊
常用屬性:href可做頁面跳轉;reload()重新載入當前頁面;

4.3 Navigator物件

包含瀏覽器相關資訊

常用appName屬性進行判斷瀏覽器名稱

4.4 Screen物件

螢幕相關資訊解析度等

4.5 History物件(同時也是window的屬性)

瀏覽歷史的相關資訊

常用屬性方法:length返回瀏覽器歷史列表中的url數量;常用back()載入前一個url;forward()載入下一個url;go()載入列表中具體頁面

5 DOM文件物件模型

把網頁看成一棵樹,稱為DOM樹,常用節點:標籤節點element、根節點html:document、文字節點text、註釋節點comment不常用;

5.1 節點的屬性

nodeType屬性返回節點型別;

nodeName屬性返回節點名稱;

children屬性返回子節點;

parentNode屬性返回父節點

5.2 節點的方法

建立:

    var p = document.createElement("p");//建立一個標籤p並賦值給變數p
    // var txt = document.createTextNode("文字");
    // p.appendChild(txt);
    p.innerHTML="abcd"//p標籤的內容是abcd
    var a = document.getElementById("a");//把id為a的標籤賦給變數a
    a.appendChild(p);//把p放進a標籤裡

刪除:

a.removeChild(p)//刪除id為a的子節點p

5.3 常用節點

5.3.1 Document節點

表示整個頁面,同時也是window物件的一個屬性,可以查詢元素

特點如下:

nodetype為9;

parentNode為null;

5.3.2 Element 子節點

最常用的節點,特徵:

nodetype的值是1;

nodeName的值是元素的標籤名。

獲得節點的屬性:

    var a=document.getElementById("a");
    a.id="newid";
    a.className="newclass"
    console.log(a)

獲得標籤屬性:

這種方法更通用

    console.log(a.getAttribute("id"))
    console.log(a.getAttribute("class"))

設定標籤屬性

    a.id="newid";
    a.setAttribute("id","newid")
    a.className="newclass"
    a.setAttribute("class","newclass")

5.3.3 Text節點

包含純文字內容;nodetype是3; nodevalue的值是文字內容

5.4 DOM操作技術

5.4.1 動態引入(載入外部的)js指令碼

    function loadJs(url){
        var script = document.createElement("script");
        script.src = url;
        document.body.appendChild(script);
    }

5.4.2 動態引入樣式表

    function loadCss(url) {
        var link = document.createElement("link");
        link.href = url;
        var head = document.getElementsByTagName('head')[0];
        head.appendChild(link);
    }

5.4.3 動態讀寫css樣式

<div id="aaa" style="width: 100px">12</div>
--------------------
    var a = document.getElementById("aaa");
    a.style.backgroundColor = 'red';

5.4.4 獲得元素大小

獲得元素的偏移大小:margin外的寬、高及距瀏覽器邊框左、上的距離

屬性:offsetwidth、offsetheight、offsetleft、offsettop

獲得客戶區大小:盒子的寬高

屬性:clientwidth、clientheight

相容寫法:

    function getViewport() {
        //ie7之前的相容寫法
        if (document.compatMode == 'BackCompat') {
            return {
                width: document.body.clientWidth,
                height: document.body.clientHeight
            }
        }
        return {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight
        }
    }

    console.log(getViewport());

獲得有滾動條的文件寬高

屬性scrollwidth、scrollheight、scrollleft、scrolltop

相容寫法:

    var docHeight=
        Math.max(document.documentElement.scrollHeight,document.documentElement.clientHeight)
    var docWidth =
        Math.max(document.documentElement.scrollWidth,document.documentElement.clientWidth)
    console.log(docHeight,docWidth);

6 事件

6.1 點選事件

屬性:onclick

特點:事件流先捕獲階段後冒泡階段

冒泡(觸發事件順序從小到大)、捕獲(觸發事件順序從大到小)

新增方式:

DOM2級事件處理程式

    var a=document.getElementById('a')
    a.addEventListener("click",function (){
        alert("abcd")
    },false)//false表示冒泡,true表示捕獲,基本上使用冒泡
    -------
        //移處事件
    a.removeEventListener('click',方法名,false)

ie處理程式

    btn.attachEvent('onclick',function () {})
    btn.detachEvent('onclick',事件名)

跨瀏覽器相容事件處理程式

<input type="button" id="button1" value="按鈕">
--------------------------
    function show() {
        alert("hello world")
    }
    //宣告一個物件
    var eventutil={
    //新增控制代碼
        addHandler:function (element,type,handler) {
            //DOM2級事件處理判斷
            if (element.addEventListener) {
                element.addEventListener(type,handler,false);
            }else if (element.attachEvent){
             //ie事件處理判斷
             element.attachEvent('on'+type,handler);
            }else {
              //DOM0級事件判斷
              element['on'+type]=handler;
            }
        }
    //或者刪除控制代碼
        removeHandler:function (element,type,handler) {
            //DOM2級事件處理判斷
            if (element.removeEventListener) {
                element.removeEventListener(type,handler,false);
            }else if (element.detachEvent){
                //ie事件處理判斷
                element.detachEvent('on'+type,handler);
            }else {
                //DOM0級事件判斷
                element['on'+type]=null;
            }
        }
    }
    eventutil.addHandler(button1,'click',show);

6.2 事件物件

6.2.1 DOM中的事件物件

預設傳入event引數

事件中的this==currenttarget、target屬性

this指事件function繫結的物件,target指實際觸發元素

阻止預設行為和冒泡:

阻止預設行為:preventDefault屬性;

阻止事件向上冒泡:stopPropagation屬性;

相容性寫法:

    //阻止冒泡行為
    function stopBullle(e){
        //W3C瀏覽器
        if (e && e.stopPropagation)
            e.stopPropagation();
        //IE瀏覽器
        else window.event.cancelBubble = true;
    }
    //阻止瀏覽器預設行為
    function stopDefault(e) {
        //W3C瀏覽器
        if (e && e.preventDefault)
            e.preventDefault();
        //IE瀏覽器
        else
            window.event.returnValue = false;
        return false;
    }

6.3 事件型別

6.3.1 load事件:

window.onload:當頁面給全部載入後 包括影象 js檔案 css檔案等外部資源 會觸發window的onload事件

6.3.2 resize事件:

window.onresize:頁面大小改變時觸發

6.3.3 scroll事件:

window.onscroll

6.3.4 滑鼠單擊事件

onclick

6.3.5 鍵盤事件

KeyDown,KeyUp,KeyPress(按下加回彈一次,並且產生一個字元)

6.4 事件委託

本質是冒泡 讓事件處理在父元素上完成,以減少多個子元素需要相同事件時的記憶體佔用

<ul id="ul">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
</ul>
-------------
var ul= document.getElementById('ul')
    ul.onclick=function (e){
        let target=e.target;
        console.log(target.innerHTML)
    }

7 資料交換

7.1 JSON

7.1.1 簡介

js object notation ,js物件簡譜,一種輕量級資料交換格式,物件的屬性需要用雙引號包括,普通物件不用,json常用在前後端資料互動中
http://www.bejson.com/參考網址

7.1.2 JSON的序列化與反序列化

即將json序列轉成字元:JSON.stringify(序列變數名)屬性 & JSON.parse(被序列化的json變數名)屬性

7.2 get和post請求

常用的像後端發起請求的方式

get

讀取資料 可在url後面新增引數 後面新增的引數的資料比較小

post

可以項後端提交資料,可以提交較多資料

url

即網址 http預設埠80可以不寫

請求測試

postman工具

響應

後端返回的東西稱為響應 響應中包含響應資料 響應狀態碼 常用的:200正常、404找不到頁面

7.3 同步和非同步

js是同步語言 非同步中有回撥函式

7.4 如何發起一個請求

常用屬性

onreadystatechange屬性:儲存函式或函式名 每當readystate屬性改變時 就會呼叫該函式

readystate屬性:存有XMLHttpRequest的狀態 從0到4變化;0請求未初始化,1伺服器連結已建立,2請求已接受,3請求處理中,4請求已完成且相應就緒

status屬性:200表示"ok";404表示未找到頁面

ajax方式發起請求步驟

完整的請求需要的是:

請求的網址

提交請求的內容資料、請求主體等

接收響應回來的內容

具體步驟:

1、建立非同步物件 即XMLHttpRequest(xhr);

2、設定請求引數,包括請求的方法、url;

3、傳送請求;

4、註冊事件,onreadystatechange事件,狀態改變時就會呼叫

5、在註冊的事件中獲取返回的內容並修改頁面的顯示,資料是儲存在非同步物件的屬性中


發起get請求:

<body>
<input type="button" value="傳送get_ajax請求" id="btnAjax">
</body>
<script>
    var btn=document.getElementById('btnAjax');
    btn.onclick=function (){
        //1、建立非同步物件xhr;
        var ajaxObj = new XMLHttpRequest();
        //2、設定請求引數,包括請求的方法、url;
        ajaxObj.open("get", "http://localhost/index.php");
        //3、傳送請求;
        ajaxObj.send();
        //4、註冊事件,onreadystatechange事件,狀態改變時就會呼叫
        //如果要在資料完整請求回來的時候才呼叫,我們需要手動寫一些判斷邏輯
        ajaxObj.onreadystatechange = function () {
            //為了保證資料完整返回,我們一般會判斷兩個值
            if (ajaxObj.readyState == 4 && ajaxObj.status == 200) {
                //如果能夠進入這個判斷說明資料完美的回來了,並且請求的頁面是存在的
                //5、在註冊的事件中獲取返回的內容並修改頁面的顯示
                alert('資料返回成功');
                //資料是儲存在非同步物件的屬性中
                console.log(ajaxObj.responseText);
            }
        }
    }
</script>

傳送post請求:

7.5 本地儲存token

cookie、localStorage、sessionStorage

7.5.1 cookie

只能儲存少量資料4KB左右 屬性Document.cookie=“username=john doe”

7.5.2 localStorage

主要儲存方式 儲存資料較大 沒有過期時間 直到手動去除


方法:
返回第n個鍵的名稱key(n)
返回指定鍵的值getitem(keyname)
新增(更新)鍵setitem(keyname,value)
移除鍵removeitem(keyname) 清除所有鍵clear()

7.5.3 sessionStorage

臨時資訊儲存 網頁關閉即消失