JavaScript隱式型別轉換_javascript技巧
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; }
OK,NaN的偵測方法就是這麼簡單,我們下面繼續討論物件的隱式轉換!
物件是可以轉換成原始值的,最常見的方法就是把它轉換成字串,如下:
"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]"
類似的,物件也是可以轉換成數字的,他是透過valueOf函數的,當然,你也是可以自訂這個valueOf函數的,如下:
"J" + { toString: function() { return "S"; } }; // "JS" 2 * { valueOf: function() { return 3; } }; // 6
如果,一個物件同時存在valueOf方法和toString方法,那麼,valueOf方法總是會被優先呼叫的,如下:
var obj = { toString: function() { return "[object MyObject]"; }, valueOf: function() { return 17; } }; "object: " + obj; // "object: 17"
但是,多數情況下,這都不是我們想要的,一般的,盡可能使valueOf和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. 物件透過valueOf方法,把自己轉換成數字,透過toString方法,把自己轉換成字串。
4.具有valueOf方法的對象,應該定義一個對應的toString方法,用來傳回相等的數字的字串形式。
5.偵測一些未定義的變數時,應該使用typeOf或與undefined作比較,而不應該直接用真值運算。
關於JavaScript隱式型別轉換就跟大家介紹到這裡,希望對大家有幫助!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

10款趣味橫生的jQuery遊戲插件,讓您的網站更具吸引力,提升用戶粘性!雖然Flash仍然是開發休閒網頁遊戲的最佳軟件,但jQuery也能創造出令人驚喜的效果,雖然無法與純動作Flash遊戲媲美,但在某些情況下,您也能在瀏覽器中獲得意想不到的樂趣。 jQuery井字棋遊戲 遊戲編程的“Hello world”,現在有了jQuery版本。 源碼 jQuery瘋狂填詞遊戲 這是一個填空遊戲,由於不知道單詞的上下文,可能會產生一些古怪的結果。 源碼 jQuery掃雷遊戲

本教程演示瞭如何使用jQuery創建迷人的視差背景效果。 我們將構建一個帶有分層圖像的標題橫幅,從而創造出令人驚嘆的視覺深度。 更新的插件可與JQuery 1.6.4及更高版本一起使用。 下載

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

Matter.js是一個用JavaScript編寫的2D剛體物理引擎。此庫可以幫助您輕鬆地在瀏覽器中模擬2D物理。它提供了許多功能,例如創建剛體並為其分配質量、面積或密度等物理屬性的能力。您還可以模擬不同類型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流瀏覽器。此外,它也適用於移動設備,因為它可以檢測觸摸並具有響應能力。所有這些功能都使其值得您投入時間學習如何使用該引擎,因為這樣您就可以輕鬆創建基於物理的2D遊戲或模擬。在本教程中,我將介紹此庫的基礎知識,包括其安裝和用法,並提供一

本文演示瞭如何使用jQuery和ajax自動每5秒自動刷新DIV的內容。 該示例從RSS提要中獲取並顯示了最新的博客文章以及最後的刷新時間戳。 加載圖像是選擇
