js中的一些隱式轉換和總結

来源:http://www.cnblogs.com/ljk001/archive/2017/12/22/8086084.html
-Advertisement-
Play Games

js中的不同的數據類型之間的比較轉換規則如下: 1. 對象和布爾值比較 對象和布爾值進行比較時,對象先轉換為字元串,然後再轉換為數字,布爾值直接轉換為數字 2. 對象和字元串比較 對象和字元串進行比較時,對象轉換為字元串,然後兩者進行比較。 3. 對象和數字比較 對象和數字進行比較時,對象先轉換為字 ...


js中的不同的數據類型之間的比較轉換規則如下:

1. 對象和布爾值比較

對象和布爾值進行比較時,對象先轉換為字元串,然後再轉換為數字,布爾值直接轉換為數字

[] == true;  //false  []轉換為字元串'',然後轉換為數字0,true轉換為數字1,所以為false

2. 對象和字元串比較

對象和字元串進行比較時,對象轉換為字元串,然後兩者進行比較。

[1,2,3] == '1,2,3' // true  [1,2,3]轉化為'1,2,3',然後和'1,2,3', so結果為true;

3. 對象和數字比較

對象和數字進行比較時,對象先轉換為字元串,然後轉換為數字,再和數字進行比較。

[1] == 1;  // true  `對象先轉換為字元串再轉換為數字,二者再比較 [1] => '1' => 1 所以結果為true

4. 字元串和數字比較

字元串和數字進行比較時,字元串轉換成數字,二者再比較。

'1' == 1 // true

5. 字元串和布爾值比較

字元串和布爾值進行比較時,二者全部轉換成數值再比較。

'1' == true; // true 

6. 布爾值和數字比較

布爾值和數字進行比較時,布爾轉換為數字,二者比較。

true == 1 // true

許多剛接觸js的童鞋看到這麼多的轉換規則就懵圈了,其實規律很簡單,大家可以記下邊這個圖
數據轉換

如圖,任意兩種類型比較時,如果不是同一個類型比較的話,則按如圖方式進行相應類型轉換,如對象和布爾比較的話,對象 => 字元串 => 數值 布爾值 => 數值。
另外,我們來看下一些需要"特別照顧"的。

來看一個有趣的題

[] == false;
![] == false;

這兩個的結果都是true,第一個是,對象 => 字元串 => 數值0 false轉換為數字0,這個是true應該沒問題,
第二個前邊多了個!,則直接轉換為布爾值再取反,轉換為布爾值時,空字元串(''),NaN,0,null,undefined這幾個外返回的都是true, 所以! []這個[] => true 取反為false,所以[] == false為true。

還有一些需要記住的,像:

undefined == null //true undefined和null 比較返回true,二者和其他值比較返回false
Number(null) //0

曾經看到過這樣一個代碼:  (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] = sb , 你敢相信, 當時就嚇了 寶寶一跳。

剛接觸到時候,Js很讓我困惑,正是由於它‘善變’,下麵我來總結一下:

7. JS的數據類型: Number,Boolean,String,Undefined,Null,Symbol(es6新定義的)和 Object (註: Array是特殊的Object)

    typeof 返回的7中類型: number boolean string object undefined object function

    

 

MDN 這樣介紹Javascript: JavaScript 是一種弱類型或者說動態語言。這意味著你不用提前聲明變數的類型,在程式運行過程中,類型會被自動確定。這也意味著你可以使用同一個變數保存不同類型的數據

8. 下麵來看下常見的隱式轉換:

  基本類型:

   運算符(+,-,*,/,%)操作時 轉換類型

    ”+“ 號運算符 : 

           

        

          

      總結: 當加號運算符時,String和其他類型時,其他類型都會轉為 String;其他情況,都轉化為Number類型 , 註: undefined 轉化為Number是 為’NaN‘, 任何Number與NaN相加都為NaN。

          其他運算符時, 基本類型都轉換為 Number,String類型的帶有字元的比如: '1a' ,'a1' 轉化為 NaN 與undefined 一樣。

        

      tip:(1)NaN 不與 任何值相等 包括自身,所以判斷一個值 是否為 NaN, 即用 "!==" 即可。  

         (2) 轉換為 Boolean類型為 false 的有:null,0,'',undefined,NaN,false  

          

        (3)number() 與 parseInt() 都可以將對象轉化為Number類型,Number函數要比parseInt函數嚴格很多。基本上,只要有一個字元無法轉成數值,整個字元串就會被轉為NaN。

           

  Object類型

    當object與基本類型運算時:

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var obj = {     toString: function(){         return 6;     },     valueOf: function(){         return 5;     } };   var obj1 = {     valueOf: function(){         return 'a';     },     toString: function(){         return 'b';     } };

 

                      

 

                  

 

      

 

      當對 obj,obj1 用Number()和String()換轉時

              

      總結: Number類型會先調用valueOf(), String類型會先調用toString(),  如果結果是原始值,則返回原始值,否則繼續用toString 或 valueOf(),繼續計算,如果結果還不是原始值,則拋出一個類型錯誤; 

    看如下情況: 

            

        為什麼 {} + [] = 0 ?  因為 javascript在運行時, 將 第一次{} 認為是空的代碼塊,所以就相當於 +[] = 0.  還有 {} +5 = 5, 同理。

 

  

