日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

徹底搞懂 JS 類(lèi)型轉(zhuǎn)換

來(lái)源: 責(zé)編: 時(shí)間:2024-01-03 11:35:49 222觀看
導(dǎo)讀1. 什么是類(lèi)型轉(zhuǎn)換?Javascript 是一種弱類(lèi)型語(yǔ)言,這意味著變量是沒(méi)有明確類(lèi)型的,而是由 JavaScript 引擎在編譯時(shí)隱式完成。類(lèi)型轉(zhuǎn)換就是將一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型,例如:20 + "twenty" // "20twenty""10" * "10"
1. 什么是類(lèi)型轉(zhuǎn)換?

Javascript 是一種弱類(lèi)型語(yǔ)言,這意味著變量是沒(méi)有明確類(lèi)型的,而是由 JavaScript 引擎在編譯時(shí)隱式完成。類(lèi)型轉(zhuǎn)換就是將一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型,例如:aqz28資訊網(wǎng)——每日最新資訊28at.com

20 + "twenty" // "20twenty""10" * "10"   //  100 2 - "x"

Javascript 使用嚴(yán)格相等(===)和寬松相等(==)來(lái)測(cè)試兩個(gè)值的相等性,類(lèi)型轉(zhuǎn)換僅在使用寬松相等運(yùn)算符時(shí)發(fā)生。當(dāng)使用 === 測(cè)試嚴(yán)格相等時(shí),要比較的變量的類(lèi)型和值都必須相同,例如:aqz28資訊網(wǎng)——每日最新資訊28at.com

10 === 10     // trueNaN === NaN   // false

在上面的代碼中,10和10都是數(shù)字并且是完全相等的,所以正如預(yù)期的那樣返回了true,兩個(gè) NaN 永遠(yuǎn)不會(huì)相等。當(dāng)使用 == 測(cè)試寬松相等時(shí),可能會(huì)發(fā)生隱式轉(zhuǎn)換:aqz28資訊網(wǎng)——每日最新資訊28at.com

'20' == 20    // truefalse == 0    // true

對(duì)于任何數(shù)據(jù)類(lèi)型,無(wú)論是原始類(lèi)型還是對(duì)象,都可以進(jìn)行類(lèi)型轉(zhuǎn)換。盡管原始類(lèi)型和對(duì)象的轉(zhuǎn)換邏輯各不相同,但是都只能轉(zhuǎn)換為三種類(lèi)型:字符串(string)、數(shù)字(number)、布爾值(boolean)。aqz28資訊網(wǎng)——每日最新資訊28at.com

JavaScript 中的類(lèi)型轉(zhuǎn)換有兩種方式:aqz28資訊網(wǎng)——每日最新資訊28at.com

隱式類(lèi)型轉(zhuǎn)換: 由 JavaScript 編譯器完成的自動(dòng)類(lèi)型轉(zhuǎn)換。aqz28資訊網(wǎng)——每日最新資訊28at.com

顯式類(lèi)型轉(zhuǎn)換: 由開(kāi)發(fā)人員完成的手動(dòng)類(lèi)型轉(zhuǎn)換。aqz28資訊網(wǎng)——每日最新資訊28at.com

下面先來(lái)看看 JavaScript 中的顯式和隱式類(lèi)型轉(zhuǎn)換。aqz28資訊網(wǎng)——每日最新資訊28at.com

(1)顯示類(lèi)型轉(zhuǎn)換

我們可以通過(guò) JavaScript 內(nèi)置的一些 API 將一種類(lèi)型轉(zhuǎn)換為另一種類(lèi)型,這稱為顯式類(lèi)型轉(zhuǎn)化。執(zhí)行顯式類(lèi)型轉(zhuǎn)換的最簡(jiǎn)單方法是使用 Boolean()、Number() 和 String()、parseInt()等函數(shù),例如:aqz28資訊網(wǎng)——每日最新資訊28at.com

String(2 - true);     // '1''56' === String(56);  // trueNumber('2350e-2');    // '23.5'Number('23') + 7;     // 30Boolean('');          // falseBoolean(2) === true;  //true

(2)隱式類(lèi)型轉(zhuǎn)換

隱式類(lèi)型轉(zhuǎn)換是將一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型(確保在相同數(shù)據(jù)類(lèi)型之間完成操作)以使運(yùn)算符或函數(shù)正常工作,這種轉(zhuǎn)換是由 JavaScript 編譯器自動(dòng)完成的,隱式類(lèi)型轉(zhuǎn)換也稱為類(lèi)型強(qiáng)制。例如:aqz28資訊網(wǎng)——每日最新資訊28at.com

'25' + 15;          // '2515'23 * '2';           // 4623 - true;          // 22true - null;        // 1false + undefined;  // NaNconst arr = [];if(arr) { console.log('Hello World') };

下面這些常見(jiàn)的操作會(huì)觸發(fā)隱式地類(lèi)型轉(zhuǎn)換,編寫(xiě)代碼時(shí)要格外注意:aqz28資訊網(wǎng)——每日最新資訊28at.com

  • 運(yùn)算相關(guān)的操作符:+、-、+=、++、* 、/、%、<<、& 等。
  • 數(shù)據(jù)比較相關(guān)的操作符: >、<、== 、<=、>=、===。
  • 邏輯判斷相關(guān)的操作符: &&、!、||、三目運(yùn)算符。

