《You dont know JS》強制類型轉換

来源:https://www.cnblogs.com/enjoymylift/archive/2018/01/31/8392302.html
-Advertisement-
Play Games

強制類型轉換 將值從一種類型轉換為另一種類型通常稱為類型轉換,這是顯式的情況。隱式的情況被稱為強制類型轉換 在書中,作者還提出一種區分方式: 類型轉換髮生在靜態類型語言的編譯階段,強制類型轉換髮生在動態類型語言的運行時。 JS天生的動態類型語言,所以JS中統一講強制類型轉換。 一、JS中的強制類型轉 ...


強制類型轉換

將值從一種類型轉換為另一種類型通常稱為類型轉換,這是顯式的情況。隱式的情況被稱為強制類型轉換

在書中,作者還提出一種區分方式:

類型轉換髮生在靜態類型語言的編譯階段,強制類型轉換髮生在動態類型語言的運行時。

JS天生的動態類型語言,所以JS中統一講強制類型轉換。


一、JS中的強制類型轉換

首先看如下所示代碼:

var a = 42;
var b = a + ''; // 隱式強制類型轉換
var c = String(a);  // 顯式強制類型轉換

相較於,第三行代碼使用String對變數a進行封裝而言,第二行代碼的類型轉換並非那麼明顯,更像是'+'操作符的副作用,所以我們把這種情況稱為隱式強制類型轉換,而顯式的通過原生函數封裝的方式則稱為顯式強制類型轉換。當然,這隻是作者的一種觀點而已,但是這種觀點對於區分這兩種類型轉換還是有好處的。


二、JSON.stringify()

如果要將對象字元串化,可以使用JSON.stringify()。這個方法可以帶參數,參數可以是以下兩種情況:

  1. 參數是一個字元串數組,數組元素是要執行序列化的對象的屬性名稱:
var a = {
    b: 1,
    c: '1',
    d: [1,2,3]
};

JSON.stringify(a, ['b', 'c']);  // "{"b":1,"c":"1"}"
  1. 參數是一個函數,這個函數有兩個參數,key和value,這個函數會首先對要序列化的對象自身調用一次,然後對對象的每個屬性調用一次,然後如果對象的屬性值是可迭代的,會繼續對屬性值中的每個屬性再依次調用。
var a = {
    b: 1,
    c: [1,23,3]
};

JSON.stringify(a, function(k, v){
    console.log('key:',k,' value:',v);
    return v;
})

列印輸出如下:

key:   value: {b: 1, c: Array(3)}
key: b  value: 1
key: c  value: (3) [1, 23, 3]
key: 0  value: 1
key: 1  value: 23
key: 2  value: 3

JSON.stringify的執行結果:

"{"b":1,"c":[1,23,3]}"

JSON.stringify還有第三個參數,可以指定縮進符,讓生成的字元串更容易被閱讀:

JSON.stringify(a, null, 2);

輸出結果:

"{
  "b": 1,
  "c": [
    1,
    23,
    3
  ]
}"

預設是空格縮進,所以2表示縮進兩個空格,你也可以傳入別的字元。


三、假值對象

這一點牽扯到了其他值向布爾值的強制類型轉換。日常開發中我們經常用到如下所示類型的代碼:

var a = '111';
if (a) {
    ...
}

if語句對a做了一個隱式強制類型轉換,我們知道空字元串會被轉換為false,非空就是true,包括'0'這種情況。

ES規範列舉如下幾種會轉為假值的值:

  • undefined
  • null
  • false
  • +0, -0, NaN
  • ''

除了這幾種值,我們可以認為別的情況都會被轉為true。包括空對象{}。但是,還存在一種假值對象,會被轉為false。

作者舉了一個document.all的類數組對象,會被轉為false。現實情況確實是這樣。但是似乎這種假值對象並不是很多,多數作為坑存在,我覺得知道有這麼一個東西存在就可以了。


四、parseInt()和Number()

  • paeseInt():解析字元串中的數字
  • Number():將字元串強制類型轉換為數字

