面试题答案
一键面试- 分析代码各部分及隐式类型转换步骤:
!![]
:[]
是一个空数组,在JavaScript中,空数组是真值,所以![]
为false
(因为!
是取反操作,将真值转换为假值)。- 再进行一次
!
操作,即!![]
,就将false
又取反为true
。在隐式类型转换为字符串时,true
会转换为字符串"true"
。
[]
:- 当与其他非数组类型通过
+
运算符连接时,空数组会隐式转换为字符串""
。
- 当与其他非数组类型通过
!{}
:{}
是一个空对象,在JavaScript中,对象是真值,所以!{}
为false
。在隐式类型转换为字符串时,false
会转换为字符串"false"
。
{}
:- 当对象与其他类型通过
+
运算符连接时,会先调用toString
方法。{}.toString()
返回"[object Object]"
。
- 当对象与其他类型通过
[]
:- 再次出现的空数组,同样隐式转换为字符串
""
。
- 再次出现的空数组,同样隐式转换为字符串
null
:- 当
null
与其他类型通过+
运算符连接时,会隐式转换为字符串"null"
。
- 当
(1,0)
:- 这是一个逗号表达式,逗号表达式会返回最后一个表达式的值,所以
(1,0)
的值为0
。在与其他类型通过+
运算符连接时,0
会隐式转换为字符串"0"
。
- 这是一个逗号表达式,逗号表达式会返回最后一个表达式的值,所以
undefined
:- 当
undefined
与其他类型通过+
运算符连接时,会隐式转换为字符串"undefined"
。
- 当
(function(){}))
:- 函数对象与其他类型通过
+
运算符连接时,会先调用toString
方法,(function(){}).toString()
返回"function (){}"
。
- 函数对象与其他类型通过
- 最终输出结果:
- 将上述各部分转换后的字符串连接起来,得到:
"true" + "" + "false" + "[object Object]" + "" + "null" + "0" + "undefined" + "function (){}"
- 结果为:
"truefalse[object Object]null0undefinedfunction (){}"
- 将上述各部分转换后的字符串连接起来,得到:
所以,console.log(!![] + [] + !{} + {} + [] + null + (1,0) + undefined + (function(){}))
的输出结果是"truefalse[object Object]null0undefinedfunction (){}"
。