① + 運(yùn)算符

/* 一個(gè)操作數(shù) */+ x // 將x轉(zhuǎn)化為數(shù)字, 如果不能轉(zhuǎn)化為數(shù)組將輸出NaN+ "1234string"   // NaN + 1              // 1+ '1'            // 1+ true           // 1+ undefined      // NaN+ null           // 0+ new Date()     // 1660493819396/* 兩個(gè)操作數(shù) */a + b// 1. 如果其中任何一個(gè)是對(duì)象,則先將其轉(zhuǎn)換為原始類(lèi)型{} + {}          // '[object Object][object Object]'[] + []          // ''[] + new Date()  // 'Mon Aug 15 2022 00:18:18 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)'// 2. 如果一個(gè)是字符串,則將另一個(gè)轉(zhuǎn)換為字符串1 + ''           // '1''' + 1           // '1''' + true        // 'true'// 3. 否則,將兩者都轉(zhuǎn)換為數(shù)字1 + true         // 2true + true      // 2

② -、*、/、++、--

// 將一個(gè)或多個(gè)值轉(zhuǎn)換為數(shù)字 - '1'     // -1 [] - 1    // -1 [] - {}   // NaN

③ ==、!=

// 兩個(gè)操作數(shù) a == b// 1. 如果一個(gè)是 `null` 而另一個(gè)是 `undefined`,它們是相等的null == undefined    // true// 2. 如果一個(gè)是數(shù)字,另一個(gè)是字符串,將字符串轉(zhuǎn)換為數(shù)字,再比較1 == '1'             // true// 3. 如果其中一個(gè)是布爾值,將其轉(zhuǎn)換為數(shù)字,再次比較true == 1            // truefalse == 0           // true// 4. 如果一個(gè)是對(duì)象,另一個(gè)是數(shù)字或字符串,將對(duì)象轉(zhuǎn)換為原始類(lèi)型,再次比較[1] == 1             // true['1'] == '1'         // true

下圖是在使用 == 時(shí),判斷兩個(gè)操作數(shù)是否相等的總結(jié)(綠色表示相等,白色表示不等):aqz28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片aqz28資訊網(wǎng)——每日最新資訊28at.com

④ >、>=、<、<=

// 兩個(gè)操作數(shù)a > b// 1. 如果其中一個(gè)是對(duì)象,則將其轉(zhuǎn)換為原始類(lèi)型,再次比較[2] > 1   // true// 2. 如果兩者都是字符串,使用字母順序比較它們'b' > 'a' // true// 3. 如果其中一個(gè)是數(shù)字,則將一個(gè)或兩個(gè)非數(shù)字轉(zhuǎn)換為數(shù)字'2' > 1   // true

⑤ in

/* 如果左操作數(shù)不是字符串,則將其轉(zhuǎn)換為字符串 */ a in b'1' in {1: ''}    // true 1 in {1: 'a'}    // true 1 in ['a', 'b']  // true

2. 常見(jiàn)類(lèi)型轉(zhuǎn)換

(1)字符串轉(zhuǎn)換

將數(shù)據(jù)類(lèi)型轉(zhuǎn)換為字符串稱為字符串轉(zhuǎn)換,可以使用 String() 函數(shù)將數(shù)據(jù)類(lèi)型顯式轉(zhuǎn)換為字符串。當(dāng)一個(gè)操作數(shù)是字符串時(shí),可以通過(guò)使用 + 運(yùn)算符來(lái)觸發(fā)隱式字符串轉(zhuǎn)換。aqz28資訊網(wǎng)——每日最新資訊28at.com

① 數(shù)字 => 字符串:

Number對(duì)象的 toString() 方法會(huì)返回指定 Number 對(duì)象的字符串表示形式。String()和 new String() 會(huì)把對(duì)象的值轉(zhuǎn)換為字符串。aqz28資訊網(wǎng)——每日最新資訊28at.com

String(20);           // '20'String(10 + 40);      // '50'(10 + 40).toString(); // '50'new String(10 + 20);  // '30'

② 布爾值 => 字符串:

String() 和 toString() 方法會(huì)將布爾值轉(zhuǎn)化為對(duì)應(yīng)的字符串形式。aqz28資訊網(wǎng)——每日最新資訊28at.com

String(true);     // 'true'String(false);    // 'false'true.toString()   // 'true'false.toString()  // "false"

③ 數(shù)組 => 字符串:

String() 方法會(huì)將數(shù)組元素通過(guò)逗號(hào)連接起來(lái),無(wú)論嵌套多少層,都會(huì)將其展開(kāi)并返回元素拼接好的字符串。如果是空數(shù)字,會(huì)返回空字符串:aqz28資訊網(wǎng)——每日最新資訊28at.com

String([1, 2, 3]);                // '1,2,3'String([1, 2, 3, [4, [5]]]);      // '1,2,3,4,5'String([1, 2, 3, [4, [5, {}]]]);  // '1,2,3,4,5,[object Object]'String([]);                       // ''

④ 對(duì)象 => 字符串:

使用 String() 方法會(huì)將對(duì)象轉(zhuǎn)化為 '[object Object]',無(wú)論對(duì)象是否為空對(duì)象:aqz28資訊網(wǎng)——每日最新資訊28at.com

