国产高清在线免费观看-国产高清在线免费无码-国产高清在线男人的天堂-国产高清在线视频-国产高清在线视频精品视频-国产高清在线视频伊甸园

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點晴永久免費OA]神奇的JavaScript弱等價類型轉(zhuǎn)換

freeflydom
2024年6月14日 8:45 本文熱度 1667

JavaScript這門語言的類型系統(tǒng)從來沒有它表面看起來的那樣和善,雖然比起Java、C#等一眾強類型語言,它的弱類型使用起來似乎是如此便利,但正因為它極高的自由度,所以才會衍生出令人摸不著頭腦的荒誕行為。
舉個例子,雖然我們都知道一個包含內(nèi)容的字符串會被認(rèn)為是“真值 Truthy”(因為除了空字符串之外任何字符串在JS里都被認(rèn)為真值),但當(dāng)你做如下比較的時候,你會得到一個驚掉下巴的結(jié)果

const a = "18";

const b = true;


a == b  // false

什么鬼,一個被通常理解成真值的值,竟然無法與布爾真值松散相等?
為了能撥開JavaScript類型的迷霧,讓頭鐵的我們一點一點理順JavaScript整個類型系統(tǒng)的工作邏輯。

讀者可以根據(jù)自己對JS類型系統(tǒng)的掌握程度,選擇性的閱讀這篇博客

類型基礎(chǔ)

JavaScript有以下八大類型,除了object類型,其他都為基本類型

  • number

  • string

  • boolean

  • null

  • undefined

  • object

  • symbol

  • bigint

他們的類型都可以直接被typeof識別,特例是

  • typeof null"object"雖然它是null類型的值

  • typeof function(){}"function"雖然它理論上是object類型的

雖然你可能已經(jīng)為這種特例所不解,但其實這才剛開始,大的還在后面

類型轉(zhuǎn)換

轉(zhuǎn)換為數(shù)字

JavaScript內(nèi)部有一套抽象的數(shù)字轉(zhuǎn)換機制叫ToNumber,這套機制在隱式轉(zhuǎn)換或者部分顯式轉(zhuǎn)換其他類型值到數(shù)字時會被調(diào)用。雖然你可能會被惡心到,但我還是要向你介紹這套機制的規(guī)則為

  • string若為數(shù)字表達(dá)式則轉(zhuǎn)換為其對應(yīng)數(shù)字,否則返回NaN

  • undefined轉(zhuǎn)換為NaN

  • null轉(zhuǎn)換為0

  • true轉(zhuǎn)換為數(shù)字1

  • false轉(zhuǎn)換為數(shù)字0

  • object類型會依次調(diào)用toPrimitive()valueOf()toString()來獲取值,并利用上面的規(guī)則獲取其數(shù)字值

ToNumber的轉(zhuǎn)換規(guī)則會在以下情況下使用,當(dāng)然這些情況也可以稱作轉(zhuǎn)換數(shù)字的“技巧”,看你怎么理解它了:

  • Number(value)

  • + value

  • Math.floor(value)

  • value * x,將一個值做乘法運算

沒錯,Math.floor(true)+ truetrue * 1都等于1,是不是覺得很荒誕?

'5' + 3或者5 + '3'結(jié)果都是字符串'53',因為+在有兩個操作值,且其中一個為字符串時,會直接做字符串拼接。所以雖然+ '3'結(jié)果為數(shù)字3,但5 + '3'的結(jié)果不是8

parseInt()parseFloat()只接受string類型,所以轉(zhuǎn)換規(guī)則與ToNumber轉(zhuǎn)換機制下的string類型情況相似,但是在處理字符時采取從左到右的掃描直到失敗為止的方法,所以parseInt("123hello")結(jié)果為123

轉(zhuǎn)換為布爾

JavaScript還有一套針對布爾類型的抽象轉(zhuǎn)換機制叫ToBoolean。因為對于前端邏輯編寫來講,判斷一個值是否為真實在太重要了,JavaScript里變量像薛定諤的貓一樣,處于存在與不存在、真和假的中間態(tài),所以我們JS開發(fā)者都有一個奇怪的腦回路,當(dāng)看到一個字面量值的時候就開始評估它是“真值”(Trusy Value)還是“假值”(Falsy Value)。
可是,與物理學(xué)里薛定諤的貓現(xiàn)象相反,JavaScript里對真假值的定義其實很簡單,以下的值均為假值

  • undefined

  • null

  • false

  • +0-00nNaN

  • ""

其他均為真值,任何非空字符串、非0數(shù)字、對象都是真值。

轉(zhuǎn)換其他類型值為布爾類型的方法:

  • !!value

  • Boolean(value)

  • !,可將值轉(zhuǎn)換為布爾類型,但是真假結(jié)果相反

