前端工程師面試題甸怕?es6,promise概念畔勤?

1.什么是 es6蕾各?

是 ECMAScript 的第六個(gè)版本 在 es5 的基礎(chǔ)上新增加了一些語(yǔ)法
js 分成三部分 dom(文檔對(duì)象模型) bom(瀏覽器對(duì)象模型) ECMAScript(js 語(yǔ)法)

2.promise概念?

promise 是 es6 提供的一種異步解決方案庆揪,在我的理解中 promise 就是把異步操作換了一種寫法
從之前的嵌套回調(diào)函數(shù) 變成了鏈?zhǔn)降膶懛?br> promise 本身其實(shí)就是一個(gè)容器 里面放異步的代碼 這樣就可以讓這個(gè)異步的代碼執(zhí)行.then .catch 的操作

2.1. 說(shuō)?下你對(duì)promise的理解?

promise 是 es6 提供的一種異步解決方案式曲,在我的理解中 promise 就是把異步操作換了一種寫法
從之前的嵌套回調(diào)函數(shù) 變成了鏈?zhǔn)降膶懛?/p>

2.2. 什么是promise?通過(guò)promise能夠解決什么問(wèn)題?

promise 是 es6 提供的一種異步解決方案,
promise 可以解決回調(diào)地獄的問(wèn)題
回調(diào)地獄就是拿到 a 接口的數(shù)據(jù)后才能根據(jù) a 返回的數(shù)據(jù)請(qǐng)求 b 接口
這樣回調(diào)函數(shù)嵌套回調(diào)函數(shù)的寫法就叫回調(diào)地獄
這種寫法會(huì)讓代碼臃腫 并且后期難以維護(hù)
除了 promise 之外 async 是解決回調(diào)地獄的最終方案

  <script src="JQuery.js"></script>
    <script>
        // 拿到a的數(shù)據(jù)后才去請(qǐng)求b,拿到b的數(shù)據(jù)后再去請(qǐng)求c 這就叫回調(diào)地獄
        // 像這種回調(diào)嵌套回調(diào)的寫法就叫回調(diào)地獄
        $.ajax({
            method: "get",
            url: "data.json",
            success(res) {
                console.log(res);
                $.ajax({
                    method: "get",
                    url: "data2.json",
                    success(res) {
                        console.log(res);
                        $.ajax({
                            method: "get",
                            url: "data3.json",
                            success(res) {
                                console.log(res);
                            },
                        });
                    },
                });
            },
        });

        //jq的ajax本身就是一個(gè)promise對(duì)象
        $.ajax({
                method: "get",
                url: "data.json",
            })
            .then((res) => {
                console.log(res);
                return $.ajax({
                    method: "get",
                    url: "data2.json",
                });
            })
            .then((res) => {
                console.log(res);
                return $.ajax({
                    method: "get",
                    url: "data3.json",
                });
            })
            .then((res) => {
                console.log(res);
                console.log("最終拿到的", res);
            });
        //用promise 的方法處理回調(diào)地獄

        // es7的時(shí)候出了一個(gè)async和await 是解決回調(diào)地獄的終極方案

        async function getdata() {
            let data = await $.ajax({
                method: "get",
                url: "data.json"
            });
            console.log(data);

            let data2 = await $.ajax({
                method: "get",
                url: "data2.json"
            });
            console.log(data2);
            let data3 = await $.ajax({
                method: "get",
                url: "data3.json",
            });
            console.log(data3);
            return data3;
        }
        // async函數(shù)return的永遠(yuǎn)是一個(gè)promise對(duì)象
        getdata().then((res) => {
            console.log(res);
        });


        function handler() {
            let data = ""
            $.ajax({
                method: "get",
                url: "data.json",
                success(res) {
                    data = res;
                }
            });
            console.log(data);
        }
        handler()


        function* getdata2() {
            yield $.ajax({
                method: "get",
                url: "data.json"
            })
            yield $.ajax({
                method: "get",
                url: "data2.json"
            })
            yield $.ajax({
                method: "get",
                url: "data3.json"
            })
        }

        let obj = getdata2();
        obj.next().value.then(res => {
                console.log(res);
                return obj.next().value
            }).then(res => {
                console.log(res);
                return obj.next().value
            }).then(res => {
                console.log("generator拿到的數(shù)據(jù)", res);
            })
            //用generator處理回調(diào)地獄 但是這種寫法一般不用因?yàn)閍sync已經(jīng)取代了generotor
    </script>

2.3. 說(shuō)?下 promise 的特點(diǎn)?也就是三種狀態(tài)?

promise ?共有三個(gè)狀態(tài),分別是進(jìn)?中,成功或者失敗 如何成功的話可以通過(guò) resolve ?法將正確結(jié)
果返回出去,通過(guò).then 的?式進(jìn)?接受,失敗的話可以通過(guò) reject 的?式將失敗的結(jié)果返回出去,通 過(guò).catch 的?式進(jìn)?接受,pending 狀態(tài)是進(jìn)?中,?旦進(jìn)?之后,他的狀態(tài)是不可逆的

