1和new Number(1)有什麼區別

来源:https://www.cnblogs.com/tiffanybear/archive/2019/08/08/11320651.html
-Advertisement-
Play Games

1和new Number(1)有什麼區別 author: @Tiffanysbear 總結,兩者的區別就是原始類型和包裝對象的區別。 什麼是包裝對象 對象Number、String、Boolean分別對應數字、字元串、布爾值,可以通過這三個對象把原始類型的值變成(包裝成)對象: 我們來看下實際的v1 ...


1和new Number(1)有什麼區別

author: @Tiffanysbear

總結,兩者的區別就是原始類型和包裝對象的區別。

什麼是包裝對象

對象Number、String、Boolean分別對應數字、字元串、布爾值,可以通過這三個對象把原始類型的值變成(包裝成)對象:

var v1 = new Number(123);
var v2 = new String('abc');
var v3 = new Boolean(true);

我們來看下實際的v1、v2、v3是什麼呢?

typeof v1;// "object"
typeof v2;// "object"
typeof v3;// "object"

v1 === 123; // false
v1 == 123; // true

可以理解的是,v1此時是對象,===比較的是記憶體地址,因此跟數字Number 123不相等;可是為什麼v1 == 123得到的值會是true呢?

那這就是包裝對象在使用時的問題了。再來理解一下什麼是原始類型。

什麼是原始類型

比如123這類就是原始類型,原始類型並不是一個對象,因此並沒有對象具有的一些屬性和方法;但是為什麼能調用(123).toFixed()這些方法呢?

原因就是這些方法都是像包裝對象"借用"來的,toFixed方法是在Number對象原型上的方法。

(123).toFixed === Number.prototype.toFixed // true
"123".indexOf === String.prototype.indexOf // true

JS求值

JS在求值運算時,總是會求出原始資料的值,而不是用對象。如下麵的例子:

var a = new Number(122);
var b = a + 33; // 155
typeof b; // number

但是要註意 new Boolean 的用法,只有當 new Boolean 的參數值為 null 或者 undefined 時,求值轉換的原始資料的值才是false,其他情況都是true;

!!(new Boolean(false)) // true

所以儘量不要使用 new Boolean 這個包裝對象進行賦值,否則會產生一些誤會。

運算時調用 valueOf 和 toString 的優先順序

先說下結論:

1、進行對象轉換時(alert(e2)),優先調用 toString 方法,如沒有重寫 toString 將調用 valueOf 方法,如果兩方法都不沒有重寫,但按 Object 的 toString 輸出。

2、進行強轉字元串類型時將優先調用 toString 方法,強轉為數字時優先調用 valueOf。

3、在有運算操作符的情況下,valueOf的優先順序高於toString。

以下是三個例子

第一個:

let e2 = {
    n : 2,
    toString : function (){
        console.log('this is toString')
        return this.n
    },
    valueOf : function(){
        console.log('this is valueOf')
        return this.n*2
    }
}
alert(e2) //  2  this is toString
alert(+e2)  // 4 this is valueOf
alert(''+e2) // 4 this is valueOf
alert(String(e2)) // 2 this is toString
alert(Number(e2)) // 4 this is valueOf
alert(e2 == '4') // true  this is valueOf
alert(e2 === 4) //false ===操作符不進行隱式轉換

第二個:

let e3 = {
    n : 2,
    toString : function (){
        console.log('this is toString')
        return this.n
    }
}
alert(e3) //  2  this is toString
alert(+e3)  // 2 this is toString
alert(''+e3) // 2 this is toString
alert(String(e3)) // 2 this is toString
alert(Number(e3)) // 2 this is toString
alert(e3 == '2') // true  this is toString
alert(e3 === 2) //false  ===操作符不進行隱式轉換

第三個:

Object.prototype.toString = null; 
let e4 = {
    n : 2,
    valueOf : function(){
        console.log('this is valueOf')
        return this.n*2
    }
}
alert(e4) //  4 this is valueOf
alert(+e4)  // 4 this is valueOf
alert(''+e4) // 4 this is valueOf
alert(String(e4)) // 4 this is valueOf
alert(Number(e4)) // 4 this is valueOf
alert(e4 == '4') // true  this is valueOf
alert(e4 === 4) //false  ===操作符不進行隱式轉換

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

-Advertisement-
Play Games
更多相關文章
  • swiper一款非常好用的輪播插件,支持移動端和PC端,用過很多次了,這次簡單的總結一下。方便以後查找使用,說明一下,下麵的例子是基於swiper 4.0+版本的,如果你是其他的版本,請自行前往官網查看 至於為什麼使用swiper,而不是自己手寫,請看下麵官網的截圖: 開個玩笑,說白了,就是這個確實 ...
  • /** * 對於由簡單類型數據組成的對象為元素組成的數組進行去重操作 * @params {Array} 需要去重的對象數組 * @returns {Array} 去重後的對象數組 */ function distinct(sourceArray) { var resultArray = []; v ...
  • 上一篇講了字元串的解析過程,這一篇來講講標識符(IDENTIFIER)的解析。 先上知識點,標識符的掃描分為快解析和慢解析,一旦出現Ascii編碼大於127的字元或者轉義字元,會進入慢解析,略微影響性能,所以最好不要用中文、特殊字元來做變數名(不過現在代碼壓縮後基本不會有這種情況了)。 每一位Jav ...
  • HTML特殊轉義字元列表 最常用的字元實體Character Entities 顯示說明實體名稱實體編號 半方大的空白 &ensp; &#8194; 全方大的空白 &emsp; &#8195; 不斷行的空白格 &nbsp; &#160; < 小於 &lt; &#60; > 大於 &gt; &#62; ...
  • 什麼是組件? 組件的出現,就是為了拆分Vue實例的代碼量的,能夠讓我們以不同的組件,來劃分不同的功能模塊,將來我們需要什麼樣的功能,就可以去調用對應的組件就可以了。 組件化和模塊化的區別 模塊化:是從代碼邏輯的角度進行劃分的,方便代碼分層開發,保證每個模塊功能的職能單一。例如:NodeJS 組件化: ...
  • window.onload=function(){ var a = $("#div").width(),//width()返回元素的寬高,不包括padding/border/margin b = $("#div").innerWidth(),//innerWidth()返回元素的寬高 + paddi ...
  • ajax是非同步請求技術,可以實現頁面的局部刷新。但是今天寫代碼的時候發現每次ajax之後都會發生整個頁面的刷新,最後發現這是因為觸發ajax事件的input標簽的type設置為了submit,所以會產生表單提交操作,使頁面刷新。 將type設置為button後即可正常運行。 ...
  • 這兩天在學習圖片的懶載入實現,看了很多大佬的博客,終於有了點成果。現在用了其中一位大佬的文章中的代碼實現了圖片懶載入並且在其基礎上加入了節流函數。 原理就不多講了,有需要的可以去大佬的文章看看。大佬文章可以從這裡進->(https://www.jianshu.com/p/9b30b03f56c2)。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...