String({name: "Hello"});   // '[object Object]'

⑤ null / undefined / NaN => 字符串:

使用 String() 方法會(huì)將  null、undefined、NaN 轉(zhuǎn)化為其對(duì)應(yīng)的字符串形式:aqz28資訊網(wǎng)——每日最新資訊28at.com

String(undefined);    // 'undefined'String(null);         // 'null'String(NaN);          // 'NaN'

⑥ 日期 => 字符串:

String(new Date('2022-08-20')) // 'Sat Aug 20 2022 08:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)'

⑦ 隱式轉(zhuǎn)換

當(dāng)任何數(shù)據(jù)類(lèi)型使用+運(yùn)算符與字符串連接時(shí)會(huì)發(fā)生到字符串的轉(zhuǎn)換(隱式轉(zhuǎn)換):aqz28資訊網(wǎng)——每日最新資訊28at.com

"25" + 56;              // '2556'"25" + null;            // '25null'"Hello " + undefined;   // 'Hello undefined'"25" + false;           // '25fasle'"25" + {};              // '25[object Object]'"25" + [10];            // '2510'

所以,當(dāng)我們想要?jiǎng)?chuàng)建一個(gè)操作并且操作數(shù)類(lèi)型之一是字符串時(shí),應(yīng)該小心使用類(lèi)型強(qiáng)制轉(zhuǎn)換。aqz28資訊網(wǎng)——每日最新資訊28at.com

⑧ 總結(jié)

下面是 ECMAScript 規(guī)范中將數(shù)據(jù)類(lèi)型轉(zhuǎn)換為字符串的規(guī)則:aqz28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片aqz28資訊網(wǎng)——每日最新資訊28at.com

ECMAScript 規(guī)范:https://262.ecma-international.org/5.1/#sec-9.8aqz28資訊網(wǎng)——每日最新資訊28at.com

(2)布爾轉(zhuǎn)換

將數(shù)據(jù)類(lèi)型轉(zhuǎn)換為布爾值稱為布爾轉(zhuǎn)換。這種轉(zhuǎn)換既可以由 Boolean() 函數(shù)顯式完成,也可以在邏輯上下文中隱式完成(如if/else )或通過(guò)使用邏輯運(yùn)算符( ||、&&、! )觸發(fā)。aqz28資訊網(wǎng)——每日最新資訊28at.com

① 字符串 => 布爾值:

使用 Boolean() 方法轉(zhuǎn)化字符串時(shí),只有當(dāng)字符串為空時(shí)會(huì)返回false,其他情況都會(huì)返回 true:aqz28資訊網(wǎng)——每日最新資訊28at.com

Boolean('hello'); // true Boolean(' ');     // true Boolean('');      // false

② 數(shù)字 => 布爾值:

使用 Boolean() 方法轉(zhuǎn)化數(shù)字時(shí),只有 0、-0 或 NaN 會(huì)轉(zhuǎn)化為 false,其他情況會(huì)返回 true:aqz28資訊網(wǎng)——每日最新資訊28at.com

Boolean(-123); // true Boolean(123);  // true Boolean(0);    // falseBoolean(-0);   // falseBoolean(NaN);  // false

③ 數(shù)組 / 對(duì)象 => 布爾值:

使用 Boolean() 方法轉(zhuǎn)化數(shù)組或?qū)ο髸r(shí),無(wú)論數(shù)組和對(duì)象是否有內(nèi)容,都會(huì)返回true:aqz28資訊網(wǎng)——每日最新資訊28at.com

Boolean([1, 2, 3]); // trueBoolean([]);        // trueBoolean({});  // trueBoolean({'hello': 'world'});  // true

④ null / undefined => 布爾值:

使用 Boolean() 方法轉(zhuǎn)化null或undefined時(shí),都始終返回 false:aqz28資訊網(wǎng)——每日最新資訊28at.com

Boolean(undefined);  // false Boolean(null);       // false

⑤ 隱式轉(zhuǎn)換

在數(shù)學(xué)運(yùn)算中,true 轉(zhuǎn)換為 1,false 轉(zhuǎn)換為 0:aqz28資訊網(wǎng)——每日最新資訊28at.com

true + 5;    // 6false + 5;   // 55 - true;    // 55 - false;   // 4

⑥ 邏輯運(yùn)算符、邏輯上下文

// 如果其中一個(gè)不是布爾值,則將其轉(zhuǎn)換為布爾值Boolean( null || undefined || 0 || -0 || NaN || '' )    // falseBoolean( 1 && 'a' && { } && [] && [0] && function(){} ) // truetrue && false // falsetrue && true // truetrue || false // truetrue || !false // true

注意,邏輯運(yùn)算符,例如 || 或 && 內(nèi)部進(jìn)行布爾轉(zhuǎn)換,但實(shí)際上返回原始操作數(shù)的值,即使它們不是布爾值。aqz28資訊網(wǎng)——每日最新資訊28at.com

'hello' && 123;   // 123

可以使用雙感嘆號(hào)(!!)來(lái)將變量轉(zhuǎn)為為布爾值:aqz28資訊網(wǎng)——每日最新資訊28at.com

!!0    // false!!""   // false!!" "  // true!!{}   // true!![]   // true!!true // true

