js語法基礎

1標識符 2-5數(shù)據(jù)類型和數(shù)據(jù)類型的轉(zhuǎn)化 6算數(shù)運算符 7賦值運算符 8自增自減運算符 9關系運算符 10邏輯運算符 11逗號運算符 12三目運算符 13條件語句 14循環(huán)語句 15變量作用域 16break和continue關鍵字 17數(shù)組 18函數(shù) 19預解析

1.標識符的命名規(guī)則

  • 只能由字母憔恳、數(shù)字榕吼、_宦芦、$組成
  • 不能以數(shù)字開頭
  • 不能使用關鍵字本股,保留字

2.數(shù)據(jù)類型

  • 基本數(shù)據(jù)類型
    Number Strinng Bolean Undefined Null (數(shù)值類型 子字符串類型 布爾類型 未定義類型 空類型)
  • Object 引用數(shù)據(jù)類型
  • 檢測數(shù)據(jù)類型 typeof

3.轉(zhuǎn)化為數(shù)值類型

  • string轉(zhuǎn)化number
    數(shù)值的字符串蝗罗,數(shù)字
    ' ' 空字符串, 0
    數(shù)字加其他的字符串夹纫,NaN
  • boolean是true1 false0
  • null轉(zhuǎn)化number是0
  • undefined轉(zhuǎn)化number是NAN
  • 空字符串/false/null轉(zhuǎn)換之后都是0 字符串中不僅僅是數(shù)字/undefined轉(zhuǎn)換之后是NaN
  • 轉(zhuǎn)化的方法:Number() / +和- / ParseInt()和ParseFloat()

4.轉(zhuǎn)化為字符串類型

  • Number和Boolean, 可以通過變量名.toString()
  • String(value)
  • 常亮or變量 + ' '

5.轉(zhuǎn)化為布爾類型

  • string轉(zhuǎn)化Boolean
    空字符串' '為false,其他為true
  • number
    0為false崔挖,NaN為false
  • undefined, null都是false
  • 空字符串/0/NaN/undefined/null 會轉(zhuǎn)換成false, 其它的都是true
  • 方法:Boolean()

6.算數(shù)運算符 + - * / %

  • 和字符串相加贸街,會拼接字符串
  • 和字符串相減,會轉(zhuǎn)化number再運算
  • 任何和NaN進行運算虚汛,都是NaN
  • Bolean Undefined Null參與加減會被強制轉(zhuǎn)化為number類型

7.賦值運算符

  • = += -= *= /= %=
    例如:res += 1同res = res+1

8.自增自減運算符 ++ --

  • 符號在前面匾浪,先自增再運算
  • 符號在后面,先運算再自增
       let num = 1;
        // let res = num++ + 1; // let res = num + 1; num++; 2
        let res = ++num + 1;  // num++; let res = num + 1; 3
        console.log(res); // 

9.關系運算符 > < >= <= == != === !==

  • 返回值Boolean
  • 和number比較卷哩,轉(zhuǎn)化為number再判斷
  • 和NaN比較蛋辈,返回false
  • 都是string,比較對應的Unicode編碼
  • 判斷NaN将谊,使用方法isNaN()冷溶,因為NaN == NaN或NaN === NaN結(jié)果都是false
  • 判斷取值和類型 === !== 判斷取值 == !=
  • 關系運算符中 > < >= <= 的優(yōu)先級高于 == != === !==
  • 不能利用關系運算符來判斷區(qū)間
    let res = 10 > 5 > 3; // let res = true > 3; let res = 1 > 3;

10.邏輯運算符

  • 與 &&
    一假則假
    條件A && 條件B
    A不成立,返回A(因為判斷為false后尊浓,就會終止后面的運算)
  • 或 ||
    一真則真
    條件A || 條件B
    A成立逞频,返回A(因為判斷為true后,就會終止后面的運算)
  • 非!
    取反
  • &&的優(yōu)先級高于||

