返回信息流请解释下面表达式为什么是相应的值?
[] + [] # "" 空字符串。注意:不是空数组。
[] + {} # "[object Object]" 字符串,内容是[object Object]
+[] # 0 零。注:+是“正”号,比如+1, +2
+{} # NaN
Array(4).toString() # ",,," 由三个逗号组成的字符串
Array(4).join("foo").toString() # "foofoofoo"
Array(4).join("foo"+1).toString() # "foo1foo1foo1"
Array(9).join("foo"-1) + "Batman!" # "NaNNaNNaNNaNNaNNaNNaNNaNBatman!"
参考:
附件(1.8MB) _na_na_na_na_na_na_na_na_na_na_na..._BATMAN!-EtoMN_xi-AM.mkv
来源:https://www.destroyallsoftware.com/talks/wat
这是一条镜像帖。来源:北邮人论坛 / java-script / #6同步于 2016/9/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
JavaScript机器人发帖
恭喜开板。顺便黑一下JavaScript
nuanyangyang
2016/9/8镜像同步18 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
小菜鸟试着答一答后面四个,巩固一下刚学的知识点~[ema3]
Array调用toString()方法时,会先调用数组中每一项元素的toString()方法,然后调用join()方法进行拼接。如果某一项的值是null或者undefined,则其toString方法返回空字符串。join的默认参数是',',如果传的是非字符串,则会先将其转化为字符串(猜测是String()转的,因为传null时转化为字符串‘null',如果是toString()的话,那么传null会出错)。
Array(4).toString() # 四个元素均为undefined,返回四个空字符串,再用‘,'拼接,因此',,,'
Array(4).join("foo").toString() # "foofoofoo" 调用join时,也会先调用各自元素的toString,再进行字符串拼接。Array(4).join("foo")返回字符串’foofoofoo'。字符串再调用toString()则返回与自身相同的一个副本。
Array(4).join("foo"+1).toString() # "foo1foo1foo1"大致同上一个,不过是在为join传参时有所改变,这里的+是字符串拼接,因此传的参数是'join1'。
Array(9).join("foo"-1) + "Batman!" # "NaNNaNNaNNaNNaNNaNNaNNaNBatman!" join传参时,传的参数是‘foo'-1。'foo'-1会先将'foo'转化为number类型,转化结果为NaN。NaN与任何数进行减法运算的结果都是NaN。因此join的实际参数是’NaN‘。
有错误欢迎指正~
6楼给出了后四个。我给出前四个。
首先相加的步骤,是将两个操作数都转为原始值。先转换左边再转换右边的。
如果二者任一为字符串那么另外一个也转成字符串,然后返回两个字符串拼接的结果。
否则将它们转成数字类型,返回它们的和。
1.[] + [] = ""
这是两个空数组的相加,左边的数组首先转成原始值->[]-toString()->"",右边也一样,于是就变成"" + "" =""
2.[] + {} = "[object object]".左边的数组转成了->""这样的字符串,右边由于是个空对象,所以也需要转成字符串,于是转成了"[object object]",于是就变成了 "" + "[object object]" = "[object object]"
3.+[] = 0
此处的+号是一元操作符,目的是将后面的操作数转成数字。也即Number([])->Number([].toString)->Number("")=0
4.+{} = NaN
同理,由于空对象无法转成数字,所以输出NaN。
也即Number({})->Number({}.toString)->Number("[Object Object]")=NaN