if、else if、while、do/while 和 for 使用與 &&、||、! 相同的隱式類(lèi)型轉(zhuǎn)換方式(邏輯表達(dá)式)。aqz28資訊網(wǎng)——每日最新資訊28at.com

下面是在 if 語(yǔ)句(邏輯上下文)中的隱式轉(zhuǎn)換規(guī)則(綠色為true,白色為false):aqz28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片aqz28資訊網(wǎng)——每日最新資訊28at.com

⑦ 總結(jié)

除了下面這些之外的所有其他值都是真值,包括對(duì)象、數(shù)組、日期等。甚至所有Symbol、空對(duì)象和數(shù)組都是真值。aqz28資訊網(wǎng)——每日最新資訊28at.com

Boolean('');        // falseBoolean(0);         // false     Boolean(-0);        // falseBoolean(NaN);       // falseBoolean(null);      // falseBoolean(undefined); // falseBoolean(false);     // false
Boolean({})             // trueBoolean([])             // trueBoolean(Symbol())       // trueBoolean(function() {})  // true

可以通過(guò)以下方式來(lái)過(guò)濾數(shù)組中的假值:aqz28資訊網(wǎng)——每日最新資訊28at.com

[0, "", " ", null, undefined, NaN].map(Boolean); // 輸出結(jié)果:[false, false, true, false, false, false]

我們可以會(huì)遇到一種情況,當(dāng)使用 5 == true 時(shí),結(jié)果為false,而使用if(5) {}時(shí),則 5 被認(rèn)為是 true 并進(jìn)入if/else語(yǔ)句:aqz28資訊網(wǎng)——每日最新資訊28at.com

5 == true;  // falseif (5) {    console.log('5');  // 5};

這種情況下,即一個(gè)值和數(shù)字進(jìn)行比較時(shí),JavaScript 會(huì)試圖將這個(gè)值轉(zhuǎn)換為數(shù)字。所以,當(dāng)比較5 == true 時(shí),JavaScript 傾向于將true轉(zhuǎn)換為1,因?yàn)?1不等于5,因此結(jié)果為 false。而在if(5) {}的情況下,5 被轉(zhuǎn)換為布爾值,而 5 是一個(gè)真值,所以它進(jìn)入if塊。在這種情況下,可以選擇顯式轉(zhuǎn)換以避免錯(cuò)誤,因?yàn)?5 是一個(gè)真值,可以執(zhí)行Boolean(5) == true,這樣就會(huì)返回true了。aqz28資訊網(wǎng)——每日最新資訊28at.com

下面是 ECMAScript 規(guī)范中將數(shù)據(jù)類(lèi)型轉(zhuǎn)換為布爾值的規(guī)則:aqz28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片aqz28資訊網(wǎng)——每日最新資訊28at.com

ECMAScript 規(guī)范:https://262.ecma-international.org/5.1/#sec-9.2aqz28資訊網(wǎng)——每日最新資訊28at.com

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

將數(shù)據(jù)類(lèi)型轉(zhuǎn)換為數(shù)字稱為數(shù)字轉(zhuǎn)換,可以使用Number()、parseInt()、parseFloat()等方法將數(shù)據(jù)類(lèi)型顯式轉(zhuǎn)換為數(shù)字。當(dāng)一個(gè)值不能被強(qiáng)制轉(zhuǎn)換為一個(gè)數(shù)字時(shí),就會(huì)返回 NaN。aqz28資訊網(wǎng)——每日最新資訊28at.com

① 字符串 => 數(shù)字:

當(dāng)把字符串轉(zhuǎn)換為數(shù)字時(shí),JavaScript 引擎首先會(huì)修剪前導(dǎo)和后置空格、/n、/t 字符,如果修剪后的字符串不代表有效數(shù)字,則返回 NaN。 如果字符串為空,則返回 0。aqz28資訊網(wǎng)——每日最新資訊28at.com

Number('123');            // 123Number("-12.34")          // -12.34Number("12s");            // NaNNumber("/n")              // 0parseInt(' 203px');       // 203 parseInt('10.000')        // 10   parseInt('10.20')         // 10 parseFloat('203.212px');  // 203.212parseFloat('10.20')       // 10.2parseFloat('10.81')       // 10.81

可以看到,parseInt 函數(shù)會(huì)從字符串中讀取一個(gè)數(shù)字并刪除它后面所有字符,但是如果數(shù)字前面有字符(空格除外),那么它將輸出 NaN。aqz28資訊網(wǎng)——每日最新資訊28at.com

② 布爾值 => 數(shù)字:

當(dāng)使用 Number() 將布爾值轉(zhuǎn)化為數(shù)字時(shí),true 會(huì)轉(zhuǎn)化為 1,false 會(huì)轉(zhuǎn)化為 0。aqz28資訊網(wǎng)——每日最新資訊28at.com

Number(true);  // 1Number(false); // 0

③ null  => 數(shù)字:

當(dāng)使用 Number() 將 null 轉(zhuǎn)化為數(shù)字時(shí),會(huì)返回 0:aqz28資訊網(wǎng)——每日最新資訊28at.com

Number(null); // 0null + 5; // 5

④ undefined / 數(shù)組 / 對(duì)象 / NaN => 數(shù)字:

