({} + 'b' > {} + 'a')返回值是()

{} + 'b' -> NaN
{} + 'a' -> NaN
{} + 'b' > {} + 'a' -> false  
({} + 'b' > {} + 'a') -> true

请问第三步和第四步是如何得出的呢?

阅读 3.6k
2 个回答

在 javascript 里,只有一个表达式的 statement 叫 ExpressionStatement,它的生成规则是:

ExpressionStatement[Yield, Await]:
   [lookahead ∉ { {, function, async [no LineTerminator here] function, class, let [ }]Expression[+In, ?Yield, ?Await];

这意味着,当一个 statement 以 {, function, async function, class, let [ 开始的时候,这些符号将不被解释成表达式的一部分。

{ 将开启一个 block

function async function 用于函数定义

class 用于类定义

let [ 用于 let [x, y] = z; 形式的变量定义

=============

{}+'a' 中 ,{} 不会被解释为一个空对象(这样{}+'a' 将成为一个表达式,{ 开启了一个 Expression Statement),而是一个空 block。它什么也不做。+'a' 是一个表达式,结果 NaN

{} + 'b' > {} + 'a' 这里第一个 {} 将被解释为一个空 block (同上),但是第二个 {} 并不处在语句的起始,因而会被认为一个空对象,与'a' 相加的结果是 [object Object]aNaN > '[object Object]a' ,结果为 false.

({} + 'b' > {} + 'a') 这时两个 {} 均不处在起始。于是均被解释为空对象。'[obejct Object]b' > '[object Object]a' ,结果为 true 。

{}+'b'
等价于

{
}
+ 'b'

等价于

+ 'b'

结果为数字NaN
({} + 'a')会先把对象转换成字符串再与a拼接,跟前面比较大小,会转换成数字NaNNaNNaN不能比较大小,返回false

情形2把第一个大括号转换成对象了,所以得到两个的字符串比较顺序,前一个大

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题