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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...