當(dāng)使用 Number() 將 undefined、數(shù)組、對(duì)象、NaN 轉(zhuǎn)化為數(shù)字時(shí),會(huì)返回 NaN:aqz28資訊網(wǎng)——每日最新資訊28at.com

Number(undefined);  // NaNNumber([1, 2, 3])   // NaNNumber({})          // NaNNumber(NaN)         // NaN

⑤ 數(shù)組元素

可以使用map遍歷數(shù)組元素,并使用需要的類(lèi)型來(lái)進(jìn)行類(lèi)型轉(zhuǎn)換:aqz28資訊網(wǎng)——每日最新資訊28at.com

["1", "9", "-9", "0.003", "yes"].map(Number);// 輸出結(jié)果:[1, 9, -9, 0.003, NaN]

⑥ 特殊規(guī)則

在表達(dá)式中,當(dāng)我們將 == 運(yùn)算符應(yīng)用于 null 或 undefined 時(shí),不會(huì)發(fā)生數(shù)字轉(zhuǎn)換。 此外,null 只等于 null 或 undefined,不能等于其他任何值:aqz28資訊網(wǎng)——每日最新資訊28at.com

null == null;           // true null == 0;              // falsenull == undefined;      // trueundefined == undefined  // true

根據(jù)運(yùn)算符優(yōu)先級(jí),+ 運(yùn)算符具有從左到右的關(guān)聯(lián)性,因此如果有一個(gè)表達(dá)式 2 + 3 + '4' + 'number' ,則操作按以下方式完成:aqz28資訊網(wǎng)——每日最新資訊28at.com

2 + 3 + '4' + 'number'==> 5 + '4' + 'number'// 數(shù)字 5 被隱式轉(zhuǎn)換為字符串,然后連接起來(lái)==> '54' + 'number'==> '54number'

NaN 不等于任何其他類(lèi)型,甚至它本身:aqz28資訊網(wǎng)——每日最新資訊28at.com

NaN == NaN  // false

⑦ 總結(jié)

上面的例子中,可以清楚地看到一些意想不到的結(jié)果:將 null 轉(zhuǎn)換為數(shù)字時(shí)返回了 0,而將 undefined 轉(zhuǎn)換為數(shù)字返回了 NaN。兩個(gè)操作都應(yīng)該返回 NaN,因?yàn)檫@兩種值類(lèi)型顯然都不是有效的數(shù)字,將空字符串轉(zhuǎn)換為數(shù)字時(shí)也返回了 0。aqz28資訊網(wǎng)——每日最新資訊28at.com

下面是 ECMAScript 規(guī)范中將數(shù)據(jù)類(lèi)型轉(zhuǎn)換為字符串的規(guī)則,清楚的解釋了上面的異常現(xiàn)象:aqz28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片aqz28資訊網(wǎng)——每日最新資訊28at.com

另外,在 ECMAScript 規(guī)范中,還提到一點(diǎn):aqz28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片aqz28資訊網(wǎng)——每日最新資訊28at.com

意思就是:為空或僅包含空格的 StringNumericLiteral 將轉(zhuǎn)換為 +0。這也就解釋了為什么將空字符串轉(zhuǎn)換為數(shù)字時(shí)也返回了 0。aqz28資訊網(wǎng)——每日最新資訊28at.com

ECMAScript 規(guī)范:https://262.ecma-international.org/5.1/#sec-9.3aqz28資訊網(wǎng)——每日最新資訊28at.com

3. Symbol 類(lèi)型轉(zhuǎn)換

Symbol  只能進(jìn)行顯式轉(zhuǎn)換,不能進(jìn)行隱式轉(zhuǎn)換。也就是說(shuō),Symbol不能被強(qiáng)制轉(zhuǎn)換為字符串或數(shù)字,這樣它們就不會(huì)被意外地用作本來(lái)應(yīng)該表現(xiàn)為 Symbol 的屬性。aqz28資訊網(wǎng)——每日最新資訊28at.com

const mySymbol = Symbol.for("mySymbol");const str = String(mySymbol);console.log(str);  // 'Symbol(mySymbol)'

當(dāng)使用 console.log() 來(lái)打印 symbol 時(shí),它之所以有效,是因?yàn)?nbsp;console.log() 在 symbol 上調(diào)用了 String() 方法以創(chuàng)建可用的結(jié)果。aqz28資訊網(wǎng)——每日最新資訊28at.com

如果嘗試直接使用字符串連接 symbol,它將拋出TypeError:aqz28資訊網(wǎng)——每日最新資訊28at.com

const mySymbol = Symbol.for("mySymbol");const sum = mySymbol + "";console.log(sum);   // Uncaught TypeError: Cannot convert a Symbol value to a string

將 mySymbol 連接到字符串需要首先將 mySymbol 轉(zhuǎn)換為字符串,并且在檢測(cè)到強(qiáng)制轉(zhuǎn)換時(shí)會(huì)拋出錯(cuò)誤,從而阻止以這種方式使用它。aqz28資訊網(wǎng)——每日最新資訊28at.com

同樣,我們不能將 symbol 強(qiáng)制轉(zhuǎn)換為數(shù)字,所有數(shù)學(xué)運(yùn)算符在與符號(hào)一起使用時(shí)都會(huì)引發(fā)錯(cuò)誤:aqz28資訊網(wǎng)——每日最新資訊28at.com