2.4. 說(shuō)?下 promise 怎么??

如果要使? promise,我們需要對(duì) promise 進(jìn)?實(shí)例化,在實(shí)例化的構(gòu)造函數(shù)??有?個(gè)回調(diào)函數(shù),這個(gè)
回調(diào)函數(shù)??有兩個(gè)參數(shù),分別是 resolve 和 reject,我們可以通過(guò) promise 的實(shí)例化對(duì)象調(diào)?.then 或 者.catch ?式接受結(jié)果

 <script>
 //封裝 promise
        let xhr = new XMLHttpRequest();
        //第一步創(chuàng)建xhr對(duì)象
        xhr.open("get", "./data.json", true);
        //第二步:設(shè)置請(qǐng)求的基本信息 如果是post請(qǐng)求在這里要設(shè)置一個(gè)頭信息
        // get方式傳參是在路徑后面吝羞? 拼接 而post是在send里傳
        // 第三個(gè)參數(shù) 可以控制異步同步 true就是異步

        xhr.send();
        //第三步:向服務(wù)器發(fā)送鏈接
        // xhr.onreadystatechange = function() {
        //     console.log(xhr.readyState);
        //     if (xhr.readyState == 4 && xhr.status == 200) {
        //         console.log(xhr.responseText);
        //     }
        // };
        // 第四步 在xhr對(duì)象和服務(wù)器都響應(yīng)成功的時(shí)候拿到數(shù)據(jù)
        // 可以用onreadystatechange 事件這個(gè)事件的意思是 只要xhr的狀態(tài)發(fā)生改變就會(huì)觸發(fā) 需要判斷xhr的狀態(tài)為4 服務(wù)器的狀態(tài)為200 就代表都準(zhǔn)備好了 我們就可以拿到數(shù)據(jù)了
        // 也可以用下面的onload事件代替 onload本身就代表xhr對(duì)象已經(jīng)準(zhǔn)備好了 所以我們只需要判斷服務(wù)器的狀態(tài)是200就可以拿到數(shù)據(jù)了

        // responseText就是拿到的數(shù)據(jù)
        xhr.onload = () => {
            if (xhr.status == 200) {
                // console.log(xhr.responseText);
            } else {}
        };
        //onload事件在js中是加載完成

        // 把上面的原生js請(qǐng)求ajax的普通寫法變成promise的寫法

        function js_ajax(params) {
            return new Promise((resolve, reject) => {
                let xhr = new XMLHttpRequest();
                xhr.open(params.method, params.url, true);
                xhr.send();
                xhr.onload = () => {
                    if (xhr.status == 200) {
                        let res = JSON.parse(xhr.responseText);
                        resolve(res);
                    } else {
                        reject("請(qǐng)求失敗");
                    }
                };
            });
        }
        //把異步請(qǐng)求放進(jìn)promise容器中 就變成一種promise的寫法 then就執(zhí)行成功的resolve回調(diào)cathc就執(zhí)行失敗的reject回調(diào)
        js_ajax({
                method: "get",
                url: "./data.json",
            })
            .then((res) => {
                console.log(res);
            })
            .catch((err) => {
                console.log(err);
            });

        // js封裝的promise處理回調(diào)地獄的寫法
        js_ajax({
                method: "get",
                url: "./data.json",
            })
            .then((res) => {
                console.log(res);
                return js_ajax({
                    method: "get",
                    url: "./data2.json",
                });
            })
            .then((res) => {
                console.log(res);
                return js_ajax({
                    method: "get",
                    url: "./data3.json",
                });
            })
            .then((res) => {
                console.log(res);
            });
    </script>

2.5. 我們之前遇到的哪些東西本身就是一個(gè) promise 對(duì)象兰伤?

jq 的 ajax 請(qǐng)求本身就是一個(gè) promise 對(duì)象 所以可以直接用.then
axios 也是一個(gè) promise 對(duì)象

原生的 ajax 以及 小程序的 wx.request 請(qǐng)求都不是 promise 對(duì)象 不能用。then 的寫法钧排,如果想用鏈?zhǔn)綄懛?就要自己封裝一個(gè) promise

3.promise 的 all 和 race 方法

promise 還給我們提供了.all 和 race, 其中 all ?法的作?是將多個(gè)請(qǐng)求合并成?個(gè)請(qǐng)求, ?如當(dāng)??
要請(qǐng)求 10 個(gè)接?,我們可以 promise.all 進(jìn)?合并,.race 的作?也可以將多個(gè)請(qǐng)求合并成?個(gè)請(qǐng)求,不過(guò)
是誰(shuí)先請(qǐng)求成功就先返回誰(shuí).

 <script src="./JQuery.js"></script>
    <script>
        Promise.all([
                $.ajax({
                    url: "data.json",
                }),
                $.ajax({
                    url: "data2.json",
                }),
                $.ajax({
                    url: "data3.json",
                }),
            ]).then((res) => {
                // console.log(res);
                let [data, data2, data3] = res;
                //解構(gòu)數(shù)組
                console.log(data, data2, data3);
            }).catch(err => {
                console.log(err);
            })
            //all方法可以并發(fā)請(qǐng)求 同時(shí)發(fā)送多個(gè)請(qǐng)求 當(dāng)所有的請(qǐng)求都成功的時(shí)候才會(huì)執(zhí)行then方法 res是一個(gè)數(shù)組 放的就是請(qǐng)求到的數(shù)據(jù)

        Promise.race([
            $.ajax({
                url: "data.json",
            }),
            $.ajax({
                url: "data2.json",
            }),
            $.ajax({
                url: "data3.json",
            }),
        ]).then((res) => {
            console.log(res);

        });
        // race方法 也是執(zhí)行多個(gè)請(qǐng)求 誰(shuí)先請(qǐng)求成功就會(huì)執(zhí)行then方法并且得到請(qǐng)求到的數(shù)據(jù)
    </script>