會隱式的將其他類型值轉(zhuǎn)換為布爾的情況:

  • &&

  • ||

  • if (value)

  • while (value)

  • for (...; value; ...),for循環(huán)的第二個測試表達(dá)式

  • ? :,三元操作符

恭喜你勇士,讀到這里就代表馬上你就能知道為什么"18" != true了!!!

等價性

我們都知道,JS當(dāng)中有松散判斷的弱等價==,和嚴(yán)格判斷的強等價===兩種判斷等價方式。強等價要求兩個操作值必須為同一類型,且值本身也相等,其行為非常容易預(yù)測。弱等價在比較值是否相等前會嘗試做一些類型轉(zhuǎn)換,盡可能的讓可能為不同類型的兩個值變得可以判斷。
造成文章開頭神奇判斷結(jié)果的原因就在弱等價==時的類型轉(zhuǎn)換策略上,聽我將弱等價的轉(zhuǎn)換規(guī)則為你娓娓道來

  • 數(shù)字與字符串比較,則將字符串轉(zhuǎn)換為數(shù)字

  • 布爾值與任何其他值作比較,都先將布爾值轉(zhuǎn)換為數(shù)字

  • nullundefined松散比較結(jié)果相等

  • 對象與數(shù)字或字符串比較,先調(diào)用對象的toPrimitive()獲取原始類型值后進行比較

所以,"18" == true進行比較時

  • 由于布爾值的比較規(guī)則為將布爾值轉(zhuǎn)換為數(shù)字,ToNumber(true)結(jié)果為數(shù)字1,表達(dá)式變?yōu)?code style="box-sizing: inherit; font-family: Consolas, monospace, sans-serif !important; font-size: 0.935em !important; padding: 0px 5px; line-height: 1.8; margin: 0px 3px; display: inline-block; overflow-x: auto; vertical-align: middle; border-radius: 3px !important; background: rgb(247, 247, 249) !important; color: rgb(34, 34, 34) !important; border: none rgb(255, 255, 255) !important; overflow-wrap: break-word !important;">"18" == 1

  • 又因為字符串與數(shù)字比較時字符串應(yīng)轉(zhuǎn)換為數(shù)字,則ToNumber("18")結(jié)果為數(shù)字18

  • 最后表達(dá)式實際比較18 == 1,結(jié)果為假false

所以沒錯,以下表達(dá)式均為真:"1" == true"0" == falsefalse == ""

結(jié)語

了解這個例子后你可能會對JavaScript語言行為設(shè)計混亂表達(dá)不滿,但是上述邊界條件可以通過引入TypeScript,避免弱等價判斷轉(zhuǎn)而使用嚴(yán)格等價,在隱式類型轉(zhuǎn)換之前使用可預(yù)測行為的轉(zhuǎn)換方法對值提前進行處理。


轉(zhuǎn)自博客園 https://www.cnblogs.com/camwang/p/18242665  作者CamWang


該文章在 2024/6/14 8:46:25 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产一区二区精品久 | 久久久精品免费视频 | 成人精品一区二区三区电影黑人 | 精精国产xxxx视频在线播放 | 亚洲av无码资源在线观看 | 亚洲精品无码成人A片在线 亚洲精品无码成人片在线观看 | 婷婷色中文字幕综合在线 | 在线播放你懂的拔插 | 中文天堂最新版在线www | 成人午夜高潮a∨猛片 | 台湾无码一区二区 | 自拍亚洲综合精品 | 欧美午夜精品久久久久免费视 | 精品国产乱码久久久久久1区二区 | 湿女导航褔利Av导航 | 国产在线欧美一区日韩二区 | 91噜噜噜在线观看 | 亚洲熟女乱综合一区二区三区 | 亚洲无码天堂在线播放 | 日韩欧美爱情中文字幕在线 | 少妇无码一区二区二三区 | 国产色婷婷亚洲99精品 | 精品亚洲成a人片在线观看韩国软件无码二区中文字幕视频 | 亚洲肥老太bbw中国熟女 | 国产一级特黄老妇女大片免费 | 东京热无码av专区 | 一道在线中文一区二区三区 | 国产精品久久久久久影院 | 欧美日韩精品免费观看视频 | 亚洲av综合a色av中文 | gay片免费二区一个人视频在线观看www一个人在线观看www | 2025国产精品国产精华 | 四虎影院211风情影院 | 精品人妻无码在线小视频 | 手机在线日本亚洲欧美视频 | 无码精品一区二区三区免费视频 | 亚洲欧美自拍制服另类图片 | 国产亚洲精品欧洲在线视频 | 亚洲vs成人无码人在线观看堂 | 人人艹人人干 | 精品欧美军人同性videos |