const mySymbol = Symbol.for("mySymbol");const factor = mySymbol / 2;console.log(factor);   // Uncaught TypeError: Cannot convert a Symbol value to a number

4. 對(duì)象類(lèi)型轉(zhuǎn)換

介紹完了基本數(shù)組類(lèi)型的轉(zhuǎn)化,下面來(lái)看看對(duì)象類(lèi)型的轉(zhuǎn)化。例如,當(dāng)執(zhí)行 obj_1 + obj_2 或者 obj_1 - obj_2時(shí),都會(huì)先將對(duì)象轉(zhuǎn)換為原始類(lèi)型,然后將其轉(zhuǎn)換為最終類(lèi)型。當(dāng)然,這里的轉(zhuǎn)化仍然只有三種類(lèi)型:數(shù)字、字符串和布爾值。aqz28資訊網(wǎng)——每日最新資訊28at.com

對(duì)象通過(guò)內(nèi)部的 ToPrimitive 方法將其轉(zhuǎn)換為原始類(lèi)型,該算法允許我們根據(jù)使用對(duì)象的上下文來(lái)選擇應(yīng)如何轉(zhuǎn)換對(duì)象。從概念上講,ToPrimitive 算法可以分為兩部分:Hints 和 Object-to-primitive 轉(zhuǎn)換方法。aqz28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片aqz28資訊網(wǎng)——每日最新資訊28at.com

(1)Hints

Hints 是 ToPrimitive 算法用于確定對(duì)象在特定上下文中應(yīng)轉(zhuǎn)換為什么的信號(hào)。有三種情況:aqz28資訊網(wǎng)——每日最新資訊28at.com

  • string:在操作需要字符串的上下文中,如果可以轉(zhuǎn)換為字符串,例如 alert() 或內(nèi)置 String() 函數(shù):
alert(obj);String(obj)// 使用對(duì)象作為屬性key值anotherObj[obj] = 1000;
  • number:如果可以進(jìn)行這種轉(zhuǎn)換,則在操作需要數(shù)字的上下文中:
// 顯示轉(zhuǎn)換let num = Number(obj);// 數(shù)學(xué)(二進(jìn)制加號(hào)除外)let x = +obj; // 一元加let difference = Date1 - Date2; // 日期對(duì)象// 對(duì)象大小比較let less = Obj1 < obj2;
  • default:在極少數(shù)情況下發(fā)生,不確定需要什么類(lèi)型。例如,二元 + 運(yùn)算符既適用于字符串(連接它們)也適用于數(shù)字(添加它們)。在這種情況下,對(duì)象可以轉(zhuǎn)換為字符串或數(shù)字。 或者當(dāng)使用寬松相等 == 運(yùn)算符將對(duì)象與字符串、數(shù)字或 symbol 進(jìn)行比較時(shí)。
// 二元加let sum = obj1 + obj2;// obj == string/number/symbolif (obj == 10 ) { ... };

所有內(nèi)置對(duì)象(日期除外)都將default認(rèn)為是number,Date 日期對(duì)象將default認(rèn)為是string。aqz28資訊網(wǎng)——每日最新資訊28at.com

(2)Methods

在 ToPrimitive 算法根據(jù) Hints 確定對(duì)象應(yīng)轉(zhuǎn)換為的原始值類(lèi)型之后。 然后使用 Object-to-primitive 轉(zhuǎn)換方法將對(duì)象轉(zhuǎn)換為原始值。有三種情況:aqz28資訊網(wǎng)——每日最新資訊28at.com

  • toString/valueOf:toString() 和 valueOf() 被 JavaScript 中的所有對(duì)象繼承。 它們僅用于對(duì)象到原始值的轉(zhuǎn)換。 ToPrimitive 算法首先會(huì)嘗試 toString() 方法。 如果定義了方法,它返回一個(gè)原始值,那么 JavaScript 使用原始值(即使它不是字符串)。 如果toString() 返回一個(gè)對(duì)象或不存在,那么 JavaScript 會(huì)嘗試使用 valueOf() 方法,如果該方法存在并返回一個(gè)原始值,JavaScript 將使用該值。 否則,轉(zhuǎn)換失敗并提示 TypeError。
  • toString -> valueOf:用于 Hints 為string 的情況。
  • valueOf -> toString:其他情況。
