(a == 1 && a == 2 && a == 3),何時為true?

来源:https://www.cnblogs.com/yinn/archive/2018/01/22/7495448.html
-Advertisement-
Play Games

今天瀏覽一些技術網站,看到這個題目。雖然覺著代碼這麼寫的可能性低之又低,但是卻也考驗對js瞭解的程度。 在 JavaScript 中 (a ==1 && a== 2 && a==3) 可能為 true 嗎?解釋說nothing is impossible! 這裡是兩個可能的答案: 運行代碼 運行代碼 ...



今天瀏覽一些技術網站,看到這個題目。雖然覺著代碼這麼寫的可能性低之又低,但是卻也考驗對js瞭解的程度。

在 JavaScript 中 (a ==1 && a== 2 && a==3) 可能為 true 嗎?解釋說nothing is impossible!

這裡是兩個可能的答案:

<script>
    const a = {
        i: 1,
        toString: function () {
           return a.i++;
        }
    }

    if(a == 1 && a == 2 && a == 3) {
        console.log('Hello World!');
    }
</script>

<script>
    const a = {
        i: 1,
        valueOf: function () {
           return a.i++;
        }
    }

    if(a == 1 && a == 2 && a == 3) {
        console.log('Hello JavaScript!');
    }
</script>

最根本的還是強制類型轉換。類型==,===運算符和強制轉換:

先看個表達式:

<script>
    var res = "1.0e0" == { valueOf: function() { return true; } };
   console.log(res);
</script>

是的,這個結果也是 true。

對於這個表達式我們能夠註意到:

它們的類型是不一樣的。原因是在運算的時候進行了強制轉換。在比較之前,它們被轉換成了數字。

字元串”1.0e0“被解析成數字1,而匿名對象通過調用自身的valueOf方法得到true,然後再轉換成數字1。

這也是a可以同時為1,2,3的原因。

我們需要知道的是:

1、如果表達式兩邊的數據類型不一致,==運算符兩邊會進行強制轉換;

2、此對象在被強制轉換時,會自動優先調用了自身的valueOf方法

3、如果此對象沒有valueOf方法,則會繼續嘗試調用toString方法

4、如果將==運算符改成===運算符,則不會強制轉換;

5、如果表達式兩邊數據類型一致,==運算符和===運算符返回的結果是一致的

下圖為==運算符針對不同類型參數的強制轉換規則:

規則看著挺複雜,不幸的是,它其實也是這麼複雜。所以在比較操作中,如果不同類型進行比較,不建議使用==運算符,而是使用嚴格相等===運算符,因為使用嚴格相等運算符讀者會非常清晰地知道:在比較中沒有涉及任何強制轉換。否則,你需要讀者準確的記住這些強制轉換規則以解讀代碼的行為。

另外一個增加代碼可讀性的方法就是顯示的進行數據類型轉換:

代碼1:

var today = new Date();

if(form.month.value == (today.getMonth() + 1) &&
   form.day.value == today.getDate()){
         //happy birthday...           
}

代碼2:

var today = new Date();

if(+form.month.value == (today.getMonth() + 1) &&
   +form.day.value == today.getDate()){
         //happy birthday...           
}

很顯然,代碼2更加清晰地向讀者傳達了代碼在做什麼樣的轉換,它只是顯式的使用Number函數或者一元運算符 + 將值轉換為數字,而不要求讀者記住這些轉換規則。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基本選擇器 html 代碼如下,後面的 js 使用的 html 基本大同小異。 js 代碼如下: 根據層級查找元素 js 代碼如下: 通過屬性來選擇元素 過濾器 表單過濾器及自定義過濾器 ...
  • CSS3時鐘 css 始終效果演示 ... ...
  • 安靜的敲著鍵盤,已勢不可擋的姿勢逼近php,我想我是一個幸福的人,未來不可期,做好現在,偶爾寫著自己能看懂的API,慢慢悠悠的回味一下前端基礎知識。 本文盒模型理解。 ...
  • 一.什麼是組件? 組件 (Component) 是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以表現為用 is 特性進行了擴展的原生 HTML 元素。 所有的 Vue ...
  • 在webpack.base.conf文件中配置別名以及擴展名 ...
  • 最近心血來潮想製作一個數獨游戲,說乾咱就乾。剛剛好前一階段學習了es6,可以用這個項目來當做一個小練習。 目前開發已經完成,由於只是基本功能,頁面樣式並不是很華麗,下麵我們先開看看長什麼樣子。 大概頁面就長這個樣子,頁面有三個按鈕,分別是檢查,重玩,換題。 下麵是游戲中截圖。 ; ; 最後這個圖我比 ...
  • <!doctype html><html><head><meta charset="utf-8"><title>無標題文檔</title></head><style>#div1{position:relative;}#div1 div{width:50px;height:50px;backgroun ...
  • 1.問題描述: 本地vue-cli啟動了一個項目只能通過localhost:8080訪問到,同一區域網下其他的手機和電腦並不能通過ip地址訪問調試, 2.原因:vue-cli項目是通過命令行一鍵生成的,配置文件中預設生成的是本地調試模式,預設訪問地址是localhost:埠號 3.改正的方式 找到 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...