JavaScript类型转换(五)——习题和答案

这是JavaScript类型转换系列文章的第五篇,提供了一些习题和解答。

自测一下

JavaScript类型隐式转换单选题(30道)

  1. 执行表达式 "" == 0 的结果是( )

    A. true B. false C. NaN D. undefined

  2. 表达式 [] == 0 的结果为( )

    A. true B. false C. [] D. 0

  3. 执行 "5" + 3 的结果是( )

    A. 8 B. "53" C. 53 D. "8"

  4. 表达式 "5" - 3 的结果是( )

    A. 2 B. "53" C. "2" D. NaN

  5. 执行!"" 的结果是( )

    A. true B. false C. "" D. 0

  6. 表达式 [] == "" 的结果是( )

    A. true B. false C. [] D. ""

  7. 执行 "true" == true 的结果是( )

    A. true B. false C. "true" D. 1

  8. 表达式 null == 0 的结果是( )

    A. true B. false C. null D. NaN

  9. 执行 undefined == 0 的结果是( )

    A. true B. false C. undefined D. NaN

  10. 表达式 "123a" == 123 的结果是( )

    A. true B. false C. "123a" D. NaN

  11. 执行 [] + {} 的结果是( )

    A. "[object Object]" B. "{}" C. [] D. NaN

  12. 表达式 {} + [] 的结果是( )

    A. 0 B. "[object Object]" C. "[]" D. NaN

  13. 执行 true + 1 的结果是( )

    A. 2 B. "true1" C. true1 D. NaN

  14. 表达式 false + 1 的结果是( )

    A. 1 B. "false1" C. false1 D. NaN

  15. 执行![] 的结果是( )

    A. true B. false C. [] D. 0

  16. 表达式!![] 的结果是( )

    A. true B. false C. [] D. 1

  17. 执行 "undefined" == undefined 的结果是( )

    A. true B. false C. "undefined" D. undefined

  18. 表达式 "null" == null 的结果是( )

    A. true B. false C. "null" D. null

  19. 执行 1 + null 的结果是( )

    A. 1 B. "1null" C. null D. NaN

  20. 执行 1 + undefined 的结果是( )

    A. NaN B. "1undefined" C. undefined D. 1

  21. 表达式 "2" > 1 的结果是( )

    A. true B. false C. "2" D. 1

  22. 表达式 "10" > "2" 的结果是( )

    A. false B. true C. "10" D. "2"

  23. 执行 [] + 1 的结果是( )

    A. "1" B. 1 C. [] D. NaN

  24. 表达式 {} + 1 的结果是( )

    A. 1 B. "[object Object] 1" C. {} D. NaN

  25. 表达式 true == 1 的结果是( )

    A. true B. false C. true1 D. NaN

  26. 表达式 false == 0 的结果是( )

    A. true B. false C. false0 D. NaN

  27. 执行 "a" * 1 的结果是( )

    A. NaN B. "a1" C. 0 D. a

  28. 表达式 "3" * 2 的结果是( )

    A. 6 B. "32" C. "6" D. NaN

  29. 表达式 [] == ![] 的结果是( )

    A. true B. false C. [] D. ![]

  30. 执行 null + undefined 的结果是( )

    A. NaN B. nullundefined C. 0 D. null