let Person = {  name: "Mary",  age: 22,  // hint 是 "string"  toString() {    return `{name: "${this.name}"}`;  },  // hint 是 "number" 或 "default"  valueOf() {    return this.age;  }};alert(Person);      // toString -> {name: "Mary"}alert(+Person);     // valueOf -> 22alert(Person + 10); // valueOf -> 32

在上面的代碼中,Person 變成了一個(gè)對(duì)象字符串或數(shù)字,具體取決于轉(zhuǎn)換上下文。 toString() 方法用于 Hints = "string" 的轉(zhuǎn)換,valueOf() 用于其他情況(Hints 為“number”或“default”)。aqz28資訊網(wǎng)——每日最新資訊28at.com

你可能希望在一個(gè)地方處理所有轉(zhuǎn)換。 在這種情況下,只能像這樣實(shí)現(xiàn) toString() 方法:aqz28資訊網(wǎng)——每日最新資訊28at.com

let Person = {  name: "Mary",  toString() {    return this.name;  }};alert(Person); // toString -> Maryalert(Person + 1000); // toString -> Mary1000

Symbol.toPrimitive:與 toString() 和 valueOf() 方法不同,Symbol.toPrimitive 允許覆蓋 JavaScript 中的默認(rèn)對(duì)象到原始值的轉(zhuǎn)換(其中 toString() 和 valueOf 方法由 ToPrimitive 算法使用)并定義我們希望如何將對(duì)象轉(zhuǎn)換為原始類(lèi)型的值。 為此,需要使用此 Symbol 名稱定義一個(gè)方法,如下所示:aqz28資訊網(wǎng)——每日最新資訊28at.com

obj[Symbol.toPrimitive] = function(hint) {  // 返回原始類(lèi)型值  // hint 等于 "string", "number", "default" 中的一個(gè)}

例如,這里的 Person 對(duì)象使用 Symbol.toPrimitive 執(zhí)行與上面相同的操作:aqz28資訊網(wǎng)——每日最新資訊28at.com

let Person = {  name: "Mary",  age: 22,  [Symbol.toPrimitive](hint) {    alert(`hint: ${hint}`);    return hint == "string" ? `{name: "${this.name}"}` : this.age;  }};alert(Person);       // hint: string -> {name: "Mary"}alert(+Person);      // hint: number -> 22alert(Person + 10);  // hint: default -> 32

可以看到,單個(gè)方法 Person[Symbol.toPrimitive] 處理了所有轉(zhuǎn)換情況。需要注意,在沒(méi)有 Symbol.toPrimitive 和 valueOf() 的情況下,toString() 將處理所有原始類(lèi)型轉(zhuǎn)換。aqz28資訊網(wǎng)——每日最新資訊28at.com

下面是將對(duì)象轉(zhuǎn)化為布爾值、字符串、數(shù)字時(shí)的執(zhí)行過(guò)程:aqz28資訊網(wǎng)——每日最新資訊28at.com

(1)對(duì)象到布爾值的轉(zhuǎn)換aqz28資訊網(wǎng)——每日最新資訊28at.com

Javascript 中的所有對(duì)象都轉(zhuǎn)換為 true,包括包裝對(duì)象 new Boolean(false) 和空數(shù)組。 對(duì)象到布爾值的轉(zhuǎn)換不需要對(duì)象到原始類(lèi)型算法。aqz28資訊網(wǎng)——每日最新資訊28at.com

(2)對(duì)象到字符串的轉(zhuǎn)換aqz28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)需要將對(duì)象轉(zhuǎn)換為字符串時(shí),Javascript 首先使用 ToPrimitive 算法(Hints = “string”)將其轉(zhuǎn)換為原始類(lèi)型,然后將派生的原始類(lèi)型轉(zhuǎn)換為字符串。例如,如果將對(duì)象傳遞給 String() 這樣的內(nèi)置函數(shù),或者在模板字符串中插入對(duì)象時(shí)。aqz28資訊網(wǎng)——每日最新資訊28at.com

(3)對(duì)象到數(shù)字的轉(zhuǎn)換aqz28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)需要將對(duì)象轉(zhuǎn)換為數(shù)字時(shí),Javascript 首先使用  ToPrimitive  算法(Hints = “number”)將其轉(zhuǎn)換為原始類(lèi)型,然后將派生的原始類(lèi)型轉(zhuǎn)換為數(shù)字。 期望數(shù)字參數(shù)的內(nèi)置 Javascript 函數(shù)和方法以這種方式將對(duì)象參數(shù)轉(zhuǎn)換為數(shù)字,例如 Math()。aqz28資訊網(wǎng)——每日最新資訊28at.com

(3)特殊情況

當(dāng)某些 Javascript 運(yùn)算符的操作數(shù)是對(duì)象時(shí),也會(huì)發(fā)生類(lèi)型轉(zhuǎn)換:aqz28資訊網(wǎng)——每日最新資訊28at.com

  • + 運(yùn)算符: 此運(yùn)算符可以用于執(zhí)行數(shù)字加法和字符串連接。如果其中任何一個(gè)操作數(shù)是對(duì)象,則使用  ToPrimitive 算法(Hints = “default”)將它們轉(zhuǎn)換為原始值。一旦將它們轉(zhuǎn)換為原始值,就會(huì)檢查它們的類(lèi)型。如果任一參數(shù)是字符串,則將另一個(gè)參數(shù)轉(zhuǎn)換為字符串并連接字符串。否則,它將兩個(gè)參數(shù)都轉(zhuǎn)換為數(shù)字并將它們相加。
  • == 和 !== 運(yùn)算符: 這些運(yùn)算符以寬松方式執(zhí)行相等和不相等測(cè)試。如果一個(gè)操作數(shù)是一個(gè)對(duì)象而另一個(gè)是一個(gè)原始值,這些運(yùn)算符使用  ToPrimitive  算法(Hints = “default”)將對(duì)象轉(zhuǎn)換為原始值,然后比較兩個(gè)原始值。
  • <,<=,> 和 >= 關(guān)系運(yùn)算符: 關(guān)系運(yùn)算符用于比較兩個(gè)值之間的關(guān)系,可用于比較數(shù)字和字符串。如果任一操作數(shù)是對(duì)象,則使用 ToPrimitive 算法將其轉(zhuǎn)換為原始值(Hints = “number”)。但是,與對(duì)象到數(shù)字的轉(zhuǎn)換不同,返回的原始值不會(huì)轉(zhuǎn)換為數(shù)字(因?yàn)樗鼈儽槐容^并且不被使用)。

