{} + 'b' -> NaN
{} + 'a' -> NaN
{} + 'b' > {} + 'a' -> false
({} + 'b' > {} + 'a') -> true
请问第三步和第四步是如何得出的呢?
{} + 'b' -> NaN
{} + 'a' -> NaN
{} + 'b' > {} + 'a' -> false
({} + 'b' > {} + 'a') -> true
请问第三步和第四步是如何得出的呢?
{}+'b'
等价于
{
}
+ 'b'
等价于
+ 'b'
结果为数字NaN
({} + 'a')
会先把对象转换成字符串再与a
拼接,跟前面比较大小,会转换成数字NaN
,NaN
与NaN
不能比较大小,返回false
情形2把第一个大括号转换成对象了,所以得到两个的字符串比较顺序,前一个大
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
在 javascript 里,只有一个表达式的 statement 叫 ExpressionStatement,它的生成规则是:
这意味着,当一个 statement 以
{
,function
,async function
,class
,let [
开始的时候,这些符号将不被解释成表达式的一部分。{
将开启一个 blockfunction
async function
用于函数定义class
用于类定义let [
用于let [x, y] = z;
形式的变量定义=============
{}+'a'
中 ,{}
不会被解释为一个空对象(这样{}+'a'
将成为一个表达式,{
开启了一个 Expression Statement),而是一个空 block。它什么也不做。+'a'
是一个表达式,结果NaN
。{} + 'b' > {} + 'a'
这里第一个{}
将被解释为一个空 block (同上),但是第二个{}
并不处在语句的起始,因而会被认为一个空对象,与'a'
相加的结果是[object Object]a
。NaN > '[object Object]a'
,结果为 false.({} + 'b' > {} + 'a')
这时两个{}
均不处在起始。于是均被解释为空对象。'[obejct Object]b' > '[object Object]a
' ,结果为 true 。