Javascript基础之-强制类型转换(一)
轉(zhuǎn)換為字符串規(guī)則如下圖代碼:
console.log(String(undefined)); // "undefined" console.log(String(null)); // "null" console.log(String(true)); // "true" console.log(String(+0)); // "0" console.log(String(-0)); // "0" console.log(String(-20)); // "-20" console.log(String(Infinity)); // "Infinity" console.log(String(new Number(123))) // 123 console.log(String(new Object())) // [object Object] console.log(100000000000000000000000000000); // 1e+29大致就是普通其他基本類型轉(zhuǎn)為字符串的話,就直接轉(zhuǎn)為其值的字符串表達(dá)形式,
如果是基本類型的封裝對象,會先拆封,然后再轉(zhuǎn)為字符串,
如果是普通對象,則會調(diào)用其內(nèi)部[class]的值,
如果是極大數(shù)和級小數(shù),將會進(jìn)行一些轉(zhuǎn)化,具體規(guī)則請參考ecma 官方文檔https://www.ecma-internationa...
請思考下面的代碼
var obj = {toString() {return "toString";} } console.log(String(obj)) // toString var obj1 = Object.create(null); obj1.valueOf = function() {return "valueOf"; } console.log(String(obj1)); // valueOf上面這個代碼似乎可以看出,實(shí)際上普通對象轉(zhuǎn)為字符串的過程,似乎就是toString()的一個過程,也就是調(diào)用其內(nèi)部toString()的一個過程
如果toString()沒有咋辦,調(diào)用valueOf,如果這個也沒有呢,就直接報錯了。
轉(zhuǎn)換為數(shù)字的規(guī)則
普通轉(zhuǎn)換為數(shù)字的規(guī)則如下:
console.log(Number(true)); // 1 console.log(Number(0b1101)) // 13 console.log(Number(false)); // 0 console.log(Number("123")); //123 console.log(Number("123a")); //NaN console.log(Number(undefined)); // NaN console.log(Number(null)); // 0不過呢,如果是對象類型的咋辦呢,實(shí)際上同上的一點(diǎn)是,如果是基本類型封裝后的對象,會先拆封,也就是轉(zhuǎn)為基本類型值,然后再轉(zhuǎn)為數(shù)字,比如說
console.log(Number(new String("123123"))); // 123123 console.log(Number([1])); // 1 console.log(Number([1, 3])); // NaN可能你會疑惑,說,為啥數(shù)組只有一個數(shù)據(jù)的時候可以轉(zhuǎn)換,有兩個數(shù)據(jù)的時候就是NaN了呢,原因在這里,看代碼
console.log([1].valueOf()); // [1] console.log([1, 3].valueOf()); // [1, 3] console.log([1].toString()); // 1 console.log([1, 3].toString()); //1, 3可以看到,valueOf沒有返回基本類型值,所以轉(zhuǎn)而使用toString轉(zhuǎn)為基本類型值,這倆字符串再轉(zhuǎn)為數(shù)字的結(jié)果就一目了然了,和上面的是一樣的
那么轉(zhuǎn)為數(shù)字的過程中,valueOf和toString是哪個先執(zhí)行的呢?
看代碼
var a = {valueOf() {return 2;},toString() {return 3;} } var b = {valueOf() {return [1, 3];},toString() {return 3;} } var c = {toString() {return 3;} } var d = Object.create(null); console.log(Number(a)); // 2 console.log(Number(b)); // 3 console.log(Number(c)); // 3 console.log(Number(d)); // Uncaught TypeError: Cannot convert object to primitive value這個其實(shí)就說明了一個問題,就是說對象轉(zhuǎn)數(shù)字的時候,會先找valueOf(),如果valueOf()沒有,或者是說轉(zhuǎn)的是非基本數(shù)據(jù)類型的,將會使用toString(),最后基本類型專成數(shù)字類型的,如果valueOf和toString()都沒有,就直接報錯了
轉(zhuǎn)化為數(shù)字呢,除了以上使用Number(),還可以使用+符號,這個也可以實(shí)現(xiàn)從其他類型轉(zhuǎn)換到字符串
console.log(+"abc"); // NaN console.log(+"1111"); //1111 console.log(+[1]); // 1 var obj = {valueOf() {return "1111";} } console.log(+obj); // 1111如果原數(shù)據(jù)類型是Date,那么可以用Number或者+轉(zhuǎn)為以微秒為單位的unix時間戳
var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" ); console.log(+d); // 1408369986000 console.log(Number(d)); //1408369986000parseInt和Number()的區(qū)別:看例子var a = "123abc"; console.log(+a); // NaN console.log(parseInt(a)); // 123 console.log(parseInt("abc123")); // NaN實(shí)際上,parseInt會從左往右進(jìn)行解析,找到非字符串的時候停止,如果一開始就不可轉(zhuǎn)為數(shù)字,那么就返回NaN
parseInt其他一些坑點(diǎn),這里就不細(xì)說了,想看的,可以找《你不知道的Javascript》了解細(xì)節(jié)
// 0 ("0" 來自于 "0.000008") console.log(parseInt( 0.000008 )); // 8 ("8" 來自于 "8e-7") console.log(parseInt( 0.0000008 )); // 250 ("fa" 來自于 "false") console.log(parseInt( false, 16 )); // 15 ("f" 來自于 "function..") console.log(parseInt( parseInt, 16 )); console.log(parseInt( "0x10" )); // 16 console.log(parseInt( "103", 2 )); // 2轉(zhuǎn)化為布爾值
下面是假值列表,理論上說,除了以下內(nèi)容以外的值都是true
console.log(Boolean(undefined)); console.log(Boolean(null)); console.log(Boolean(false)); console.log(Boolean(+0)); console.log(Boolean(-0)); console.log(Boolean(NaN)); console.log(Boolean(""));這里有一點(diǎn)需要說明,規(guī)范里有提到,所有的對象都是true,所以這方面尤其需要注意的就是下面的例子了
console.log(Boolean(new Boolean(false))); // true console.log(Boolean(new String(""))); // true console.log(Boolean(new Number(0))); // true返回的都是true,雖然他是對假值得封裝,但是他們是對象,是對象就返回true,所以用假值對象或者其他看起來像價值的字符串來進(jìn)行if判斷是不靠譜的
var bObj = new Boolean(false); var a = []; var d = {}; var e = function() {} var f = "false"; var g = "0"; var h = "''"; if (a && d && e && f && g && h) {console.log('all right'); // all right }一般顯式的吧數(shù)據(jù)轉(zhuǎn)為布爾型,除了使用Boolean()以外,還可以使用!!符號,也就是連著反轉(zhuǎn)兩次
console.log(!!undefined); // false console.log(!!new Boolean(false)); // true好了就到這里了,這一次因?yàn)闁|西比較零散,準(zhǔn)備了一陣子,希望大家有所收獲
參考書籍《你不知道的Javascript中卷》
本文轉(zhuǎn)載自http://www.lht.ren/article/5/
總結(jié)
以上是生活随笔為你收集整理的Javascript基础之-强制类型转换(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 配置文档
- 下一篇: leetcode讲解--872. Lea