国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Javascript中的+運(yùn)算符

guqiu / 2170人閱讀

摘要:在網(wǎng)上或面試題中經(jīng)常會(huì)看到一些奇怪的語(yǔ)句,比如在中運(yùn)算符是個(gè)重載運(yùn)算符,可用來(lái)拼接字符串,以及把兩個(gè)數(shù)字相加。至于是哪種情況要看運(yùn)算符兩邊參數(shù)的類型。如何轉(zhuǎn)換在規(guī)范中有詳細(xì)的說(shuō)明,但規(guī)范看起來(lái)是有點(diǎn)費(fèi)勁。不過(guò)目前的知識(shí)足夠回答原先的問(wèn)題了。

在網(wǎng)上或面試題中經(jīng)常會(huì)看到一些“奇怪”的語(yǔ)句,比如

{}+{}
// "[object Object][object Object]"

{}+[]
// 0

[]+{}
// "[object Object]"

[]+[]
// ""

在Javascript中+運(yùn)算符是個(gè)重載運(yùn)算符,可用來(lái)拼接字符串,以及把兩個(gè)“數(shù)字”相加。至于是哪種情況要看運(yùn)算符兩邊參數(shù)的類型。
在日常的開發(fā)中我們也不會(huì)碰到這么麻煩的事,但弄弄清楚總是好的。在規(guī)范 中巴拉巴拉地說(shuō)了一堆,簡(jiǎn)單來(lái)說(shuō)就是:

1. 對(duì)于原生類型,參數(shù)中只要有一方是字符串,則按字符串連接處理,否則按數(shù)字相加處理,不是數(shù)字的會(huì)先轉(zhuǎn)成數(shù)字再相加。

原生類型有:undefined, null, boolean, number, string。

下面是一些示例:

0 + "1"     // "01"
null + 1    // 1
true + 1    // 2
false + 1   // 0
undefined + 2   // NaN,  因?yàn)閡ndefined轉(zhuǎn)成Number是NaN

2. 對(duì)于引用類型,則需要先轉(zhuǎn)換成原生類型,再按以上規(guī)則相加。如何轉(zhuǎn)換在規(guī)范中有詳細(xì)的說(shuō)明,但規(guī)范看起來(lái)是有點(diǎn)費(fèi)勁。 簡(jiǎn)單來(lái)說(shuō)就是:默認(rèn)情況下都轉(zhuǎn)化成字符串,要搞特殊的話,請(qǐng)重寫valueOf()方法。

來(lái)個(gè)例子:

function Complex(a, b) {
  this.a = a;
  this.b = b;
}

Complex.prototype.valueOf() {
  return this.a;
}

new Complex(2, 3) + new Complex(4, 5);
// 6

但由于Js不支持真正的操作符重載,即不能相加得到自定義類型的對(duì)象, 所以以上示例在實(shí)踐代碼中非常少用。

不過(guò)目前的知識(shí)足夠回答原先的問(wèn)題了。但是慢著,{}+[] 為什么和 []+{}不一樣? 這其實(shí)是個(gè)語(yǔ)法問(wèn)題。前者相當(dāng)于:

{}
+[]

其實(shí)是兩個(gè)句子, [] 轉(zhuǎn)換成數(shù)字是 0。很容易驗(yàn)證 ({}+[]) === "[object Object]"

+[]  // 0

有人可能要問(wèn),那 new Date()valueOf() 不是轉(zhuǎn)換成數(shù)字嗎?為什么相加結(jié)果還是字符串類型呢?

new Date().valueOf();
// 1491904757087

1 + new Date();
// "1Tue Apr 11 2017 18:02:16 GMT+0800 (CST)"

這是Date類做了特殊處理, @@toPrimitive, 默認(rèn)情況下對(duì) Date 的相加以字符串方式連接,但比較時(shí)則會(huì)轉(zhuǎn)換成數(shù)字。

new Date() < new Date("2018-01-01")
// true, 現(xiàn)在是2017

將引用類型轉(zhuǎn)換成原生類型在很多操作符中都有用到,比如 <, >, 所以有必要對(duì)其研究一番, 以下js代碼大概描述了其行為。

/**
 * @param input     即要轉(zhuǎn)換的對(duì)象
 * @preferredType   期望轉(zhuǎn)換成的類型,可以是string或number
 */
