# 问题汇总

# 常见问题

  1. JavaScript 中 this 是如何工作的
  2. 请解释原型继承 的原理。
  3. 什么是闭包(closure),如何使用它,为什么要使用它?
  4. .call 和.apply 的区别是什么?
  5. 请指出 JavaScript 宿主对象 (host objects)和原生对象(native objects)的区别?
  6. 请指出以下代码的区别:function Person()、var person = Person()、var person = new Person()?
  7. 请解释变量声明提升(hoisting)。
  8. 什么是“use strict”;?使用它的好处和坏处分别是什么?
  9. 什么是事件循环(event loop)?
  10. 请解释同步(synchronous) 和异步(asynchronous)函数的区别。

# if...elseswitch...case 如何选择?

switch 有点以空间换时间的意思,而事实上也的确如此。

  1. 当分支较多时,当时用 switch 的效率是很高的。因为 switch 是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是 if...else 是遍历所有的可能值,知道找到符合条件的分支。如此看来,switch 的效率确实比 if...else 要高的多。

  2. 由汇编代码可知道,switch...case 占用较多的代码空间,因为它要生成跳表,特别是当 case 常量分布范围很大但实际有效值又比较少的情况,switch...case 的空间利用率将变得很低。

  3. switch...case 只能处理 case 为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用 switch...case 来处理的。所以,switch 只能是在常量选择分支时比if...else 效率高,但是 if...else 能应用于更多的场合,if...else 比较灵活。

  4. 在已知某几种分支出现概率较高的情况下,使用 if...else,将高概率分支放到前几位,由于 if...else 是遍历所有值,所以使用这种方式的效率要比 switch...case

  5. 分支出现概率相同或未知的情况下,分支数小于5 if...else 的效率比 switch...case 高,反之分支数大于5, switch...case 效率比 if...else

ifswitch 都可以设计多重分支结构,一般情况下 switch 执行效率要高于 if 语句。但是也不能一概而论,应根据具体问题具体分析。简单比较如表所示。

语句 If 语句 Switch 语句
结构 通过嵌套结构实现多重分支 专为多重分支设计
条件 可以测试多个条件表达式 仅能测试一个条件表达式
逻辑关系 可以处理复杂的逻辑关系 仅能处理多个枚举的逻辑关系
数据类型 可以适用任何数据类型 仅能应用整数、枚举、字符串等类型

相对而言,下面情况更事宜选用 switch 语句。

  • 枚举表达式的值。这种枚举是可以期望的、平行的逻辑关系。
  • 表达式的值具有离散性,是不具有线性的非连续的区间值。
  • 表达式的值是固定的,不会动态变化。
  • 表达式的值是有限的,不是无限的,一般应该比较少。
  • 表达式的值一般为整数、字符串等简单的值。

下面情况更事宜用 if 语句。

  • 具有复杂的逻辑关系。
  • 表达式的值具有线性特征,去对连续的区间值进行判断。
  • 表达式的值是动态的。
  • 测试任意类型的数据。
更新时间: 3/28/2022, 7:14:34 PM