在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ 為什么 {} + [] == 0, 而 {} + {} == ‘[object

為什么 {} + [] == 0, 而 {} + {} == ‘[object Object][object Object]’

為什么 {} + [] == 0 ?

在將操作符兩邊的參數(shù)當(dāng)作對象的情況下,{} + [] == '[object Object]',但在控制臺下返回的結(jié)果確是 0。
搜過這類的問題,說的是 {} 被當(dāng)做了一個塊級作用域, + 被當(dāng)做了一個一元操作符,將 [] 轉(zhuǎn)化為了number 類型,所以為 0,我能夠理解這種解釋
但為什么 {} + {} 中沒有按照前面模式進(jìn)行處理,+ {} 雖然會得到 NaN, 但是并不會報錯呀,是能夠正常處理的,前面的 {} 為什么沒有被當(dāng)做塊級作用域?

回答
編輯回答
互擼娃

以下是你不知道的 JavaScript(中卷)第五章P102原文:


還有一個坑常被提到(涉及強(qiáng)制類型轉(zhuǎn)換,參見第 4 章):

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

表面上看 + 運算符根據(jù)第一個操作數(shù)([] 或 {})的不同會產(chǎn)生不同的結(jié)果,實則不然。 第一行代碼中,{} 出現(xiàn)在 + 運算符表達(dá)式中,因此它被當(dāng)作一個值(空對象)來處理。第
4 章講過 [] 會被強(qiáng)制類型轉(zhuǎn)換為 "",而 {} 會被強(qiáng)制類型轉(zhuǎn)換為 "[object Object]"。
但在第二行代碼中,{} 被當(dāng)作一個獨立的空代碼塊(不執(zhí)行任何操作)。代碼塊結(jié)尾不需 要分號,所以這里不存在語法上的問題。最后 + [] 將 [] 顯式強(qiáng)制類型轉(zhuǎn)換(參見第 4 章) 為 0。


這個系列對js中亂七八糟的問題都講的很細(xì)

2017年3月21日 00:53
編輯回答
落殤

因為你把{}+{}寫在括號里了
圖片描述

2018年1月8日 10:26
編輯回答
陌璃

我把{}+{}生成了AST結(jié)果如下

{
  "type": "Program",
  "start": 0,
  "end": 5,
  "body": [
    {
      "type": "BlockStatement",
      "start": 0,
      "end": 2,
      "body": []
    },
    {
      "type": "ExpressionStatement",
      "start": 2,
      "end": 5,
      "expression": {
        "type": "UnaryExpression",
        "start": 2,
        "end": 5,
        "operator": "+",
        "prefix": true,
        "argument": {
          "type": "ObjectExpression",
          "start": 3,
          "end": 5,
          "properties": []
        }
      }
    }
  ],
  "sourceType": "module"
}

AST可以看出,第一個{}還是被轉(zhuǎn)化為代碼塊,+為一元運算符,然鵝在chrome的表現(xiàn)中確實是被當(dāng)做算術(shù)運算符處理"[object Object][object Object]",這或許是chrome的特性(胡扯的,我并不知道為什么),在firefox中結(jié)果仍然為NaN。

2017年8月1日 08:10