1. <tt id="uxhbr"></tt>
      2. 當(dāng)前位置:聯(lián)升科技 > 技術(shù)資訊 > 開發(fā)技術(shù) >

        7 個(gè)常見的 JavaScript 測(cè)驗(yàn)及解答

        2019-11-02    作者:admin    來源:未知    閱讀: 次
        我相信學(xué)習(xí)新事物并評(píng)估我們所知的東西對(duì)自己的進(jìn)步非常有用,可以避免了我們覺得自己的知識(shí)過時(shí)的情況。在本文中,我將介紹一些常見的 JavaScript 知識(shí)。請(qǐng)享用!
        1.聲明
        查看以下代碼,并回答輸出的內(nèi)容(以及原因)。
         
        // situation 1 
        console.log(person); 
        var person = 'John'; 
         
        // situation 2 
        console.log(person); 
        let person = 'Phill'; 
         
        // situation 3 
        console.log(person); 
        const person = 'Frank'; 
         
        // situation 4 
        const person = 'Vanessa'; 
        console.log(person); 
        person = 'Mike'; 
        console.log(person); 
         
        // situation 5 
        var person = 'John'; 
        let person = 'Mike'; 
        console.log(person); 
         
        // situation 6 
        var person = 'John'; 
        if (person) { 
          let person = 'Mike'; 
          console.log(person); 
        console.log(person); 
        說明
         
        Situation 1: 預(yù)期結(jié)果是在控制臺(tái)中看到文本 John,但是令人驚訝的是,我們看到記錄了undefined。想知道為什么嗎?
         
        好吧,這是經(jīng)典的 JavaScript 在起作用。這種行為被稱為提升。在后臺(tái),該語言將變量聲明和值分配分為兩部分。不管變量最初由開發(fā)人員在哪里聲明,變量都將移動(dòng)到頂部,聲明時(shí)將其值設(shè)置為 undefined。看起來像這樣:
         
        var person; 
        console.log(person); 
        person = 'John'; 
        Situation 2: 在這里,結(jié)果將是引用錯(cuò)誤。
         
        Uncaught ReferenceError: Cannot access 'person' before initialization 
        錯(cuò)誤文本說明了一切。因?yàn)槲覀兪褂昧岁P(guān)鍵字 let,所以我們的變量被提升,但沒有初始化,并且拋出該錯(cuò)誤,通知我們正在嘗試訪問未初始化的變量。在 ES6 中引入了關(guān)鍵字 let,使我們能夠使用塊作用域中的變量,從而幫助我們防止意外行為。
         
        在這里,我們會(huì)得到與 Situation 2 中相同的錯(cuò)誤。
         
        不同之處在于我們使用了關(guān)鍵字 const,從而防止在初始化后重新分配變量。 ES6 中也引入了此關(guān)鍵字。
         
        Situation 4: 在這種情況下,我們可以看到關(guān)鍵字 const 是如何工作的,以及它如何避免無意中重新分配變量。在我們的示例中,首先會(huì)在控制臺(tái)中看到 Vanessa,然后是一個(gè)類型錯(cuò)誤。
         
        Uncaught TypeError: Assignment to constant variable 
        const 變量的使用隨著我們的代碼庫(kù)呈指數(shù)增長(zhǎng)。
         
        Situation 5: 如果已經(jīng)在某個(gè)作用域內(nèi)使用關(guān)鍵字 var 定義了變量,則在同一作用域中用關(guān)鍵字 let 再次聲明該變量將會(huì)引發(fā)錯(cuò)誤。
         
        因此,在我們的示例中,將不會(huì)輸出任何內(nèi)容,并且會(huì)看到語法錯(cuò)誤提示。
         
        Uncaught SyntaxError: Identifier 'person' has already been declared 
        Situation 6: 我們分別有一個(gè)函數(shù)作用域的變量,和塊作用域的變量。在這種情況下,它們是否有相同的名字或標(biāo)識(shí)符并不重要。
         
        在控制臺(tái)中,我們應(yīng)該看到 Mike 和 John 被依次輸出。為什么?
         
        因?yàn)殛P(guān)鍵字 let 為我們提供了塊作用域內(nèi)的變量,這意味著它們僅存在于自己創(chuàng)建的作用域內(nèi),在這種情況下,位于if...else 語句中。內(nèi)部變量?jī)?yōu)先于外部變量,這就是為什么我們可以使用相同標(biāo)識(shí)符的原因。
         
        2.繼承
        考慮以下類,并嘗試回答輸出了什么以及為什么。
         
        class Person { 
          constructor() { 
            this.sayHello = () => { 
              return 'Hello'; 
            } 
          } 
         
          sayBye() { 
            return 'Bye'; 
          } 
         
        class Student extends Person { 
          sayHello() { 
            return 'Hello from Student'; 
          } 
         
        const student = new Student(); 
        console.log(student.sayHello()); 
        說明
         
        如果你的答案是 Hello,那是對(duì)的!
         
        為什么:每次我們創(chuàng)建一個(gè)新的 Student 實(shí)例時(shí),都會(huì)將 sayHello 屬性設(shè)置為是一個(gè)函數(shù),并返回字符串 Hello。這是在父類(Person)類的構(gòu)造函數(shù)中發(fā)生的。
         
        在 JavaScript 中,類是語法糖,在我們的例子中,在原型鏈上定義了 Student 類中的 sayHello 方法??紤]到每次我們創(chuàng)建 Student 類的實(shí)例時(shí),都會(huì)將 sayHello 屬性設(shè)置為該實(shí)例,使其成為返回字符串 Hello 的 function,因此我們永遠(yuǎn)不會(huì)使用原型鏈上定義的函數(shù),也就永遠(yuǎn)不會(huì)看到消息 Hello from Student 。
         
        3.對(duì)象可變性
        思考以下情況中每個(gè)部分的輸出:
         
        // situation 1 
        const user = { 
          name: 'John', 
          surname: 'Doe' 
         
        user = { 
          name: 'Mike' 
         
        console.log(user); 
         
        // situation 2 
        const user = { 
          name: 'John', 
          surname: 'Doe' 
         
        user.name = 'Mike'; 
        console.log(user.name); 
         
        // situation 3 
        const user = { 
          name: 'John', 
          surname: 'Doe' 
         
        const anotherUser = user; 
        anotherUser.name = 'Mike'; 
        console.log(user.name); 
         
        // situation 4 
        const user = { 
          name: 'John', 
          surname: 'Doe', 
          address: { 
            street: 'My Street' 
          } 
         
        Object.freeze(user); 
         
        user.name = 'Mike'; 
        user.address.street = 'My Different Street'; 
        console.log(user.name); 
        console.log(user.address.street); 
        說明
         
        Situation 1: 正如我們?cè)谏弦还?jié)中所了解的,我們?cè)噲D重新分配不允許使用的 const 變量,所以將會(huì)得到類型錯(cuò)誤。
         
        控制臺(tái)中的結(jié)果將顯示以下文本:
         
        Uncaught TypeError: Assignment to constant variable 
        Situation 2: 在這種情況下,即使我們改用關(guān)鍵字 const 聲明的變量,也會(huì)有不同的行為。不同之處在于我們正在修改對(duì)象屬性而不是其引用,這在 const 對(duì)象變量中是允許的。
         
        控制臺(tái)中的結(jié)果應(yīng)為單詞 Mike。
         
        Situation 3: 通過將 user 分配給 anotherUser 變量,可以在它們之間共享引用或存儲(chǔ)位置(如果你愿意)。換句話說,它們兩個(gè)都會(huì)指向內(nèi)存中的同一個(gè)對(duì)象,因所以更改一個(gè)對(duì)象的屬性將反映另一個(gè)對(duì)象的更改。
         
        控制臺(tái)中的結(jié)果應(yīng)為 Mike。
         
        Situation 4: 在這里,我們使用 Object.freeze 方法來提供先前場(chǎng)景(Situation 3)所缺乏的功能。通過這個(gè)方法,我們可以“凍結(jié)”對(duì)象,從而不允許修改它的屬性值。但是有一個(gè)問題!它只會(huì)進(jìn)行淺凍結(jié),這意味著它不會(huì)保護(hù)深層屬性的更新。這就是為什么我們能夠?qū)?street 屬性進(jìn)行更改,而 name 屬性保持不變的原因。
         
        控制臺(tái)中的輸出依次為 John 和 My Different Street 。
         
        4.箭頭函數(shù)
        運(yùn)行以下代碼段后,將會(huì)輸出什么以及原因:
         
        const student = { 
          school: 'My School', 
          fullName: 'John Doe', 
          printName: () => { 
            console.log(this.fullName); 
          }, 
          printSchool: function () { 
            console.log(this.school); 
          } 
        }; 
         
        student.printName(); 
        student.printSchool(); 
        說明
         
        控制臺(tái)中的輸出將依次為 undefined 和 My School。
         
        你可能會(huì)熟悉以下語法:
         
        var me = this; 
        // or 
        var self = this; 
         
        // ... 
        // ... 
        // somewhere deep... 
        // me.doSomething(); 
        你可以把 me 或 self 變量視為父作用域,該作用域可用于在其中創(chuàng)建的每個(gè)嵌套函數(shù)。
         
        當(dāng)使用箭頭函數(shù)時(shí),這會(huì)自動(dòng)完成,我們不再需要存儲(chǔ) this 引用來訪問代碼中更深的地方。箭頭函數(shù)不綁定自己,而是從父作用域繼承一個(gè)箭頭函數(shù),這就是為什么在調(diào)用 printName 函數(shù)后輸出了 undefined 的原因。
         
        5.解構(gòu)
        請(qǐng)查看下面的銷毀信息,并回答將要輸出的內(nèi)容。給定的語法是否允許,否則會(huì)引發(fā)錯(cuò)誤?
         
        const rawUser = { 
           name: 'John', 
           surname: 'Doe', 
           email: 'john@doe.com', 
           displayName: 'SuperCoolJohn', 
           joined: '2016-05-05', 
           image: 'path-to-the-image', 
           followers: 45 
         
        let user = {}, userDetails = {}; 
        ({ name: user.name, surname: user.surname, ...userDetails } = rawUser); 
         
        console.log(user); 
        console.log(userDetails);  
        說明
         
        盡管有點(diǎn)開箱即用,但是上面的語法是允許的,并且不會(huì)引發(fā)錯(cuò)誤! 很整潔吧?
         
        上面的語法功能強(qiáng)大,使我們能夠輕松地將任何對(duì)象分成兩個(gè)更具體的對(duì)象,上面的示例在控制臺(tái)的輸出為:
         
        // {name: "John", surname: "Doe"} 
        // {email: "john@doe.com", displayName: "SuperCoolJohn", joined: "2016-05-05", image: "path-to-the-image", followers: 45} 
        6.異步/等待
        調(diào)用以下函數(shù)后將輸出什么?
         
        (async () => { 
          let result = 'Some Data'; 
         
          let promise = new Promise((resolve, reject) => { 
            setTimeout(() => resolve('Some data retrieved from the server'), 2000); 
          }); 
         
          result = await promise; 
          console.log(result); 
        })(); 
        說明
         
        如果你認(rèn)為是兩秒鐘后輸出 Some data retrieved from the server ,那么你是對(duì)的!
         
        代碼將會(huì)暫停,直到 promise 得到解決。兩秒鐘后,它將繼續(xù)執(zhí)行并輸出給定的文本。這意味著 JavaScript 引擎實(shí)際上會(huì)等到異步操作完成??梢哉f async/await 是用來獲得 promise 結(jié)果的語法糖。也有人認(rèn)為它是比 promise.then 更具可讀性的方式。
         
        7. Return 語句
        const multiplyByTwo = (x) => { 
            return 
            { 
                result: x * 2 
            }; 
        console.log(multiplyByTwo(2));   
        說明
         
        如果你的答案是 {result: 4},那你就錯(cuò)了。輸出是 undefined。但是不要對(duì)自己太苛刻,考慮到我也寫 C# 代碼,這也曾經(jīng)困擾著我,這在 C# 那兒不是個(gè)問題。
         
        由于自動(dòng)分號(hào)插入的原因,上面的代碼將返回 undefined。 return 關(guān)鍵字和表達(dá)式之間不允許使用行結(jié)束符
         
        解決方案是用以下列方式之一去修復(fù)這個(gè)函數(shù):
         
        const multiplyByTwo = (x) => { 
            return { 
                result: x * 2 
            }; 
        要么
         
        const multiplyByTwo = (x) => { 
          return ( 
            { 
              result: x * 2 
            } 
          ); 


        相關(guān)文章

        我們很樂意傾聽您的聲音!
        即刻與我們?nèi)〉寐?lián)絡(luò)
        成為日后肩并肩合作的伙伴。

        行業(yè)資訊

        聯(lián)系我們

        13387904606

        地址:新余市仙女湖區(qū)仙女湖大道萬商紅A2棟

        手機(jī):13755589003
        QQ:122322500
        微信號(hào):13755589003

        江西新余網(wǎng)站設(shè)計(jì)_小程序制作_OA系統(tǒng)開發(fā)_企業(yè)ERP管理系統(tǒng)_app開發(fā)-新余聯(lián)升網(wǎng)絡(luò)科技有限公司 贛ICP備19013599號(hào)-1   贛公網(wǎng)安備 36050202000267號(hào)   

        微信二維碼
        久久人爽人人爽人人片AV|国产欧美精品久久久久久TⅤ|国产日韩精品欧美一区喷|国产免费一区二区在线看|91精品国产91无码网站|国产福利永久在线视频无毒不卡|午夜性刺激在线视频免费看

          1. <tt id="uxhbr"></tt>