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