答案

  1. 答案:A

    考点:

    • 比较运算两运算子不同时为字符串或者数字,隐式转换为数字。
    • ""转换为数字,结果是0

    0 == 0结果为true。

  2. 答案:A

    考点:

    • 比较运算两运算子不同时为字符串或者数字,隐式转换为数字。
    • []是引用类型,转换为数字需要进入toPrimitive流程处理,转换方向是number。优先执行其valueOf方法,但该方法返回的是引用类型,所以执行其toString方法,得到""
    • ""转换为数字,结果是0

    0 == 0结果为true。

  3. 答案:B

    考点:

    • 二元+运算,只要操作数有一个是字符串,所有操作数都要转换为字符串(包括BigInt)

    3 转换为字符串得到"3","5""3"拼接得到"53"

  4. 答案:A

    考点:

    • 算数运算运算子不是数字的都要隐式转换为数字

    "5"转换为数字得到55-3等于2

  5. 答案:A

    考点:

    • 逻辑非会将运算子隐式转换为布尔值
    • ""转换为布尔值得到false

    false,取反后为true

  6. 答案:A

    考点:

    • 比较运算两运算子不同时为字符串或者数字,隐式转换为数字。
    • []是引用类型,转换为数字需要进入toPrimitive流程处理,转换方向是number。优先执行其valueOf方法,但该方法返回的是引用类型,所以执行其toString方法,得到""

    "" == ""结果为true。

  7. 答案:B

    考点:

    • 比较运算两运算子不同时为字符串或者数字,隐式转换为数字。
    • NaN不与任何内容相等,包括它自身

    "true"转换数字得到NaNNaN == true结果为false

  8. 答案:B

    考点:

    • nullundefined不与除了对方和自身之外的任何内容相等

    等式不成立,结果为false

    易错:
    依据“比较运算两运算子不同时为字符串或者数字,隐式转换为数字”,把null转换为数字得到0,得到的等式成立。

  9. 答案:B

    考点:

    • nullundefined不与除了对方和自身之外的任何内容相等

    等式不成立,结果为false

  10. 答案:B

    考点:

    • 比较运算两运算子不同时为字符串或者数字,隐式转换为数字。
    • NaN不与任何内容相等,包括它自身

    "123a"转数字得到NaN,NaN == 123结果为false

  11. 答案:A

    考点:

    • 二元+运算子没有字符串,非数字的运算子要转换为数字
    • 空数组和空对象向数字方向转换,会进入toPrimitive流程,优先采用执行 valueOf函数的结果,但它们的结果都是引用类型(自身),所以最终会采用toString函数的返回值。
    • 数组的toString函数,返回其元素的字符串拼接
    • 对象的toString函数,返回固定字符串[object Object]

    在都转换为字符串后,二元+执行字符串拼接,所以得到"[object Object]"

  12. 答案:A

    考点:

    • {}出现在表达式头部,会被当作空代码块
    • 算数运算的运算子不为数字的,隐式转换为数字
    • []是引用类型,转换为数字需要进入toPrimitive流程处理,转换方向是number。优先执行其valueOf方法,但该方法返回的是引用类型,所以执行其toString方法,得到""
    • ""转换为数字得到0

    因此结果为0

  13. 答案:A

    考点:

    • 算数运算运算子不是数字的都要隐式转换为数字
    • true转换为数字得到1

    1 + 1 = 2

  14. 答案:A

    考点:

    • 算数运算运算子不是数字的都要隐式转换为数字
    • false转换为数字得到0

    0 + 1 = 1

  15. 答案:B

    考点:

    • 逻辑非会将非布尔值运算子转换为布尔值
    • []是引用类型,转换为布尔值得到true

    !true结果为false

  16. 答案:A

考点:
+ 逻辑非是右结合

对15题答案再取反得到`true`
  1. 答案:B

    考点:

    • nullundefined不与除了对方和自身之外的任何内容相等
  2. 答案:B

    考点:

    • nullundefined不与除了对方和自身之外的任何内容相等
  3. 答案:A

    考点:

    • 二元+运算子没有字符串,非数字的运算子要转换为数字
    • null转为数字得到0

    1 + 0 = 1

  4. 答案:A

    考点:

    • 二元+运算子没有字符串,非数字的运算子要转换为数字
    • undefined转为数字得到NaN

    1 + NaN = NaN

  5. 答案:A

    考点:

    • 关系运算不同为字符串或不同为数字,两侧会发生向数字的隐式类型转换

    "2"转换为数字得到2,2 > 1结果为true

  6. 答案:A

    考点:

    • 关系运算不同为字符串或不同为数字,两侧会发生向数字的隐式类型转换

    题目中运算子都为字符串,所以不需要转换。字符串比较按 “Unicode 编码” 逐字符对比,"1"的编码(

49)小于"2"(50),因此"10" > "2"结果为false

  1. 答案:A
考点:
+ 二元`+`运算子没有字符串,非数字的运算子要转换为数字
+ `[]`是引用类型,转换为数字需要进入toPrimitive流程处理,转换方向是`number`。优先执行其`valueOf`方法,但该方法返回的是引用类型,所以执行其`toString`方法,得到`""`。
+ 二元`+`运算,只要操作数有一个是字符串,所有操作数都要转换为字符串(包括BigInt)

以上,`[]`先转换为`""`,此时二元`+`有一个运算子是字符串,另一个不是,所以`1`转换得到`"1"`。字符串拼接得到`"1"`。
  1. 答案:A

    考点:

    • {}出现在表达式头部,会被当作空代码块

    后续+1结果为1

  2. 答案:A

    考点:

    • 关系运算运算子不同为字符串或不同为数字,两侧会发生向number的隐式类型转换

    true转为数字得到11 == 1结果为true

  3. 答案:A

    考点:

    • 关系运算运算子不同为字符串或不同为数字,两侧会发生向number的隐式类型转换

    false转为数字得到00 == 0结果为true

  4. 答案:A

    考点:

    • 算数运算运算子不是数字的都要隐式转换为数字

    "a"转为数字得到NaNNaN * 1 = NaN

  5. 答案:A

    考点:

    • 算数运算运算子不是数字的都要隐式转换为数字

    "3"转为数字得到33 * 2 = 6

  6. 答案:A

    考点:

    • 关系运算运算子不同为字符串或不同为数字,两侧会发生向number的隐式类型转换
    • []是引用类型,转换为数字需要进入toPrimitive流程处理,转换方向是number。优先执行其valueOf方法,但该方法返回的是引用类型,所以执行其toString方法,得到""
    • ""转换为数字得到0

    ![]结果为false(见第 15 题),转换为数字得到0,最终0 == 0结果为true

  7. 答案:A

考点:
+ 关系运算运算子不同为字符串或不同为数字,两侧会发生向number的隐式类型转换
+ `null`转为数字得到`0`
+ `undefined`转为数字得到`NaN`

`0 + NaN = NaN`