11.逗號運算符

  • 在JavaScript中逗號運算符一般用于簡化代碼
    利用逗號運算符同時定義多個變量
    let a, b;
    利用逗號運算符同時給多個變量賦值
    a = 10, b = 5;
  • 逗號運算符的優(yōu)先級是所有運算符中最低的
  • 逗號運算符的運算符結(jié)果就是最后一個表達式的結(jié)果
    表達式1, 表達式2, 表達式3, ....;
 let res = ((1 + 1), (2 + 2), (3 + 3));
console.log(res);//6

12.三目運算符

  • 條件表達式 ? 結(jié)果A : 結(jié)果B;
    let res = (1 > 5) ? 1 : 5;

13.條件語句

  • if
//第一種形式
        if(條件表達式){
            條件滿足執(zhí)行的語句;
        }

//第二種形式
        if(條件表達式){
            條件成立執(zhí)行的語句;
        }else{
            條件不成立執(zhí)行的語句;
        }

//第三種形式
        if(條件表達式A){
            條件A滿足執(zhí)行的語句;
        }else if(條件表達式B){
            條件B滿足執(zhí)行的語句;
        }
        ... ...
        else{
            前面所有條件都不滿足執(zhí)行的語句;
        }
  • switch
        switch(表達式){
            case 表達式A:
                語句A;
                break;
            case 表達式B:
                語句B;
                break;
            ... ...
            default:
                前面所有case都不匹配執(zhí)行的代碼;
                break;
        }
//例
        let day = 7;
        switch (day) {
            case 1:
                console.log("星期1");
                break;
            case 2:
                console.log("星期2");
                break;
            case 3:
                console.log("星期3");
                break;
            default:
                console.log("Other");
                break;
        }
  • if 和switch的選擇
    幾個固定的值使用switch栋齿,其他使用if

14.循環(huán)語句

  • while
        while(條件表達式){
            條件滿足執(zhí)行的語句;
        }
//死循環(huán)
        while (true){
            console.log("123");
        }
  • dowhile
        do{
            需要重復執(zhí)行的代碼;
        }while(條件表達式);
        //dowhile循環(huán)的特點: 無論條件表達式是否為真, 循環(huán)體都會被執(zhí)行一次
  • for
        for(初始化表達式;條件表達式;循環(huán)后增量表達式){
            需要重復執(zhí)行的代碼;
        }

//例如
        for(let num = 1;num <= 10;num++){
            console.log("次數(shù)" + num);
        }


//在for循環(huán)中"初始化表達式""條件表達式""循環(huán)后增量表達式"都可以不寫
         for(;;){ //for循環(huán)是可以省略條件表達式的, 默認就是真
            console.log("123");
         }

15.變量作用域

  • var 定義變量
    可以重復定義同名的變量苗胀,并且"相同作用域內(nèi)"后定義的會覆蓋先定義的
    可以先使用后定義(預解析)
  • let 定義變量
    "相同作用域內(nèi)"不可以重復定義同名的變量
    不可以先使用后定義(不能預解析)
  • 局部作用域
    在函數(shù){}內(nèi)
  • 塊級作用域
    沒有和函數(shù)結(jié)合在一起{}
  • 全局變量
    省略var或let的變量
    在全局作用域中定于的變量
    在塊級作用域中通過var定義的變量是全局變量
  • 局部變量
    在局部作用域定于的變量
    在塊級作用域中通過let定義的變量是全局變量
  • 作用域鏈
    變量在作用域鏈查找規(guī)則襟诸,就近原則

16.break和continue關鍵字

  • break關鍵字可以用于switch語句和循環(huán)結(jié)構(gòu)中
    立即結(jié)束當前的switch語句
    終止循環(huán)
  • continue關鍵字只能用于循環(huán)結(jié)構(gòu)
    在循環(huán)結(jié)構(gòu)中continue關鍵字的作用是跳過本次循環(huán), 進入下一次循環(huán)
        for(let num = 1; num <= 10; num++){
            if(num === 1){
                continue;
                console.log("continue后面的代碼"); // 永遠執(zhí)行不到
            }
            console.log("發(fā)射子彈" + num);//跳過1
        }

