目錄
#物件的隱式轉換
首頁 web前端 js教程 什麼是隱式型別轉換? js隱式類型轉換的介紹

什麼是隱式型別轉換? js隱式類型轉換的介紹

Aug 11, 2018 pm 04:32 PM
隱式型別轉換

本篇文章帶給大家的內容是關於什麼是隱式型別轉換? js隱式類型轉換的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

JavaScript的資料型別非常弱,使用算術運算子時,運算子兩邊的資料型別可以是任意的,例如,一個字串可以和數字相加。之所以不同的資料型別之間可以做運算,是因為JavaScript引擎在運算之前會悄悄的把他們進行了隱式型別轉換的,如下是數值型別和布林型別的相加:

3 + true; 
// 结果:4
登入後複製

結果是一個數值型!如果是在C或Java環境的話,上面的運算會因為運算子兩邊的資料型別不一致而導致報錯,但是,在JavaScript中,只有少數情況下,錯誤型別才會導致出錯,例如呼叫非函數,或讀取null或undefined的屬性時,如下:

"hello"(1); 
//结果: error: not a function
null.x; 
// 结果:error: cannot read property 'x' of null
登入後複製

多數情況下,JavaScript都不會出錯的,而是自動的進行對應的類型轉換。例如-, *, /,和%等算術運算子都會把操作數轉換成數字的,但是「 」號就有點不一樣了,有些情況下,它是算術加號,有些情況下,是字串連接符號,具體的要看它的操作數,如下:

2 + 3; 
//结果: 5
"hello" + " world"; 
// 结果:"hello world"
登入後複製

但是,如果字串和數字相加,JavaScript會自動把數字轉換成字元的,不管數字在前還是字串在前,如下:

"2" + 3; 
// 结果:"23"
2 + "3";
 //结果: "23"
登入後複製

字串和數字相加結果是字串!

這需要注意的是,「」的運算方向是從左到右的,如下:

1 + 2 + "3"; 
// "33"
登入後複製

這與下面是等價的:

(1 + 2) + "3"; 
// "33"
登入後複製

相比之下,下面的結果是不一樣的:

1 + "2" + 3; 
// "123"
登入後複製

但是,隱式類型轉換,有時候,會隱藏一些錯誤的,比如,null會轉換成0,undefined會轉換成NaN。需要注意的是,NaN和NaN是不相等的(這是由於浮點數的精度決定的),如下:

var x = NaN;
x === NaN; // false
登入後複製

雖然,JavaScript提供了isNaN來檢測某個值是否為NaN,但是,這是不太精確的,因為在呼叫isNaN函數之前,本身就存在了一個隱式轉換的過程,它會把那些原本不是NaN的值轉換成NaN的,如下:

isNaN("foo"); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN({ valueOf: "foo" }); // true
登入後複製

上面程式碼,我們使用isNaN來測試後,發現字串,undefined,甚至對象,結果都回傳真! ! !但是他們不是NaN。

總而言之:isNaN檢測NaN並不可靠! ! !

有一個可靠的並且準確的方法可以檢測NaN。

我們都知道,只有NaN是自己不等自己的,可以用不等於號(!==)來判斷一個數是否等於自身,從而,可以檢測到NaN了,如下:

var a = NaN;
a !== a; // true
var b = "foo";
b !== b; // false
var c = undefined;
c !== c; // false
var d = {};
d !== d; // false
var e = { valueOf: "foo" };
e !== e; // false
登入後複製

我們也可以把這個模式定義成一個函數,如下:

function isReallyNaN(x) {
    return x !== x;
}
登入後複製

#物件的隱式轉換

物件是可以轉換成原始值的,最常見的方法就是把它轉換成字串,如下:

"the Math object: " + Math; // "the Math object: [object Math]"
"the JSON object: " + JSON; // "the JSON object: [object JSON]"
登入後複製

物件轉換成字串是呼叫了他的toSting函數的,你可以手動的呼叫它來檢測一下:

Math.toString(); // "[object Math]"
JSON.toString(); // "[object JSON]"
登入後複製

類似的,物件也是可以轉換成數字的,他是透過value Of函數的,當然,你也可以自訂這個value Of函數,如下:

"J" + { toString: function() { return "S"; } }; // "JS"
2 * { valueOf: function() { return 3; } }; // 6
登入後複製

如果,一個物件同時存在valueOf方法和toString方法,那麼,value Of方法總是會被優先呼叫的,如下:

var obj = {
    toString: function() {
        return "[object MyObject]";
    },
    valueOf: function() {
        return 17;
    }
};
"object: " + obj; // "object: 17"
登入後複製

一般的,盡可能使value Of和toString表示的值相同(儘管類型可以不同)。 

最後一種強制型別轉換,我們常稱為“真值運算”,例如,if, ||, &&,他們的運算元不一定是布林型的額。 JavaScript會透過簡單的轉換規則,將一些非布林類型的值轉換成布林型的。大多數的值都會轉換成true,只有少數的是false,他們分別是:false, 0, -0, "", NaN, null, undefined,因為存在數字和字串以及物件的值為false,所以,直接用真值轉換來判斷一個函數的參數是否傳進來了,這是不不太安全的。例如,有一個可以具有預設值得可選參數的函數,如下:

function point(x, y) {
if (!x) {
    x = 320;
}
if (!y) {
    y = 240;
}
    return { x: x, y: y };
}
登入後複製

這個函數會忽略任何的真值為假的參數的,包括0,-0;

point(0, 0); // { x: 320, y: 240 }
登入後複製

檢測undefined的更準確的方法是用typeof操作:

