你所不知道的js的小知識點(1)

LeoX的爬坑筆記發表於2018-09-12

1.js除錯工具 debugger

<div class="container">
<h3>debugger語句會產生一個斷點,用於除錯程式,並沒有實際功能;</h3>

<ol>
<li>使用debugger的前提是你手動開啟了“開發者工具”;</li>
<li>debugger會產生一個斷點,程式碼會停止在這裡不再往下執行;</li>
</ol>
</div>
<script>
console.log(1);
debugger;
console.log(2);
</script>

2.獲取頁面元素 document.querySelector()

<h3>如何獲取頁面元素?</h3>
    <ol>
        <li>獲取單個元素:document.querySelector(`選擇器`),如果該選擇器對應多個元素,則只返回第一個;</li>
        <li>獲取多個元素:document.querySelectorAll(`選擇器`),獲取選擇器對應的全部元素;</li>
    </ol>

3.型別轉換

<h3>型別轉換</h3>
        <ol>
            <li>JavaScript總是把值自行轉換為他需要的資料型別;</li>
            <li>
                轉化為數字:
                -(減)、*(乘)、/(除),會把型別轉換成數字; <br>
                true轉化為1,false、空字串轉換為0;<br>
                略坑的加號:+,只要有一個是字串,則全部作為字串;
                因為加號(+)同時還是字串連線符號;
            </li>
            <li>原始值到物件的轉換:直接使用String()、Number()、Boolean()建構函式轉換;</li>
        </ol>

4.作為屬性的變數

<h3>作為屬性的變數</h3>
        <ol>
            <li>使用var宣告變數時,作為全域性物件的一個屬性,無法通過delete運算子刪除;</li>
            <li>不使用var,直接給一個未宣告的變數賦值,該變數是可以delete的;</li>
            <li>不使用var,使用關鍵詞this給一個變數賦值,也是可以delete的;</li>
        </ol>

5.作用域鏈(概念知識,重點!)

<h3>作用域鏈</h3>
        <ol>
            <li>JavaScript裡的全域性程式碼或者函式,都有一個與之對應的作用域鏈;</li>
            <li>作用域鏈可以理解為物件的列表,或叫物件的連結串列,他們是按優先順序順序排列的;</li>
            <li>這些物件就定義了一段程式碼或者函式的“作用域中”的變數;</li>
            <li>在全域性程式碼(就是不是函式的程式碼,好扯~~)中,作用域鏈由一個全域性物件組成;</li>
            <li>
                在無巢狀的函式中,作用域鏈有兩個物件:<br>
                一、定義函式引數和區域性變數的物件; <br>
                二、定義全域性變數的物件;<br>
                如果是巢狀函式,則作用域鏈上至少三個物件;
            </li>
            <li>
                當程式碼執行需要<code>變數解析</code>(就是查詢需要的變數的值)的時候,<br>
                就在作用域鏈(有順序的物件或者連結串列)裡面尋找對應的變數,<br>
                一旦找到就使用該變數並結束尋找;<br>
                如果作用域鏈裡面找不到對應的變數,則丟擲錯誤;
            </li>
        </ol>

6.關係表示式

        <h3>關係運算子用於檢測兩個值之間的關係;</h3>
        <ol>
            <li>總是返回一個布林值true或false;</li>
            <li>==:相等運算子,檢查兩個值是否相等,不考慮型別;</li>
            <li>===:恆等運算子,檢查兩個值是否相等,同時考慮型別;</li>
            <li>比較運算子:>、>=、<、<=;</li>
            <li>
                in運算子:檢查右側物件裡面是否擁有左側屬性名,如果有返回true; <br>
                例項程式碼一看就什麼都懂了 :
                <pre>
                    var a = {x:1, y:2, z:``};
                    console.log(a);
                    console.log(`x` in a);
                    console.log(`z1` in a);
                    console.log(`toString` in a);
                    console.log(`isPrototypeOf` in a);
                </pre>
            </li>
            <li>
                instanceof:檢查左側的物件是否是右側類的例項,如果是返回true; <br>
                如果一個物件是一個“父類”的子類的例項,則一樣返回true; <br>
                還有記住一點所有的物件都是Object的子類(後面原型鏈會講到); <br>
                所以,還是看程式碼:
                <pre>
                    var d = new Date();
                    console.log(d instanceof Date);
                    console.log(d instanceof Array);
                    console.log(d instanceof String);
                    console.log(d instanceof Object);
                </pre>

            </li>
            
        </ol>

7.位運算子

<h3>位運算子對數字的二進位制資料進行更低層級的按位運算,高階,然而不常用;</h3>
        <ol>
            <li>位運算要求運算元是整數;</li>
            <li>位運算會將NaN、Infinity、-Infinity轉換為0;</li>
            <li>按位於:&,對運算元的二進位制表示逐步執行AND操作;</li>
            <li>按位或:|,對運算元的二進位制表示逐步執行OR操作;</li>
            <li>按位異或:^,對運算元的二進位制表示逐步執行XOR操作,一個為1另一個不為1才返回1;</li>
            <li>按位或:~,對運算元的二進位制表示所有位取反;</li>
            <li>左移:<<,對運算元的二進位制表示進行左移,移動位數由第二個運算元指定;新的一位用0補充,並捨棄第32位;左移1位相當於*2,左移2位相當於*4,以此類推;</li>
            <li>帶符號右移:>>,右邊溢位的位忽略;如果是正數,左邊最高位補0;如果是負數,左邊最高位補1;右移1位相當於/2,右移2位相當於/4,不要餘數,以此類推;</li>
            <li>無符號右移:>>>,和帶符號右移一樣,只是左邊的最高位總是補0;</li>
        </ol>