本文鏈接:http://www.www897cc.com/showinfo-26-56593-0.html徹底搞懂 JS 類(lèi)型轉(zhuǎn)換

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 如何用Java實(shí)現(xiàn)自動(dòng)化測(cè)試和質(zhì)量控制?

下一篇: Kubernetes 從提交 deployment 到 pod 運(yùn)行的全過(guò)程

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • 太卷!Redmi MAX 100英寸電視便宜了:12999元買(mǎi)Redmi史上最大屏

    8月5日消息,從小米商城了解到,Redmi MAX 100英寸巨屏電視日前迎來(lái)官方優(yōu)惠,到手價(jià)12999元,比發(fā)布價(jià)便宜了7000元,在大屏電視市場(chǎng)開(kāi)卷。據(jù)了解,Redmi MAX 100
  • 一篇聊聊Go錯(cuò)誤封裝機(jī)制

    %w 是用于錯(cuò)誤包裝(Error Wrapping)的格式化動(dòng)詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數(shù)中的一個(gè)特殊格式化動(dòng)詞,用于將一個(gè)錯(cuò)誤(或其他可打印的值)包裝在一個(gè)新的錯(cuò)誤中。使
  • Flowable工作流引擎的科普與實(shí)踐

    一.引言當(dāng)我們?cè)谌粘9ぷ骱蜆I(yè)務(wù)中需要進(jìn)行各種審批流程時(shí),可能會(huì)面臨一系列技術(shù)和業(yè)務(wù)上的挑戰(zhàn)。手動(dòng)處理這些審批流程可能會(huì)導(dǎo)致開(kāi)發(fā)成本的增加以及業(yè)務(wù)復(fù)雜度的上升。在這
  • 之家push系統(tǒng)迭代之路

    前言在這個(gè)信息爆炸的互聯(lián)網(wǎng)時(shí)代,能夠及時(shí)準(zhǔn)確獲取信息是當(dāng)今社會(huì)要解決的關(guān)鍵問(wèn)題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動(dòng)拉"獲取信息的方式已不能滿足用
  • 2023年,我眼中的字節(jié)跳動(dòng)

    此時(shí)此刻(2023年7月),字節(jié)跳動(dòng)從未上市,也從未公布過(guò)任何官方的上市計(jì)劃;但是這并不妨礙它成為中國(guó)最受關(guān)注的互聯(lián)網(wǎng)公司之一。從2016-17年的抖音強(qiáng)勢(shì)崛起,到2018年的&ldquo;頭騰
  • 余承東:AI大模型技術(shù)的發(fā)展將會(huì)帶來(lái)下一代智能終端操作系統(tǒng)的智慧體驗(yàn)

    8月4日消息,2023年華為開(kāi)發(fā)者大會(huì)(HDC.Together)今天正式開(kāi)幕,華為發(fā)布HarmonyOS 4、全新升級(jí)的鴻蒙開(kāi)發(fā)套件、HarmonyOS Next開(kāi)發(fā)者預(yù)覽版本等一系列
  • AMD的AI芯片轉(zhuǎn)單給三星可能性不大 與臺(tái)積電已合作至2nm制程

    據(jù) DIGITIMES 消息,英偉達(dá) AI GPU 出貨逐季飆升,接下來(lái) AMD MI 300 系列將在第 4 季底量產(chǎn)。而半導(dǎo)體業(yè)內(nèi)人士表示,近日傳出 AMD 的 AI 芯片將轉(zhuǎn)單給
  • iQOO Neo8系列今日官宣:首發(fā)天璣9200+ 全球安卓最強(qiáng)芯!

    在昨日舉行的的聯(lián)發(fā)科新一代旗艦芯片天璣9200+的發(fā)布會(huì)上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發(fā)搭載這款當(dāng)前性能最強(qiáng)大的移動(dòng)平臺(tái)
  • SN570 NVMe SSD固態(tài)硬盤(pán) 價(jià)格與性能兼具

    SN570 NVMe SSD固態(tài)硬盤(pán)是西部數(shù)據(jù)發(fā)布的最新一代WD Blue系列的固態(tài)硬盤(pán),不僅閃存技術(shù)更為精進(jìn),性能也得到了進(jìn)一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top 主站蜘蛛池模板: 巢湖市| 华坪县| 鄂州市| 横山县| 蕲春县| 宁乡县| 石屏县| 顺平县| 金阳县| 邳州市| 新龙县| 论坛| 武宁县| 科技| 大石桥市| 弥勒县| 澳门| 莱芜市| 西林县| 厦门市| 沧源| 林甸县| 阿荣旗| 洪泽县| 武乡县| 阿克苏市| 曲周县| 蒙自县| 南陵县| 余干县| 昌邑市| 新沂市| 八宿县| 白山市| 洛南县| 扶余县| 汨罗市| 花莲市| 松桃| 河南省| 永靖县|