JS Guide JS Guide
首页
  • JS 部分
  • HTML 部分
  • CSS 部分
  • Vue
  • React & Angular
  • 数据结构、算法、OS
  • 计网、浏览器
  • 杂项
笔试
面试
资源
资讯
  • 关于本站
  • 更新历史
  • 贡献指南
  • 文档规范
  • 常见问题
GitHub (opens new window)
首页
  • JS 部分
  • HTML 部分
  • CSS 部分
  • Vue
  • React & Angular
  • 数据结构、算法、OS
  • 计网、浏览器
  • 杂项
笔试
面试
资源
资讯
  • 关于本站
  • 更新历史
  • 贡献指南
  • 文档规范
  • 常见问题
GitHub (opens new window)
  • 面试相关说明
  • 解释代码题

    • 隐式转换问题
      • 1. 以下代码输出什么?
      • 2. 以下代码输出什么?
    • this 指向问题
    • Promise 与异步执行问题
  • 手撕代码题

  • 个人相关

  • 面试相关
  • 解释代码题
卡洛
2022-11-02
目录

隐式转换问题

参考知识点:

  • JS 知识点 - 操作符

# 1. 以下代码输出什么?

console.log(++[[]][+[]]+[+[]]);	// 10
1

该表达式拆分为 ++[[]][+[]],+,[+[]]。

  • 对于 [+[]],由于 +[] 会将 [] 强转为数字,[] 转为数字的方法是调用 toString() 得到空字符串 "" 再转换,因此 +[] 得到 0,[+[]] 为 [0]。
  • 因此 + 左边是 ++[[]][0],右边是 [0]。
  • 中括号比 ++ 优先级更高,对于 [[]][0],得到内部数组 [] 的引用,称之为 A。
  • ++A 将 A 强转为数字 0 再执行自增(等同于 (+A)+1),即 1。
  • 式子整理为 1+[0],[0] 强转为字符串 "0",结果返回 1+"0" 即 "10"。

# 2. 以下代码输出什么?

console.log((!+[]+[]+![]).length);  // 9
1

该表达式拆分为 !+[],+,[],+,![]。

  • 对于 !+[],它是表达式 +[] 的取反布尔值,而表达式 +[] 的值为 [] 的强转数字值 0,因此表达式结果为 true。
  • 对于 true + [],[] 调用 toString() 得到空字符串 "",两者相加得到字符串 "true"。
  • 对于 ![],它是表达式 [] 的取反布尔值,而 [] 被认为是 truthy,因此 ![] 结果为 false。
  • 对于 "true" + false,执行字符串连接,结果为 "truefalse",长度为 9。
在 GitHub 中编辑此页 (opens new window)
上次更新于: 2022/11/3 23:25:22
面试相关说明
this 指向问题

← 面试相关说明 this 指向问题→

Theme by Vdoing | Copyright © 2022-2022 Carlo | Powered by VuePress
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式