JavaScript >> Javascript 文檔 >  >> JavaScript

我的 JavaScript 測驗 - 答案

本週早些時候,我發布了我的 JavaScript 測驗,其中包含一些基本代碼和問題。以下是答案。

示例#1

var num1 = 5,
    num2 = 10,
    result = num1+++num2;

理解這個例子的關鍵是理解運算符優先級。顯然,+++ 不是一個有效的運算符,因此 JavaScript 引擎將其分解為一個後綴自增運算符和加號。這段代碼完全有效,解析沒有問題,但真的可以這樣寫:

var num1 = 5,
    num2 = 10,
    result = num1++ + num2;

理解了這就是代碼的解釋方式,問題應該是相當簡單的。

  • **result的值是多少 ? **該值為 15,因為後綴增量在 num1+++num2 之後起作用 語句已執行。
  • num1的值是多少 ? 該值為 6,因為它在最後一條語句之後遞增。
  • num2的值是多少 ? 該值為 10,因為在 num2 上沒有進行任何操作 本身。

示例 #2

var x = 5,
    o = {
        x: 10,
        doIt: function doIt(){
            var x = 20;
            setTimeout(function(){
                alert(this.x);
            }, 10);
        }
    };
o.doIt();

這個例子的關鍵是理解 JavaScript 作用域。閉包內部的警告引用了 this.x,但是因為這個引用被包裝在對象內部的幾個函數中,所以正確的作用域是什麼?答案很簡單。傳入setTimeout()的所有函數 在全局範圍內執行。

  • **警報中顯示什麼值? **值為 5 因為 this.xwindow.x 相同 和 var x = 5 相當於 window.x = 5 .

示例#3

var num1 = "10",
    num2 = "9";

代碼非常不言自明,只定義了兩個字符串變量。

  • num1 < num2的值是多少 ? 當兩個操作數都是字符串時,比較運算符通過比較相同位置的字符來執行字符串比較。字符串“10”出現在字符串“9”之前,因為在 ASCII 中字符“1”出現在字符“9”之前。由於在那之後沒有更多的字符可以比較,所以這個比較是剩下的比較。因此,num1 < num2 的值 是 true .
  • +num1 < num2的值是多少 ? 這裡的加號運算符將 num1 成一個數字,所以現在你將一個數字與一個字符串進行比較。發生這種情況時,字符串運算符將轉換為數字,然後開始比較。所以最終這相當於 10 <9,很明顯是 false .
  • num1 + num2的值是多少 ? 兩個操作數都是字符串,這意味著會發生字符串連接。結果是 "109" .
  • +num1 + num2的值是多少 ? 如前所述,加號運算符將字符串轉換為數字,因此 num1 變為數字 10。但是,當加號運算符與數字和字符串一起使用時,數字將轉換為字符串,然後執行字符串連接。所以這個結果和你做 num1 + num2 的結果是一樣的 因為值為 "109" .

示例#4

var message = "Hello world!";

只是一個簡單的字符串變量,這裡沒什麼特別的。

  • message.substring(1, 4)的值是多少 ? 第一個參數是你想要的第一個字符的索引,第二個參數是 after 字符的索引 你想要的最後一個。在這種情況下,您需要從第二個字符(索引 1)到第四個字符(索引 3)。所以結果是“ell”。
  • message.substr(1,4)的值是多少 ? 第一個參數是您想要的第一個字符的索引,第二個參數是要檢索的字符數。在這種情況下,您需要第二個字符(索引 1),然後再添加三個字符,因此結果是“ello”。

示例#5

var o = {
        x: 8,

        valueOf: function(){
            return this.x + 2;
        },
        toString: function(){
            return this.x.toString();
        }
    },
    result = o < "9";

alert(o);

這可能是最難的代碼示例,因為您需要了解 valueOf()toString() 工作。所有對像都有這兩種方法,因為它們是在 Object.prototype 上定義的 並通過原型鏈繼承(挑剔者會注意到可能有不繼承自 Object 的對象 ,但我試圖保持簡單)。這兩種方法一直被稱為幕後。 valueOf() 每當完成比較並且 toString() 時都會調用方法 每當需要自動轉換為字符串時調用。通過重寫這些方法,您可以控制它們在各種情況下返回的值。

  • 值是多少result ? valueOf() 方法在這裡被稱為幕後,所以真正的比較是 10 <“9”。如前所述,數字和字符串之間的比較導致字符串轉換為數字,因此比較結果為 10 <9,即 false .
  • 警報中顯示的值是多少? 傳入 alert() 的值 被轉換為字符串,這意味著 toString() 被調用。因此,警報顯示 "8" .

就是這樣!

我希望你喜歡這個 JavaScript 小測驗,並希望學到一兩件事。

更新(2010 年 2 月 18 日): 修復了答案 #1 中的錯字。


Tutorial JavaScript 教程
  1. 在 vanilla JavaScript 中使用 Intersection Observer 輕鬆實現無限滾動

  2. 如何使用 jQuery 刪除禁用的屬性?

  3. 我如何在 Angular 應用程序中動態更新標題和元標記

  4. 為什麼使用 GraphQL?

  5. Chrome 擴展清單 v3 內容安全政策

  6. Node.js 中的 MongoDB 事務使用 Mongoose

  7. 使用 Expo 發送推送通知的極簡方法

  1. JS中根據動態對象和值過濾數組

  2. 如何在 React 中實現拖放

  3. 介紹 Favico 生成器

  4. Javascript——比較兩個數組,返回差異,但是

  5. Ballerina 編程語言中的 Redux 🎉🎉🎉

  6. 在 TypeScript 中聲明全局變量

  7. React 中的生命週期

  1. 公共解決:生成安全密碼

  2. Typescript 項目中提交的標準化

  3. 避免被傀儡師擋住

  4. QuasarConf 2022 - 演講者和日程安排