1. (+'b') + 'a'
这个表达式使用了一些JS中的类型转换。首先,+'b'将'b'作为数字转换。由于'b'不是一个数字,因此这将返回NaN(非数字)。然后,NaN再次被转换为字符串,因为当任何字符串和其他值(除了undefined)相加时,结果都是字符串。
console.log((+'b') + 'a'); // 'NaNa'
2. 3 + 2 + 1 + 'string'
这个表达式是将数字相加,然后将结果与字符串连接。由于字符串连接比加法优先级高,所以在该表达式中,数字3、2和1首先相加,得到6,然后与字符串'string'连接,最终结果为"6string"。
console.log(3 + 2 + 1 + 'string'); // '6string'
3. '1' - - '1'
这个表达式使用了类型转换:两个字符串相减的结果会尝试将这两个字符串转换为数字。由于两个字符串都只包含数字字符,因此它们最终被解释为数字1,所以该表达式的结果是数字2。
console.log('1' - - '1'); // 2
4. [1,2,3] + [4,5,6]
这个表达式尝试将两个数组相加。但是,在JavaScript中,数组加法不是通过将它们简单相加来执行的。相反,数组相加操作将数组转换为字符串,目的是连接它们在字符串中的所有元素。在本例中,两个数组都被转换为字符串,然后连接在一起,结果为"1,2,34,5,6"。
console.log([1,2,3] + [4,5,6]); // '1,2,34,5,6'
5. 'hello' - 'h'
这个表达式尝试从'h'的ASCII码的字符值中减去'hello'的ASCII码的字符值之和。但是,由于字符串无法相减,所以这个表达式的结果为NaN。
console.log('hello' - 'h'); // NaN
6. '1' > null
这个表达式比较一个字符串和null。在进行比较时,null被转换为数字0,字符串'1'被转换为数字1。因此,该表达式相当于1 > 0,这是true。
console.log('1' > null); // true
7. [] + []
这个表达式尝试将两个空数组相加。这种情况下,空数组会被转换为空字符串,并通过字符串连接运算符'+'相连,结果为空字符串。
console.log([] + []); // ''
8. [] + {}
这个表达式尝试将空数组和空对象相加。由于对象不能被直接转换为字符串,该表达式会先将空数组转换为空字符串,再尝试将空对象转换为字符串。空对象被转换为"[object Object]"字符串,因此结果为"[object Object]"。
console.log([] + {}); // '[object Object]'
9. {} + []
这个表达式尝试将空对象和空数组相加。由于+运算符在这里既可以表示数字的加法,也可以表示字符串的连接,因此,JS解释器无法判断应该使用哪种方式处理。这个表达式的结果和浏览器有关,不同浏览器的表现可能不一样。在大多数情况下,空对象被解释为数字0,空数组被解释为空字符串,所以该表达式的结果是数字0。
console.log({} + []); // 0
10. !{valueOf: 0}
10.1 什么是valueof()方法?
valueOf()方法是JavaScript基础对象中一个特殊的方法,它是由Object对象原型提供的,它为在对象上执行“原始转换”提供了一种方式。它通常被JavaScript运行时调用,用于将对象转换为原始值。例如,当您尝试将对象与数字相加时,valueOf()方法被调用,以便将该对象转换为数字。
10.2 意思是什么?
这个表达式尝试将一个对象转换为布尔类型,表示对象的真/假值。由于该对象有一个valueOf()方法,该方法返回数字0,所以,其布尔值为false。然而,需要注意的是,这个表达式并不是尝试将对象的值设置为0,而是尝试从对象中提取值。
console.log(!{valueOf: 0}); // false
11. [1, 2] + 3
这个表达式尝试将数字3加到数组上。在JavaScript中,向数组添加数字的操作会自动将该数字添加到数组的末尾。因此,该表达式首先将数字3转换为字符串'3',然后将其追加到数组[1,2]的末尾,得到字符串"1,23"。
console.log([1, 2] + 3); // '1,23'
12. '1' - 1 + '2'
这个表达式尝试将字符串'1'减去数字1,结果为数字0。然后,数字0与字符串'2'连接在一起,得到字符串'02'。
console.log('1' - 1 + '2'); // '02'
13. true + false
这个表达式将布尔值true和false转换为数字,true为1,false为0。然后将它们相加,得到数字1。
console.log(true + false); // 1
14. ['x'] == 'x'
这个表达式尝试将字符串'x'与一个只包含一个字符串'x'的数组相比较。在比较之前,数组也被转换成一个字符串。在这种情况下,数组中的字符串'x'被连接为'x'字符串,在与另一个字符串'x'相比较。由于这两个字符串相等,所以该表达式的值为true。
console.log(['x'] == 'x'); // true
15. [] == ![]
15.1 什么是!操作符?
在JavaScript中,叹号(!)是一个逻辑否定运算符,用于计算其操作数的布尔值的反向值。例如,如果操作数是真(true),则取反后的值为假(false),反之亦然。
15.2 []表示什么?
[]表示一个空数组,是一种JS数据类型。
15.2 意思是什么?
这个表达式尝试将空数组与布尔值相比较。首先,逻辑非(!)运算符应该是应用于空数组的,所以空数组首先被转换为布尔值false。然后,比较操作符应用于布尔值false和空数组。在比较之前,空数组被转换为空字符串。由于空字符串的布尔值为false,因此![]的值为true。因此,该表达式实际上是在比较false的布尔值和true的布尔值,这两者不相等,因此该表达式的结果为false。
console.log([] == ![]); // false
16. !!'false' == true
16.1 !!操作符是什么?
在JavaScript中,叹号(!)是一个逻辑否定运算符,用于计算其操作数的布尔值的反向值。例如,如果操作数是真(true),则取反后的值为假(false),反之亦然。在两个连续的感叹号前面加上一个值,可以将该值强制转换为布尔值。
16.2 'false'表示什么?
'false'是一个字符串,表示“假”的意思,但它实际上是一个字符串,而不是布尔值。
16.3 意思是什么?
该表达式将字符串'false'强制转换为布尔值,该布尔值为true。这是因为任何非空字符串都被视为true。然后,两个连续的感叹号都将该值转换为布尔值。因此,表达式!!'false'的值为true。最后,它被比较true相true,因此该表达式的结果为true。
console.log(!!'false' == true); // true
17. 1 < 2 < 3
这个表达式看起来像是将三个数字单独比较。但是,它实际上是比较运算符的级联使用,因为比较运算符的优先级相同,并且按照从左到右的顺序进行评估。首先,1 < 2解析为true,然后true被转换为数字1,因此表达式1 < 3开始执行。由于1 < 3是true,所以该表达式的结果为true。
console.log(1 < 2 < 3); // true
18. 3 > 2 > 1
这个表达式也看起来像是将三个数字单独比较。但是,它实际上采用了与上面一样的级联比较运算符。在该表达式中,3>2求值为true,然后true被转换为数字1。然后,1比1大,因此该表达式的结果是false。
console.log(3 > 2 > 1); // false
19. null == 0
这个表达式将null和数字0进行比较。在进行比较时,因为它们是不同的变量类型,因此JavaScript会尝试将它们转换为相同的类型。由于null表示“没有值”的特殊类型,因此它被视为数字0。因此,该表达式的结果为true。
console.log(null == 0); // false
20. null < 1
这个表达式尝试将null与数字1进行比较。在尝试进行比较之前,null将被转换为数字。由于数字1比null大,该表达式的结果为false。
console.log(null < 1); // true