17.數(shù)組

  • 創(chuàng)建一個數(shù)組
    通過構(gòu)造函數(shù)創(chuàng)建:let arr = new Array(size);
    字面量的方式:let arr = [ ]

  • 數(shù)組遍歷
    for(let i = 0; i < arr.length; i++){
    console.log(arr[i]);
    }

  • 數(shù)組結(jié)構(gòu)賦值
    一般:let [a, b, c] = [1, 3];//c是undefined
    給定默認值:let [a, b = 666, c = 888] = [1,2];//b是2
    使用擴展運算符(擴展運算符只能寫在最后): let [a, ...b] = [1, 3, 5];//b[3,5]

  • 數(shù)組常用的方法

  1. 清空數(shù)組
    let arr = [1, 2, 3, 4, 5];
    // arr = [ ];
    // arr.length = 0;
    // arr.splice(0, arr.length)
  2. 將數(shù)組轉(zhuǎn)化為字符串
    let arr = [1, 2, 3, 4, 5];
    //let str = arr.toString();
    // let str = arr.join('分隔符') 默認為','
  3. 拼接數(shù)組
    // let arr1 = [1, 3, 5];
    // let arr2 = [2, 4, 6];
    // let res = arr1.concat(arr2);
    // let res = [...arr1, ...arr2];
  4. 反轉(zhuǎn)數(shù)組
    arr.reverse();
  5. 截取數(shù)組
    arr.slice(start,end)
    不包括end
    返回值:array 被截取的元素的數(shù)組
  6. 查找索引
    arr.indexOf(item,start);
    arr.lastIndexOf(item基协,start);
    返回值:number 元素的索引歌亲,沒有返回-1
  7. 是否包含
    arr.includes(value);
  8. 刪除,替換
    array.splice(index,howmany,item1,.....,itemX)
    改變原始數(shù)組
    返回值:array 被刪除的元素的數(shù)組
  9. 在數(shù)組最后增刪
    array.push(item1, item2, ..., itemX)
    改變原始數(shù)組
    數(shù)組的末尾添加一個或多個元素澜驮,并返回新的長度
    array.pop()
    改變原始數(shù)組
    刪除數(shù)組的最后一個元素并返回刪除的元素
    10.在數(shù)組開始增刪
    array.unshift(item1,item2, ..., itemX)
    array.shift()

18.函數(shù)

  • 定義
    函數(shù)是專門用于封裝代碼的, 函數(shù)是一段可以隨時被反復執(zhí)行的代碼塊
  • 格式
    function 函數(shù)名稱(形參列表){
    被封裝的代碼;
    }
//一般
        function getSum(a, b) {
            console.log(a, b);
            return a + b;
        }
//保存到變量
let getSum = function (a, b) {
            console.log(a, b);
            return a + b;
        }
  • 函數(shù)return
    return作用結(jié)束當前所在函數(shù)
    函數(shù)沒有通過return明確返回值, 默認返回undefined
  • 調(diào)用函數(shù)時實參的個數(shù)和形參的個數(shù)可以不相同
  • 函數(shù)實參的默認值
//es6之前
        function getSum(a, b) {
            a = a || "1";
            b = b || "2";
            console.log(a, b);
        }
        getSum(123, "abc");
//es6之后
        function getSum(a = "1", b = getDefault()) {
            console.log(a, b);
        }
        getSum();
        // getSum(123, "abc");
        function getDefault() {
            return "2"
        }
  • 函數(shù)是引用數(shù)據(jù)類型(對象類型)
  • 函數(shù)arguments
    保存所有傳遞給函數(shù)的實參陷揪,例如 console.log(item1,...杂穷,itemX);
  function getSum() {
            // 注意點: 每個函數(shù)中都有一個叫做arguments的東東
            // arguments其實是一個偽數(shù)組
            console.log(arguments);
            console.log(arguments[0]);
            console.log(arguments[1]);
            console.log(arguments[2]);
}
 getSum(10, 20, 30, 40);
