摘要:顯示的調用轉換過程稱為顯式強制類型轉換,隱式的情況稱為隱式強制類型轉換。隱式強制類型轉換讓代碼變得晦澀難懂而又便捷而奇妙。事實上,允許在比較中進行強制類型轉換,而不允許。如果有并且返回基本類型值,就使用該值進行強制類型轉換。
JavaScript是一種非常靈活的現代編程語言,靈活到使用者極其容易被忽視的它那廣闊的世界以及它帶給我們的無限遐想空間。本文將對JavaScript最最基礎也最容易被忽視的數據類型問題和類型轉換問題進行探索。 數據類型
眾所周知,JavaScript有8種內置數據類型:string,number,boolean,object,null,undefined,function,symbol(來自ES規范)。
除了object外,我們通常稱其他類型為基本類型(typeof null 的運算結果是"object",有些人認為這是個由來已久的‘bug’)。基本類型可以想對象一樣產生直接調用類型方法(如果有的話),如4.toFixed,"hello".split("l")等。
typeof sd;//"undefined" var a = 3; typeof a; // "number" a = true; typeof a; // "boolean" typeof typeof 42; // "string" typeof function a(){ /* .. */ } // "function" typeof {a:12,b:2};//"object" typeof [121,2324];//"object" typeof null ;//"object"利用typeof 運算符安全的檢查變量是否定義
//檢查變量 // 這樣會拋出錯誤ReferenceError if (testObject) { console.log( "defined" ); } // 這樣是安全的 if (typeof DEBUG !== "undefined") { console.log( "defined" ); }類型轉換
類型轉換(type casting)指的是將值從一種類型轉換為另一種類型。顯示的調用轉換過程稱為顯式強制類型轉換,隱
式的情況稱為隱式強制類型轉換(coercion)。但是坦白說,你知道,就是顯示,你不知道,便是隱式。
顯式強制類型轉換旨在讓代碼更加清晰易讀
//這里為什么多了個"."?不加點(12.toString())js會認為12.是一個數字整體,故而報語法錯誤(SyntaxError) 12..toString();//"12" var num = 120;//"120" Number("012");//12 parseInt("012.3asd88")//12;注意,parseInt返回Str[0]開始的有效數字字符組成的數字 parseFloat("012.3asd88")//12.3; Boolean(10);//true Boolean(new Boolean);//true;注意哦,這里會返回true隱式類型轉換
這是一種簡化的語法,編譯器為了我們方便(可能吧),在這方面幫我們做了很多事。
隱式強制類型轉換是隱蔽的強制類型轉換,而你自己覺得不夠明顯的強制類型轉換都可以算作隱式強制類型轉換。隱式強制類型轉換讓代碼變得晦澀難懂而又‘便捷而奇妙’。
+new Date();//1564536588540;== new Date().valueOf(); "12" + 1;//"121" false - 1;//-1 false - "1";//-1 false + "1";//"false1" [1,2,3] + "";//"1,2,3" if(0 /*false*/){} if([] /*true*/){}讓人困惑的求等:==和===(寬松相等和嚴格相等)詳解
JavaScript 中,判斷兩個值是否“相等”可以用寬松相等(loose equals) == 和嚴格相等(strict equals) === 。但是在判斷條件上它們有一個很重要的區別。 不少人認為“ == 檢查值是否相等, === 檢查值和類型是否相等”。然而還不夠準確。很多 JavaScript 的書籍和博客也是這樣來解釋 的,但是很遺憾他們都錯了。 事實上,== 允許在比較中進行強制類型轉換,而 === 不允許。 這幾個情況需要注意:
? null == 0;//false;null 除了null 和undefined,與null或undefined執行==都會得false ? [] == ![];//true;意外吧! ? false == []; // true ? "" == 0; // true ? "" == []; // true ? 0 == []; // true ? NaN === NaN;//false;NaN不等于NaN,不論嚴不嚴格 ? +0 === -0; //true; ? "0" == false; // true ? 42 == "43"; // false ? "foo" == 42; // false ? "true" == true; // false ? 42 == "42"; // true ? "foo" == [ "foo" ]; // true
根據ECMA規范,模糊相等計算‘==’一般是以下四種情況或者其組合:
var a = *; var b = *; a === b; a == b;
字符串和數字之間的相等比較
ES5 規范 11.9.3.4-5 這樣定義:
(1) 如果 Type(x) 是數字, Type(y) 是字符串,則返回 x == ToNumber(y)
的結果。
(2) 如果 Type(x) 是字符串, Type(y) 是數字,則返回 ToNumber(x) == y
的結果。
其他類型和布爾類型之間的相等比較
ES5 規范 11.9.3.6-7 :
(1) 如果 Type(x) 是布爾類型,則返回 ToNumber(x) == y 的結果;
(2) 如果 Type(y) 是布爾類型,則返回 x == ToNumber(y) 的結果。
null 和 undefined 之間的相等比較
ES5 規范 11.9.3.2-3 :
(1) 如果 x 為 null , y 為 undefined ,則結果為 true 。
(2) 如果 x 為 undefined , y 為 null ,則結果為 true 。
對象和非對象之間的相等比較
ES5 規范 11.9.3.8-9 :
(1) 如果 Type(x) 是字符串或數字, Type(y) 是對象,則返回 x == ToPrimitive(y)的結果;
(2) 如果 Type(x) 是對象, Type(y) 是字符串或數字,則返回 ToPromitive(x) == y的結果。
抽象操作 ToPrimitive (參見 ES5 規范 9.1 節)是為了求對象的‘值’,它首先(通過內部操作 DefaultValue ,參見 ES5 規范 8.12.8 節)檢查該值是否有 valueOf() 方法。
如果有并且返回基本類型值,就使用該值進行強制類型轉換。如果沒有就使用 toString()的返回值(如果存在)來進行強制類型轉換。
如果 valueOf() 和 toString() 均不返回基本類型值,會產生 TypeError 錯誤。
注意,對 == 兩邊的值認真推敲,為了避開不必要的錯誤,我們可以遵循兩個原則。
? 如果兩邊的值中有 true 或者 false ,千萬不要使用 == 。 ? 如果兩邊的值中有 [] 、 "" 或者 0 ,盡量不要使用 == 。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106214.html
摘要:我們再來回顧下文首提出的這個比較運算,首先為對象,則調用函數將其轉化為字符串對于右側的,首先會進行顯式類型轉換,將其轉化為。 JavaScript 運算符規則與隱式類型轉換詳解 從屬于筆者的現代 JavaScript 開發:語法基礎與工程實踐系列文章,主要探討 JavaScript 中令人迷惑的加減乘除與比較等常見運算中的規則與隱式類型轉換;本文中涉及的參考資料全部聲明在了JavaSc...
摘要:我們再來回顧下文首提出的這個比較運算,首先為對象,則調用函數將其轉化為字符串對于右側的,首先會進行顯式類型轉換,將其轉化為。 JavaScript 運算符規則與隱式類型轉換詳解 從屬于筆者的現代 JavaScript 開發:語法基礎與工程實踐系列文章,主要探討 JavaScript 中令人迷惑的加減乘除與比較等常見運算中的規則與隱式類型轉換;本文中涉及的參考資料全部聲明在了JavaSc...
摘要:所謂裝箱轉換,正是把基本類型轉換為對應的對象,他是類型轉換中一種相當重要的種類。拆箱轉換在標準中,規定了函數,它是對象類型到基本類型的轉換即,拆箱轉換。拆箱轉換會嘗試調用和來獲得拆箱后的基本類型。 JavaScript隱式類型轉換 基本數據類型 ECMAScript 一共定義了七種 build-in types,其中六種為 Primitive Value,Null, Undefined...
摘要:基本數據類型中有種簡單數據類型也稱基本數據類型,,,和。不支持任何創建自定義類型的機制,而所有值都是上述中數據類型之一。 基本數據類型 ECMAScript中有5種簡單數據類型(也稱基本數據類型):Undefined,Null,Boolean,Number和String。還有一種復雜數據類型(引用型)Object。ECMAScript不支持任何創建自定義類型的機制,而所有值都是上述6中...
摘要:項目地址前言大數據技術棧思維導圖大數據常用軟件安裝指南一分布式文件存儲系統分布式計算框架集群資源管理器單機偽集群環境搭建集群環境搭建常用命令的使用基于搭建高可用集群二簡介及核心概念環境下的安裝部署和命令行的基本使用常用操作分區表和分桶表視圖 項目GitHub地址:https://github.com/heibaiying... 前 言 大數據技術棧思維導圖 大數據常用軟件安裝指...
閱讀 2875·2019-08-30 15:44
閱讀 1901·2019-08-29 13:59
閱讀 2848·2019-08-29 12:29
閱讀 1095·2019-08-26 13:57
閱讀 3207·2019-08-26 13:45
閱讀 3339·2019-08-26 10:28
閱讀 841·2019-08-26 10:18
閱讀 1698·2019-08-23 16:52