function point(x, y) {
if (typeof x === "undefined") {
    x = 320;
}
if (typeof y === "undefined") {
    y = 240;
}
    return { x: x, y: y };
}
登入後複製

這種寫法,可以區分開0和undefined的:

point(); // { x: 320, y: 240 }
point(0, 0); // { x: 0, y: 0 }
登入後複製

另外一種方法是利用參數跟undefined作比較,如下:

if (x === undefined) { ... }
登入後複製

總結:

1. 類型錯誤有可能會被型別轉換所隱藏。

2. “ ”既可以表示字串連接,又可以表示算術加,這取決於它的操作數,如果有一個為字串的,那麼,就是字串連接了。

3. 物件透過value Of方法,把自己轉換成數字,透過toString方法,把自己轉換成字串。

4.具有value Of方法的對象,應該定義一個對應的toString方法,用來傳回相等的數字的字串形式。

5.偵測一些未定義的變數時,應該使用type Of或與undefined作比較,而不應該直接用真值運算。

相關推薦:

JS隱式型別轉換總結

隱含轉換如何使用?總結隱含轉換實例用法

簡單介紹JavaScript資料型別之隱式型別轉換_javascript技巧

以上是什麼是隱式型別轉換? js隱式類型轉換的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1430
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
C語言中的隱式型別轉換和顯式型別轉換是什麼? C語言中的隱式型別轉換和顯式型別轉換是什麼? Sep 08, 2023 pm 10:13 PM

將一種資料型別轉換為另一種資料型別稱為型別轉換。隱式類型轉換明確型別轉換隱式型別轉換當運算元具有不同資料型別時,編譯器提供隱式型別轉換。它是由編譯器透過將較小的資料類型轉換為較大的資料類型自動完成的。 inti,x;floatf;doubled;longintl;這裡,上面的表達式最終計算結果為「double」值。範例以下是隱式型別轉換的範例-intx;for(x=97;x<=122;x++){  printf("%c",x);/*Im

mysql存在哪些隱式類型轉換 mysql存在哪些隱式類型轉換 Nov 14, 2023 am 11:28 AM

mysql存在的隱式型別轉換有字串到數值型別、日期和時間型別、浮點數和整數型別、NULL值等。詳細介紹:1、字串到數值類型的隱式類型轉換,當一個字串和一個數值類型的值進行比較或計算時,MySQL會將字串轉換為數值類型;2、日期和時間類型的隱式類型轉換,在MySQL中,日期和時間類型也可以與其他資料類型進行隱式類型轉換;3、浮點數和整數類型的隱式類型轉換等等。

golang函數的型別轉換 golang函數的型別轉換 Apr 19, 2024 pm 05:33 PM

函數中類型轉換允許將一種類型的資料轉換為另一種類型,從而擴展函數的功能。使用語法:type_name:=variable.(type)。例如,可使用strconv.Atoi函數將字串轉換為數字,並處理轉換失敗的錯誤。

C++ 函式預設參數與可變參數的優缺點比較 C++ 函式預設參數與可變參數的優缺點比較 Apr 21, 2024 am 10:21 AM

C++函數中預設參數的優點包括簡化呼叫、增強可讀性、避免錯誤。缺點是限制靈活性、命名限制。可變參數的優點包括無限彈性、動態綁定。缺點包括複雜性更高、隱式型別轉換、除錯困難。

隱式型別轉換:型別的不同變體及其在程式設計中的應用探究 隱式型別轉換:型別的不同變體及其在程式設計中的應用探究 Jan 13, 2024 pm 02:54 PM

探索隱式類型轉換的不同類型及其在程式設計中的作用引言:在程式設計中,我們經常需要處理不同類型的資料。有時候,我們需要將一種資料類型轉換為另一種類型以便進行特定操作或滿足特定要求。在這個過程中,隱式型別轉換是一個非常重要的概念。隱式類型轉換指的是不需要明確指定轉換類型的情況下,程式語言會自動進行資料類型轉換的過程。本文將探討隱式類型轉換的不同類型及其在程式設計中的作用,

c語言中int和float有什麼差別 c語言中int和float有什麼差別 Apr 29, 2024 pm 10:12 PM

C 語言中 int 和 float 變數的差異在於:型別不同:int 用來儲存整數,而 float 用來儲存小數。儲存大小:int 通常佔用 4 個位元組,而 float 也佔用 4 個位元組。精確度:int 表示精確的整數,而 float 的精確度有限。範圍:int 的範圍通常為 -2^31 到 2^31-1,而 float 的範圍較寬。運算:int 和 float 可以進行算術運算和比較,但結果可能受到精確度限制的影響。類型轉換:int 和 float 之間可以進行明確或隱式型別轉換。

mysql索引失效的幾種情況 mysql索引失效的幾種情況 Feb 21, 2024 pm 04:23 PM

常見情況:1、使用函數或運算;2、隱式類型轉換;3、使用不等於(!=或<>);4、使用LIKE操作符,並以通配符開頭;5、OR條件;6、NULL值;7、索引選擇性低;8、複合索引的最左前綴原則;9、優化器決策;10、FORCE INDEX和IGNORE INDEX。

c#和c語言什麼關係 c#和c語言什麼關係 Apr 04, 2024 pm 12:03 PM

C# 和 C 語言之間存在密切關係,包括語法相似性、物件導向程式支援、垃圾回收、類型安全性和平台差異。 C# 繼承了 C 語言的語法和物件導向程式設計的基礎,並對其進行了擴展,包括垃圾回收、類型安全和平台特定性等特性。

See all articles