解析允許字元串中含有非數字字元,解析從左到右,遇到第一個非數字字元停止,返回第一個非數字字元之前的所有數字。

轉換不允許字元串含有非數字字元,否則返回NaN。

這兩種方式各有各的使用場景。


五、||和&&

在JS中,||和&&這兩個運算符有一些特殊,如果接觸過java、C等語言。我們可能會想當然的把它們稱作邏輯運算符,返回值為true或false。但是在JS中,這兩個運算符的返回值並不全是true和false,而是返回兩個操作數中的一個。

var a = 1;
var b = "2";
var c = {};
var d = true;

a || b; // 1
a && b; // "2"

b || c; // "2"
b && c; // {}

c || d; // {}
c && d; // true

在JS中,||和&&操作符會首先對第一個操作數執行判斷,如果值不是布爾值,首先執行強制類型轉換:

  • 對“||”而言,如果第一個操作數強制類型轉換後為true,則直接返回第一個操作數,否則,直接返回第二個操作數。
  • 對“&&”而言,如果第一個操作數強制類型轉換後為false,則直接返回第一個操作數,否則,直接返回第二個操作數。

所以,現在我們就能更好的理解如下所示的這種代碼的執行機制到底是怎麼回事了:

var a = '1';
var b = '2';

if (a && b) {
    ...
}

首先,(a && b)這個表達式我們知道返回值是'2',然後if語句對這個結果執行了隱式強制類型轉換,轉換後的結果為true。


六、寬鬆相等和嚴格相等

在瞭解了強制類型轉換後,我們也就能對=====有一個更清晰的理解。

==允許在相等比較中進行強制類型轉換,而===不允許。


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

-Advertisement-
Play Games
更多相關文章
  • 提交的驗證方法(通過單個字元比較): 提交驗證方法(通過正則表達式) js中用pattern.test(需要驗證字元串) pattern是正則表達式 提交之前驗證的方法 這種方法會先校驗 校驗成功會 返回true 給onsubmit 校驗失敗會 返回false給onsubmit 校驗成功 打開激活網 ...
  • 1 var pattern=/g..gle/; //點符號表示匹配除了換行符外的任意字元 2 var str='g78gle'; 3 alert(pattern.test(str)); 4 5 6 var pattern=/go*gle/; //o* ,表示0個或者多個o 7 var str='go... ...
  • 如何消除一個數組裡面重覆的元素? 示例三種方法: ...
  • 前言 使用HTML+CSS能寫出什麼驚人的效果呢? 針對這個問題,我總會看到類似的回答,比如沒有JS,前端永遠都是靜態的;HTML5要搭配JS,要不然一文不值。 JS固然強大,但CSS也並非一文不值,這裡我就要為CSS3鳴不平了,說出上面那些回答的人可能真的不瞭解CSS的強大之處。 今天這篇文章我們 ...
  • 各種類型的線條 世界那麼大 ————————— 世界那麼大 ————————— ...
  • 簡介:模態框(Modal)是覆蓋在父窗體上的子窗體。通常,目的是顯示來自一個單獨的源的內容,可以在不離開父窗體的情況下有一些互動。子窗體可提供信息、交互等。 Modal簡介 Modal實現彈出表單 Modal實現刪除提示框 其他用法 Bootstrap 模態框(Modal)插件 模態框(Modal) ...
  • 申請百度統計後,會得到一段JS代碼,需要插入到每個網頁中去,在Vue.js項目首先想到的可能就是,把統計代碼插入到index.html入口文件中,這樣就全局插入,每個頁面就都有了;這樣做就涉及到一個問題,Vue.js項目是單頁應用,每次用戶瀏覽網站時,訪問內頁時頁面是不會刷新的,也就意味著不會觸發百 ...
  • border屬性 border-width border-style border-color inherit border-style的值:none dotted(點線) dashed(虛線) solid(實線) double(雙線) groove(凹槽) ridge(凸起) inset outs ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...