總結:

 

1. 類型錯誤有可能會被類型轉換所隱藏。

 

2. “+”既可以表示字元串連接,又可以表示算術加,這取決於它的操作數,如果有一個為字元串的,那麼,就是字元串連接了。

 

3. 對象通過valueOf方法,把自己轉換成數字,通過toString方法,把自己轉換成字元串。

 

4.具有valueOf方法的對象,應該定義一個相應的toString方法,用來返回相等的數字的字元串形式。

 

5.檢測一些未定義的變數時,應該使用typeOf或者與undefined作比較,而不應該直接用真值運算。

 

關於JavaScript隱式類型轉換就給大家介紹到這裡,希望對大家有所幫助!

 

本文藉鑒自
https://www.cnblogs.com/chenmeng0818/p/5954215.html
https://www.cnblogs.com/ihboy/p/6700059.html

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

-Advertisement-
Play Games
更多相關文章
  • 一.service的用途 1.1 一種是執行長時間運行的耗時操做 1.如網路下載、音樂播放2.文件系統監控等 1.2 另一種是負責組件間的交互 1.將某些功能以Service組件形式封裝,然後提供給其他組件調用 二.Service的生命周期 Service不能自己啟動,必須由其他應用組件來調用根據調 ...
  • 1. 移動頁面開發基礎 1.1 像素——什麼是像素 像素是 Web 頁面佈局的基礎,那麼到底什麼才是一個像素呢? 像素:一個像素就是電腦屏幕所能顯示一種特定顏色的最小區域。這是像素的概念,實際上,Web 前端開發領域,像素有以下兩層含義: (1) 設備像素:設備屏幕的物理像素,對於任何設備來講物理 ...
  • 通過多次爬坑,發現了這些監聽滾動來載入更多的組件的共同點, 因為這些載入更多的方法是綁定在需要載入更多的內容的元素上的, 所以是進入頁面則直接觸發一次,當監聽到滾動事件之後,繼續載入更多, 所以對於無限滾動載入不需要寫首次載入列表的函數, 代碼如下: html: vue.js data: metho ...
  • WebSocket解析 轉載請註明出處: "WebSocket解析" 現在,很多網站為了實現推送技術,所用的技術都是輪詢。輪詢是指在特定的時間間隔(如每一秒),由瀏覽器對伺服器發起HTTP請求,然後由伺服器返回數據給瀏覽器 。由於HTTP協議是惰性的,只有客戶端發起請求,伺服器才會返回數據。輪詢技術 ...
  • 1、static(靜態定位):預設值。沒有定位,元素出現在正常的流中(忽略 top, bottom, left, right 或者 z-index 聲明)。 2、relative(相對定位):生成相對定位的元素,通過top,bottom,left,right的設置相對於其正常(原先本身)位置進行定位 ...
  • 1.首先要註冊高德地圖,完後成為開發者 2.控制台里獲取自己的key值 3.在要顯示地圖的頁面添加如下的代碼 <script type="text/javascript" src="https://cache.amap.com/lbs/static/addToolbar.js"></script>< ...
  • 轉自腳本之家: 這篇文章主要介紹了JS去掉字元串前後空格或去掉所有空格的用法,需要的朋友可以參考下: 代碼如下: 說明: 如果使用jQuery直接使用$.trim(str)方法即可,str表示要去掉前後所有空格的字元串。 2、 去掉字元串中所有空格(包括中間空格,需要設置第2個參數為:g) 3、現在 ...
  • 其實很簡單,就是title這個屬性:(字元多餘的剪切,title顯示完整的字元) 下麵是代碼: 以下是起因: 任務:頁面上顯示個備註.某某某. 某某某:知道了(不就是怎麼用textarea 填上去的怎麼顯示。我還要textarea就行) 過了一天.... 出現了一個問題:這個textarea文本域怎 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...