亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Javascript基礎(chǔ)之-強(qiáng)制類(lèi)型轉(zhuǎn)換(一)

leon / 1645人閱讀

摘要:轉(zhuǎn)換為字符串規(guī)則如下圖代碼大致就是普通其他基本類(lèi)型轉(zhuǎn)為字符串的話(huà),就直接轉(zhuǎn)為其值的字符串表達(dá)形式,如果是基本類(lèi)型的封裝對(duì)象,會(huì)先拆封,然后再轉(zhuǎn)為字符串,如果是普通對(duì)象,則會(huì)調(diào)用其內(nèi)部的值,如果是極大數(shù)和級(jí)小數(shù),將會(huì)進(jìn)行一些轉(zhuǎn)化,具體規(guī)

轉(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

大致就是普通其他基本類(lèi)型轉(zhuǎn)為字符串的話(huà),就直接轉(zhuǎn)為其值的字符串表達(dá)形式,

如果是基本類(lèi)型的封裝對(duì)象,會(huì)先拆封,然后再轉(zhuǎn)為字符串,

如果是普通對(duì)象,則會(huì)調(diào)用其內(nèi)部[class]的值,

如果是極大數(shù)和級(jí)小數(shù),將會(huì)進(jìn)行一些轉(zhuǎn)化,具體規(guī)則請(qǐng)參考ecma 官方文檔https://www.ecma-internationa...

請(qǐng)思考下面的代碼

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

上面這個(gè)代碼似乎可以看出,實(shí)際上普通對(duì)象轉(zhuǎn)為字符串的過(guò)程,似乎就是toString()的一個(gè)過(guò)程,也就是調(diào)用其內(nèi)部toString()的一個(gè)過(guò)程

如果toString()沒(méi)有咋辦,調(diào)用valueOf,如果這個(gè)也沒(méi)有呢,就直接報(bào)錯(cuò)了。

轉(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

不過(guò)呢,如果是對(duì)象類(lèi)型的咋辦呢,實(shí)際上同上的一點(diǎn)是,如果是基本類(lèi)型封裝后的對(duì)象,會(huì)先拆封,也就是轉(zhuǎn)為基本類(lèi)型值,然后再轉(zhuǎn)為數(shù)字,比如說(shuō)

console.log(Number(new String("123123")));   // 123123
console.log(Number([1]));   // 1
console.log(Number([1, 3]));   // NaN

可能你會(huì)疑惑,說(shuō),為啥數(shù)組只有一個(gè)數(shù)據(jù)的時(shí)候可以轉(zhuǎn)換,有兩個(gè)數(shù)據(jù)的時(shí)候就是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沒(méi)有返回基本類(lèi)型值,所以轉(zhuǎn)而使用toString轉(zhuǎn)為基本類(lèi)型值,這倆字符串再轉(zhuǎn)為數(shù)字的結(jié)果就一目了然了,和上面的是一樣的

那么轉(zhuǎn)為數(shù)字的過(guò)程中,valueOf和toString是哪個(gè)先執(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

這個(gè)其實(shí)就說(shuō)明了一個(gè)問(wèn)題,就是說(shuō)對(duì)象轉(zhuǎn)數(shù)字的時(shí)候,會(huì)先找valueOf(),如果valueOf()沒(méi)有,或者是說(shuō)轉(zhuǎn)的是非基本數(shù)據(jù)類(lèi)型的,將會(huì)使用toString(),最后基本類(lèi)型專(zhuān)成數(shù)字類(lèi)型的,如果valueOf和toString()都沒(méi)有,就直接報(bào)錯(cuò)了

轉(zhuǎn)化為數(shù)字呢,除了以上使用Number(),還可以使用+符號(hào),這個(gè)也可以實(shí)現(xiàn)從其他類(lèi)型轉(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ù)類(lèi)型是Date,那么可以用Number或者+轉(zhuǎn)為以微秒為單位的unix時(shí)間戳

var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" );
console.log(+d);    // 1408369986000
console.log(Number(d));   //1408369986000


parseInt和Number()的區(qū)別:看例子

var a = "123abc";
console.log(+a);   // NaN
console.log(parseInt(a));  // 123
console.log(parseInt("abc123"));  // NaN

實(shí)際上,parseInt會(huì)從左往右進(jìn)行解析,找到非字符串的時(shí)候停止,如果一開(kāi)始就不可轉(zhuǎn)為數(shù)字,那么就返回NaN

parseInt其他一些坑點(diǎn),這里就不細(xì)說(shuō)了,想看的,可以找《你不知道的Javascript》了解細(xì)節(jié)

// 0 ("0" 來(lái)自于 "0.000008")
console.log(parseInt( 0.000008 ));
// 8 ("8" 來(lái)自于 "8e-7")
console.log(parseInt( 0.0000008 )); 
// 250 ("fa" 來(lái)自于 "false")
console.log(parseInt( false, 16 ));
// 15 ("f" 來(lái)自于 "function..")
console.log(parseInt( parseInt, 16 )); 
console.log(parseInt( "0x10" )); // 16
console.log(parseInt( "103", 2 )); // 2



轉(zhuǎn)化為布爾值

下面是假值列表,理論上說(shuō),除了以下內(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)需要說(shuō)明,規(guī)范里有提到,所有的對(duì)象都是true,所以這方面尤其需要注意的就是下面的例子了

console.log(Boolean(new Boolean(false)));  // true
console.log(Boolean(new String("")));  // true
console.log(Boolean(new Number(0)));  // true

返回的都是true,雖然他是對(duì)假值得封裝,但是他們是對(duì)象,是對(duì)象就返回true,所以用假值對(duì)象或者其他看起來(lái)像價(jià)值的字符串來(lái)進(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()以外,還可以使用!!符號(hào),也就是連著反轉(zhuǎn)兩次

console.log(!!undefined);  // false
console.log(!!new Boolean(false));  // true



好了就到這里了,這一次因?yàn)闁|西比較零散,準(zhǔn)備了一陣子,希望大家有所收獲

參考書(shū)籍《你不知道的Javascript中卷》

本文轉(zhuǎn)載自http://www.lht.ren/article/5/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/100561.html

相關(guān)文章

  • Javascript基礎(chǔ)-強(qiáng)制類(lèi)型轉(zhuǎn)換(三)

    摘要:抽象相等和嚴(yán)格相等。首先,也是如果有對(duì)象的話(huà),會(huì)把對(duì)象轉(zhuǎn)為基本類(lèi)型值,在進(jìn)行比較。 這一節(jié),應(yīng)該算是強(qiáng)制類(lèi)型轉(zhuǎn)換的最后一個(gè)小節(jié)了,這一部分呢,主要會(huì)講比較操作中遇到的強(qiáng)制類(lèi)型轉(zhuǎn)換。 抽象相等(==)和嚴(yán)格相等(===)。 簡(jiǎn)單且粗略的來(lái)說(shuō),抽象相等和嚴(yán)格相等的區(qū)別就是抽象相等在比較的時(shí)候,如果比較的兩個(gè)數(shù)類(lèi)型不同,會(huì)先進(jìn)行類(lèi)型轉(zhuǎn)換再比較,而嚴(yán)格類(lèi)型呢,比較簡(jiǎn)單粗暴一些,直接返回fals...

    GeekGhc 評(píng)論0 收藏0
  • Javascript基礎(chǔ)-強(qiáng)制類(lèi)型轉(zhuǎn)換(二)

    摘要:所以無(wú)論還是都會(huì)進(jìn)行類(lèi)型轉(zhuǎn)換,唯一的區(qū)別,就是會(huì)置否而不會(huì)。這時(shí)候,肯定會(huì)有人問(wèn),假如說(shuō)我有其他的數(shù)據(jù)類(lèi)型呢,又不是數(shù)字又不是字符串,比如說(shuō)數(shù)組啊,對(duì)象啊,布爾值啥的,那么如果是引用數(shù)據(jù)類(lèi)型,則先轉(zhuǎn)為基本數(shù)據(jù)類(lèi)型,再進(jìn)行比較。 上一章主要講了轉(zhuǎn)換到數(shù)字,字符串和布爾類(lèi)型的一些知識(shí)點(diǎn),那么這一講接著上面的繼續(xù)講。 思考下面這個(gè)問(wèn)題: console.log(+123); // 123 ...

    kk_miles 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)總結(jié)(基礎(chǔ)部分

    摘要:前綴規(guī)范每個(gè)局部變量都需要有一個(gè)類(lèi)型前綴,按照類(lèi)型可以分為表示字符串。例如,表示以上未涉及到的其他對(duì)象,例如,表示全局變量,例如,是一種區(qū)分大小寫(xiě)的語(yǔ)言。布爾值與字符串相加將布爾值強(qiáng)制轉(zhuǎn)換為字符串。 基本概念 javascript是一門(mén)解釋型的語(yǔ)言,瀏覽器充當(dāng)解釋器。js執(zhí)行時(shí),在同一個(gè)作用域內(nèi)是先解釋再執(zhí)行。解釋的時(shí)候會(huì)編譯function和var這兩個(gè)關(guān)鍵詞定義的變量,編譯完成后從...

    AlanKeene 評(píng)論0 收藏0
  • JavaScript 需要檢查變量類(lèi)型

    摘要:一返回值調(diào)用外部方法獲取的值需要對(duì)類(lèi)型做判斷,因?yàn)槲覀儗?duì)方法返回的值是有期望值類(lèi)型,但是卻不能保證這個(gè)接口返回的值一直是同一個(gè)類(lèi)型。 19年目標(biāo):消滅英語(yǔ)!我新開(kāi)了一個(gè)公眾號(hào)記錄一個(gè)程序員學(xué)英語(yǔ)的歷程 有提升英語(yǔ)訴求的小伙伴可以關(guān)注公眾號(hào):csenglish 程序員學(xué)英語(yǔ),每天花10分鐘交作業(yè),跟我一起學(xué)英語(yǔ)吧 javascript作為一門(mén)動(dòng)態(tài)類(lèi)型語(yǔ)言,具有很高的動(dòng)態(tài)靈活性,當(dāng)定義函數(shù)...

    Songlcy 評(píng)論0 收藏0
  • 從hello world看JavaScript隱藏的黑魔法

    摘要:如果類(lèi)型轉(zhuǎn)換你還不是很了解,可以先讀下這篇來(lái)理解一下從看隱式強(qiáng)制轉(zhuǎn)換機(jī)制。函數(shù)可對(duì)通過(guò)編碼的字符串進(jìn)行解碼。而作者封裝的也是基于這兩者來(lái)實(shí)現(xiàn)輸出黑魔法字符串的。同時(shí)通過(guò),返回了一個(gè)匿名函數(shù)形成了閉包。為了達(dá)到裝逼的效果。 寫(xiě)在最前 事情的起因是這段看起來(lái)不像代碼的代碼: showImg(https://segmentfault.com/img/remote/14600000126810...

    cnio 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<