8.算術表示式

<h3>大聲說出來你知道的算術運算子:加減乘除取餘,+-*/%;</h3>
        <ol>
            <li>
                +:數字相加 或 字串連線; <br>
                加法操作的行為表現: <br>
                一、如果其中一個運算元是物件,則JavaScript會自動把他轉成原始型別的值;<br>
                二、如果其中一個運算元是字串的話,則另一個也會轉成字串,然後你懂的;<br>
                三、如果兩個運算元都是數字,則進行加法運算; <br>
                可憐巴巴的樣子,還是給你弄幾個例子吧:
                <pre>
                    console.log(1 + 5);
                    console.log(`1` + 5);
                    console.log(new Date() + `--ok`);
                    console.log(12 + NaN);
                    console.log(true + true);
                    console.log(201 + null);
                    console.log(203 + undefined);
                    console.log(3 + 5 + `猜猜看`);
                </pre>
            </li>
            <li>其他的算術運算子還用講嗎?</li>
        </ol>

9.物件建立表示式

<h3>由函式呼叫表示式延伸而來,前面加個new即可;</h3>
        <ol>
            <li>如果不需要傳遞引數,函式後面的小括號可以省略;</li>
            <li>如果呼叫的函式或方法沒有返回值,則表示式的值是undefined;</li>
            <li>簡單理解就是函式或方法名稱後面跟上小括號代表執行;</li>
            <li>不看個例子感覺不踏實:
                <pre>
                    new Array(1,2,3);
                    new String(`hello world!`);
                </pre>
            </li>
        </ol>

10.標籤語句

<h3>跳轉語句可以讓JavaScript程式碼的執行從一個位置跳轉到另一個位置,厲害了~</h3>

        <h3>標籤語句</h3>
        <ol>
            <li>標籤由識別符號加冒號組成,如:gohere:;</li>
            <li>標籤識別符號+冒號(:)+語句,就組成了標籤語句;</li>
            <li>break 和 continue可以使用語句標籤;</li>
        </ol>

11.for-in     一個重點例子,猜猜會列印什麼?為什麼?

var personobj = {
                        name: `你叫什麼?`,
                        sex: `男`,
                        weight: `160`
                    };
                    var arr = new Array();
                    var i = 0;
                    for(arr[i++] in personobj);
                    console.log(arr);

12.try-catch-finally

<h3>try-catch-finally是JavaScript的異常處理機制;</h3>

        <ol>
            <li>
                語法結構是這樣的:
                <pre>
                try{
                    //我們自認為沒有錯誤的 處理業務的程式碼
                }
                catch(e){
                    //上面的業務處理程式碼報錯了,這裡才會執行
                    //console.log(e);
                }
                finally{
                    //這裡總是會執行,哎喲,領導啊,總結髮言
                }
                </pre>
            </li>
            <li>異常物件e裡面有兩個屬性name和message,分別代表錯誤型別和錯誤描述資訊;</li>
            <li>
                瞄一眼小案例:
                <pre>
                    try{
                        console.log(a);
                    }
                    catch(e){
                        console.log(e.name); //返回錯誤型別
                        console.log(e.message); //錯誤描述
                    }
                    finally{
                        console.log(`大會到處結束`);
                    }
                </pre>
            </li>
        </ol>

13.with語句用於臨時擴充套件作用域鏈

<h3>with語句用於臨時擴充套件作用域鏈;</h3>

        <ol>
            <li>是的,臨時擴充套件作用域,臨時;with程式碼塊執行完成後恢復原始狀態;</li>
            <li>
                語法結構是這樣的:
                <pre>
                with(object){
                    statement;
                }
                </pre>
                將object新增到作用域鏈的頭部,執行完成statement後,作用域鏈恢復到原始狀態;
            </li>
            <li>
            看程式碼吧
            <pre>
                /*
                 *清空表單所有輸入框的值
                 *document.querySelector[`#myform`].username.value = ``; 
                 *document.querySelector[`#myform`].password.value = ``; 
                 *document.querySelector[`#myform`].coder.value = ``; 
                 */
                with(document.querySelector[`#myform`]){
                    username.value  = ``; 
                    password.value  = ``; 
                    coder.value     = ``; 
                }
            </pre>
            這就是with的用法;
            </li>
            <li>但是,不推薦使用with,有程式碼不好優化,執行慢等問題;</li>
            <li>並且,嚴格模式下是不能使用with的;</li>
            <li>所以,能不用我看你還是不要用with了吧;</li>
        </ol>

14.use strict

 <h3>use strict是將後續的程式碼解析為嚴格程式碼;</h3>

        <ol>
            <li>嚴格模式下禁止使用with;</li>
            <li>嚴格模式下所有的變數都要先宣告;</li>
            <li>
                嚴格模式下呼叫函式的this值是undefined;下面這段小程式碼不加"use strict"的區別;
                <pre>
                    "use strict";
                    function fn(){
                        console.log(this);
                    }
                    fn();
                </pre>
            </li>
            <li>嚴格模式和普通模式有很多細微差別,記住很困難,基本原則是:<code>寫程式碼要嚴謹</code>,不要偷懶,不要覺得當前程式碼可以正常執行即可;</li>
        </ol>

 

相關文章