image
  • 函數(shù)的擴展運算符
  1. 在左邊悍缠,將剩余的數(shù)據(jù)打包到一個新的數(shù)組中(解構(gòu)賦值)
    只能寫在最后
    let [a, ...b] = [1, 3, 5];// a = 1; b = [3, 5];
  2. 在右邊,將數(shù)組中的數(shù)據(jù)解開
    let arr1 = [1, 3, 5];
    let arr2 = [2, 4, 6];
    let arr = [...arr1, ...arr2];// arr = [1, 3, 5, 2, 4, 6];
  3. 擴展運算符在函數(shù)的形參列表中的作用
    將傳遞給函數(shù)的所有實參打包到一個數(shù)組中
    只能寫在形參列表的最后
        function getSum(...values) {
            // console.log(values);
            let sum = 0;
            for (let i = 0; i < values.length; i++){
                let num = values[i];
                sum += num;
            }
            return sum;
        }
        let res = getSum(10, 20, 30, 40);
        console.log(res);
  • 函數(shù)作為參數(shù)和返回值
//作為參數(shù)
        function a(){
            console.log('a');
        }

        function test(fn) {
            fn();
        }
        test(a);
//作為返回值
        function test() {
            // 注意點: 在其它編程語言中函數(shù)是不可以嵌套定義的,
            // 但是在JavaScript中函數(shù)是可以嵌套定義的
            let say = function () {
                console.log("hello world");
            }
            return say();
        }
        test();
  • 匿名函數(shù)
    作為其他函數(shù)的參數(shù)
    作為其他函數(shù)的返回值
    作為一個立即執(zhí)行的函數(shù)
    不能夠只定義不使用
        // 作為其他函數(shù)的參數(shù)
        function test(fn) { 
            fn();
        }
        test(function () {
            console.log("hello world");
        });
        // 作為其他函數(shù)的返回值
        function test() {
            return function () {
                console.log("hello lnj");
            };
        }
        let fn = test(); 
        fn();
        // 作為一個立即執(zhí)行的函數(shù)
        (function () {
            console.log("hello it666");
        })();
  • 箭頭函數(shù)
    格式:
    let 函數(shù)名稱 = (形參列表) =>{
    需要封裝的代碼;
    }
    let say = () => {
    console.log("hello world");
    }
    只有一個形參, 那么()可以省略
    let say = value => {
    console.log("hello world");
    }
    只有一句代碼, 那么{}也可以省略
    let say = value => console.log("hello world");
  • 遞歸函數(shù)
    遞歸函數(shù)就是在函數(shù)中自己調(diào)用自己, 我們就稱之為遞歸函數(shù)
    遞歸函數(shù)在一定程度上可以實現(xiàn)循環(huán)的功能
    每次調(diào)用遞歸函數(shù)都會開辟一塊新的存儲空間, 所以性能不是很好
//不使用遞歸
        let pwd = -1;
        do{
            pwd = prompt("請輸入密碼");
        }while (pwd !== "123456");
        alert("密碼正確");
//使用遞歸
        function login() {
            let pwd = prompt("請輸入密碼");
            if(pwd !== "123456"){
                login();
            }
            alert("密碼正確");
        }
        login();
如上流程耐量,會彈出3次 第三方的圖片
直接上傳的圖片

19.預解析

  • 瀏覽器在執(zhí)行JS代碼的時候會分成兩部分操作:
    預解析以及逐行執(zhí)行代碼飞蚓,也就是說瀏覽器不會直接執(zhí)行代碼,
    而是加工處理之后再執(zhí)行,這個加工處理的過程, 我們就稱之為預解析
  • 預解析的規(guī)則
    將變量聲明和函數(shù)聲明提升到當前作用域最前面
    將剩余代碼按照書寫順序依次放到后面
    通過let定義的變量不會被提升(不會被預解析)
    如果將函數(shù)賦值給一個var定義的變量, 那么函數(shù)不會被預解析, 只有變量會被預解析
 //var 定義變量預解析
        // 預解析之前
        console.log(num); //undefined
        var num = 123;
        // 預解析之后
        var num;
        console.log(num);
        num = 123;
        
 //函數(shù)預解析
        // ES6之前定義函數(shù)的格式
        console.log(say);
        say();
        // ES6之前的這種定義函數(shù)的格式, 是會被預解析的, 所以可以提前調(diào)用
        function say() {
            console.log("hello world");
        }
        // 預解析之后的代碼
        function say() {
            console.log("hello world");
        }