4.說(shuō)?下 async 和 await敦腔、以及他們和 promise 的區(qū)別?

?先 async 和 await 是解決異步的終極?案,async 和 await ?般配和使?,當(dāng)我
們給函數(shù)前?加上關(guān)鍵字 async,這個(gè)時(shí)候,這個(gè)函數(shù)的返回值就是?個(gè) promise. ? await 是?個(gè)同步
的操作,await 只能配合 async 只能,不然會(huì)報(bào)錯(cuò),await 后?可以是表達(dá)式,也可以是?個(gè) promise,在
await 下?的代碼必須得等待 await 執(zhí)?完之后才能在執(zhí)?
他們和 promise 的區(qū)別就是在寫法上更加的簡(jiǎn)潔.
以上就是我對(duì) async 和 await 的理解.

5.generator 函數(shù)

generator 函數(shù)也是 es6 的處理異步回調(diào)的一種寫法 但是這種寫法現(xiàn)在被 async 取代了
generator 函數(shù) 用*表示 跟 yield 搭配使用

6.說(shuō)?下 var 、let恨溜、const 之間的區(qū)別

  1. let var 是聲明變量的 const 是聲明常量的
  2. var 聲明的變量會(huì)聲明提升 但是 const 和 let 不會(huì) (聲明提升就是聲明的變量會(huì)把聲明語(yǔ)句提到作用域的頂端 但是賦值語(yǔ)句留在原地)
  3. var 在全局作?域下聲明變量會(huì)導(dǎo)致變量掛載在 window 上符衔,其他兩者不會(huì)
  4. let 和 const 聲明的是塊級(jí)作用域 var 聲明的是函數(shù)作用域

塊級(jí)作用域:只要是大括號(hào)就能區(qū)分作用域
函數(shù)作用域: 只有函數(shù)才能區(qū)分作用域

 <script>
        // console.log(num);
        var num = 10;

        // var 聲明的變量會(huì)把聲明語(yǔ)句提到作用域的頂端 但是賦值語(yǔ)句留在原地

        function fun1() {
            // console.log(str);
            var str = "aaa";
        }
        // console.log(str);

        // console.log(num2);
        let num2 = 20;

        // console.log(window.num);
        // console.log(window.num2);

        // 變量的作用域的概念就是 變量可以活動(dòng)的范圍 出了這個(gè)作用域 就沒(méi)有這個(gè)變量了
        //   var 變量的作用域是函數(shù)作用域 也就是說(shuō)只有函數(shù)的{}能區(qū)別var變量的作用域別的都不行
        //   let const 塊級(jí)作用域 只要看到{}就是一個(gè)作用域
        {
            let data = "大怨種";
            var data2 = "小怨種";
        }
        console.log(data2);
        console.log(data);
    </script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市糟袁,隨后出現(xiàn)的幾起案子判族,更是在濱河造成了極大的恐慌,老刑警劉巖项戴,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件形帮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡周叮,警方通過(guò)查閱死者的電腦和手機(jī)辩撑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仿耽,“玉大人合冀,你說(shuō)我怎么就攤上這事∶ブ伲” “怎么了水慨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)敬扛。 經(jīng)常有香客問(wèn)我晰洒,道長(zhǎng),這世上最難降的妖魔是什么啥箭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任谍珊,我火速辦了婚禮,結(jié)果婚禮上急侥,老公的妹妹穿的比我還像新娘砌滞。我一直安慰自己,他們只是感情好坏怪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布贝润。 她就那樣靜靜地躺著,像睡著了一般铝宵。 火紅的嫁衣襯著肌膚如雪打掘。 梳的紋絲不亂的頭發(fā)上华畏,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音尊蚁,去河邊找鬼亡笑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛横朋,可吹牛的內(nèi)容都是我干的仑乌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼琴锭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晰甚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起决帖,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤压汪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后古瓤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腺阳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年落君,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亭引。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绎速,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焙蚓,到底是詐尸還是另有隱情纹冤,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布购公,位于F島的核電站萌京,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宏浩。R本人自食惡果不足惜知残,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望比庄。 院中可真熱鬧求妹,春花似錦、人聲如沸佳窑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)神凑。三九已至净神,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背强挫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工岔霸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俯渤。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓呆细,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親八匠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子絮爷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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