问题汇总

常见问题

  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...else 和 switch...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 高

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

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

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

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

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

  • 具有复杂的逻辑关系。
  • 表达式的值具有线性特征,去对连续的区间值进行判断。
  • 表达式的值是动态的。
  • 测试任意类型的数据。
上次更新:
Contributors: kyxiao