//函數(shù)賦值給一個var定義的變量
        say();
        console.log(say);
        say(); // say is not a function
        // 如果將函數(shù)賦值給一個var定義的變量, 那么函數(shù)不會被預解析, 只有變量會被預解析
        var say = function() {
            console.log("hello itzb");
        }
        var say; //undefined
        say();
        say = function() {
            console.log("hello itzb");
        }
  • 預解析case
//case1
        var a = 666;
        test();
        function test() {
            var b = 777;
            console.log(a);
            console.log(b);
            console.log(c);
            var a = 888;
            let c = 999;
        }
/*
        var a;
        function test() {
           var b;
           var a;
           b = 777;
            console.log(a); // undefined
            console.log(b); // 777
            console.log(c); // 報錯
            a = 888;
            let c = 999;
        }
        a = 666;
        test();
*/
//case2   
         //如果變量名稱和函數(shù)名稱同名, 那么函數(shù)的優(yōu)先級高于變量
        console.log(value); // 會輸出函數(shù)的定義
        var value = 123;
        function value() {
            console.log("fn value");
        }
        console.log(value); // 會輸出123
        /*
        function value() {
            console.log("fn value");
        }
        var value;
        console.log(value);
        value = 123;
        console.log(value);
        */

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市廊蜒,隨后出現(xiàn)的幾起案子玷坠,更是在濱河造成了極大的恐慌,老刑警劉巖劲藐,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異樟凄,居然都是意外死亡聘芜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門缝龄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汰现,“玉大人,你說我怎么就攤上這事叔壤∠顾牵” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵炼绘,是天一觀的道長嗅战。 經(jīng)常有香客問我,道長俺亮,這世上最難降的妖魔是什么驮捍? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮脚曾,結(jié)果婚禮上东且,老公的妹妹穿的比我還像新娘。我一直安慰自己本讥,他們只是感情好珊泳,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布鲁冯。 她就那樣靜靜地躺著,像睡著了一般色查。 火紅的嫁衣襯著肌膚如雪薯演。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天综慎,我揣著相機與錄音涣仿,去河邊找鬼。 笑死示惊,一個胖子當著我的面吹牛好港,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播米罚,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼钧汹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了录择?” 一聲冷哼從身側(cè)響起拔莱,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隘竭,沒想到半個月后塘秦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡动看,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年尊剔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菱皆。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡须误,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仇轻,到底是詐尸還是另有隱情京痢,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布篷店,位于F島的核電站祭椰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏船庇。R本人自食惡果不足惜吭产,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸭轮。 院中可真熱鬧臣淤,春花似錦、人聲如沸窃爷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至医吊,卻和暖如春钱慢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卿堂。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工束莫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人草描。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓览绿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親穗慕。 傳聞我的和親對象是個殘疾皇子饿敲,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • ECMAScript - 學習筆記 ?? ??nvm node.js 包管理工具 nvm github[https:/...
    Super三腳貓閱讀 612評論 0 1
  • JavaScrip腳本語言: 特性:松散(對于開發(fā)者的要求低) 如:定義變量嚴禁語言: int a=30; 松...
    啊哈哈哈哈_ec43閱讀 194評論 0 0
  • 實習的時候?qū)懙膶W習筆記 如有錯誤請各位大佬直接留言批判逛绵,防止錯誤的信息會誤導他人怀各! ---------------...
    ci魚丸粗面閱讀 499評論 0 0
  • 一,JavaScript的書寫格式 1.行內(nèi)腳本:寫在HTML標簽內(nèi)部术浪,通過一個屬性節(jié)點來添加瓢对,不推薦使用,例如“...
    劉遠舟閱讀 455評論 0 0
  • 入門與進階 第一章 進入編程 1胰苏,如何快速運行一段js代碼沥曹? 方式1:瀏覽器開發(fā)者工具〉可以使用快捷鍵option...
    瀟瀟瀟瀟瀟瀟瀟閱讀 851評論 0 0