20个稀奇古怪的JS表达式,猜猜输出结果吧!

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

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。