function ToPrimitive(input, preferredType) {
  if (typeof input !== "object") {
    return input;   // 本來(lái)就是原生類型
  }

  var hint = preferredType || "default";
  if (typeof input["@@toPrimitive"] === "function") {   // @@toPrimitive是個(gè)內(nèi)部方法,這里只是示例說(shuō)明其工作原理
    return input["@@toPrimitive"](input, hint);   // 這就是為什么Date能特殊處理的原因
  }

  if (hint === "string") {
    return input.toString();
  }

  return input.valueOf();
}

詳細(xì)的請(qǐng)參考規(guī)范

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82470.html

相關(guān)文章

  • JavaScript 中的強(qiáng)制類型轉(zhuǎn)換

    摘要:完整清單是中添加,此處不予介紹布爾值用來(lái)表示可能是真或假的值。結(jié)果抽象比較運(yùn)算符在比較它們之前在類型之間進(jìn)行自動(dòng)轉(zhuǎn)換。中的隱式轉(zhuǎn)換稱為強(qiáng)制類型轉(zhuǎn)換,并在規(guī)范中定義。這些內(nèi)置類型可用于在不同類型之間進(jìn)行顯式轉(zhuǎn)換。 翻譯:瘋狂的技術(shù)宅原文:https://www.valentinog.com/bl... 本文首發(fā)微信公眾號(hào):前端先鋒歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 show...

    endiat 評(píng)論0 收藏0
  • 學(xué)習(xí)React之前你需要知道的的JavaScript基礎(chǔ)知識(shí)

    摘要:和類在開始時(shí)遇到類組件,只是需要有關(guān)類的基礎(chǔ)。畢竟,中的條件呈現(xiàn)僅再次顯示大多數(shù)是而不是特定的任何內(nèi)容。 在我的研討會(huì)期間,更多的材料是關(guān)于JavaScript而不是React。其中大部分歸結(jié)為JavaScript ES6以及功能和語(yǔ)法,但也包括三元運(yùn)算符,語(yǔ)言中的簡(jiǎn)寫版本,此對(duì)象,JavaScript內(nèi)置函數(shù)(map,reduce,filter)或更常識(shí)性的概念,如:可組合性,可重用...

    bitkylin 評(píng)論0 收藏0
  • 深入理解javascript中的立即執(zhí)行函數(shù)(function(){…})()

    摘要:要理解立即執(zhí)行函數(shù),需要先理解一些函數(shù)的基本概念。函數(shù)表達(dá)式使用關(guān)鍵字聲明一個(gè)函數(shù),但未給函數(shù)命名,最后將匿名函數(shù)賦予一個(gè)變量,叫函數(shù)表達(dá)式,這是最常見的函數(shù)表達(dá)式語(yǔ)法形式。 javascript和其他編程語(yǔ)言相比比較隨意,所以javascript代碼中充滿各種奇葩的寫法,有時(shí)霧里看花,當(dāng)然,能理解各型各色的寫法也是對(duì)javascript語(yǔ)言特性更進(jìn)一步的深入理解。 ( functio...

    melody_lql 評(píng)論0 收藏0
  • JavaScript 編程精解 中文第三版 一、值,類型和運(yùn)算符

    摘要:來(lái)源編程精解中文第三版翻譯項(xiàng)目原文譯者飛龍協(xié)議自豪地采用谷歌翻譯部分參考了編程精解第版在機(jī)器的表面之下,程序在運(yùn)轉(zhuǎn)。本章將會(huì)介紹程序當(dāng)中的基本元素,包括簡(jiǎn)單的值類型以及值運(yùn)算符。示例中的乘法運(yùn)算符優(yōu)先級(jí)高于加法。 來(lái)源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Values, Types, and Operators 譯者:飛龍 協(xié)議:CC BY-NC...

    wh469012917 評(píng)論0 收藏0
  • Javascript語(yǔ)句 - Javascript語(yǔ)法基礎(chǔ) - Javascript核心

    摘要:多數(shù)運(yùn)算符都是由標(biāo)點(diǎn)符號(hào)表示,比如和。通常會(huì)根據(jù)需要對(duì)操作數(shù)進(jìn)行類型轉(zhuǎn)換左值是一個(gè)古老的屬于,它是指表達(dá)式只能出現(xiàn)在賦值運(yùn)算符的左側(cè)。也稱為嚴(yán)格相等運(yùn)算符,它用來(lái)檢測(cè)兩個(gè)操作數(shù)是否嚴(yán)格相等。運(yùn)算符的檢測(cè)規(guī)則是和運(yùn)算符的求反。 源代碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/...

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

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

0條評(píng)論

guqiu

|高級(jí)講師

TA的文章

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