【问题标题】:Problems with adding object with array用数组添加对象的问题
【发布时间】:2012-04-29 22:15:20
【问题描述】:

video 的启发,我用{}+[] 测试了进一步

测试 1:

typeof {}+[]  //"object"

好的,所以{}+[]object

测试 2:

var crazy = {}+[];
typeof crazy  //"string"

什么? {}+[] 不是 object 吗?为什么现在是string

测试 3:

console.log({}+[])

我得到了什么:

所以它是number!... 不是吗?

那么{}+[]的类型究竟是什么??

更新

致那些说{}+[] 是空字符串的人:

{}+[] === ""     //false
({}+[]) === ""   //false
({};+[]) === ""  //SyntaxError
({}+[]).length   //15

JavaScript 太难理解了...

【问题讨论】:

  • 我认为在test1中,typeof找到第一个参数的类型-> {},它是一个对象,试试typeof ({}+[])这个,它是字符串。
  • @pcamal,那么它是数字还是字符串? (认为​​{}+[] 会是object,因为它们都是。)
  • 关于您的更新:{}+[] === "" 被评估为{}; +[] === "";,即空块和+[] === ""{}+[] === 0 产生 true
  • JavaScript 太难理解了:嗯,那是因为你是模棱两可的 ;) 当在 {}+[] === "" 中遇到 {} 时,解析器不知道 {} 是否应该表示对象字面量或块。由于这不在表达式上下文中,{} 被解释为块(默认行为)。括号(...)强制将评估作为表达式。
  • 我刚刚添加了这个以表明{}+[] 行被解释为两个语句而不是一个语句。但由于 JavaScript 具有自动分号插入功能,它实际上可能会这样做。为什么?因为如果某些语法不明确,则必须决定如何解释它。在这种情况下,开发人员决定将{}+[] 解释为blockunary plusarray,而不是objectaddition operatorarray。你可能不同意这一点,但事实就是这样:)

标签: javascript


【解决方案1】:

{}+[] 的类型可能因上下文而异。

  1. typeof {}+[] //"object"
    在这种情况下,根据运算符优先级,typeof {} 的计算结果为“对象”,+[] 添加一个空字符串(数组被强制转换为字符串),因此结果为“对象”。
    您可以考虑检查typeof ({}+[])(您的第二种情况)。

  2. var crazy = {}+[]; typeof crazy //"string"
    在这种情况下,您要添加对象和数组 - 它们都强制转换为字符串,因此 typeof 返回“字符串”。

  3. {}+[]
    这被解释为空代码块、一元加号和空数组。 第一部分什么都不做,数组被转换为它的元素的逗号分隔字符串(空数组为空字符串),然后转换为一个数字(空字符串被转换为 0),因此0

更新

  • {}+[] === "" //false
    见#3,{} 被解释为一个块,你在左边得到0
    比较{}+[] === 0 // true

  • ({}+[]) === "" //false
    参见 #1,{} 被解释为对象字面量。尝试添加数组和对象时,它们都转换为字符串,"[object Object]" 表示对象,空字符串表示数组。因此,您会在左侧看到"[object Object]"
    比较({}+[]) === "[object Object]" // true

  • ({};+[]) === "" //SyntaxError
    我想,这个是不言自明的:)

  • ({}+[]).length //15
    15 正好是"[object Object]" 的长度,见上文。

【讨论】:

  • @Derek:因为+""0。 @Li0liQ:顺便说一句,字符串 not 转换为等于字符串长度的数字。 +"abc" 返回 NaN。一元加号如何转换字符串在规范中定义。
  • 是的,控制台中的({}+[]) 会给你对象。
  • @Felix Kling 感谢您的评论,确实,数组被转换为以逗号分隔的值列表,或者在空数组的情况下转换为空字符串。空字符串转换为 0。
【解决方案2】:
var f = {}+[];
console.log(f==="[object Object]")

这将记录true,因为当您将{}+[] 分配给var 时,它会使用它的toString() 方法将其转换为字符串...在这种情况下返回“[object Object]”(即15 个字母长 - 以及 length=15 的来源)

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 2015-06-17
    • 2022-01-24
    • 2017-09-01
    • 1970-01-01
    • 2019-12-03
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多