# 问题汇总
# 常见问题
- JavaScript 中 this 是如何工作的
- 请解释原型继承 的原理。
- 什么是闭包(closure),如何使用它,为什么要使用它?
- .call 和.apply 的区别是什么?
- 请指出 JavaScript 宿主对象 (host objects)和原生对象(native objects)的区别?
- 请指出以下代码的区别:function Person()、var person = Person()、var person = new Person()?
- 请解释变量声明提升(hoisting)。
- 什么是“use strict”;?使用它的好处和坏处分别是什么?
- 什么是事件循环(event loop)?
- 请解释同步(synchronous) 和异步(asynchronous)函数的区别。
# if...else
和 switch...case
如何选择?
switch
有点以空间换时间的意思,而事实上也的确如此。
当分支较多时,当时用
switch
的效率是很高的。因为switch
是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if...else
是遍历所有的可能值,知道找到符合条件的分支。如此看来,switch
的效率确实比if...else
要高的多。由汇编代码可知道,
switch...case
占用较多的代码空间,因为它要生成跳表,特别是当case
常量分布范围很大但实际有效值又比较少的情况,switch...case
的空间利用率将变得很低。switch...case
只能处理case
为常量的情况,对非常量的情况是无能为力的。例如if (a > 1 && a < 100)
,是无法使用switch...case
来处理的。所以,switch
只能是在常量选择分支时比if...else
效率高,但是if...else
能应用于更多的场合,if...else
比较灵活。在已知某几种分支出现概率较高的情况下,使用
if...else
,将高概率分支放到前几位,由于if...else
是遍历所有值,所以使用这种方式的效率要比switch...case
高分支出现概率相同或未知的情况下,分支数小于5
if...else
的效率比switch...case
高,反之分支数大于5,switch...case
效率比if...else
高
if
和 switch
都可以设计多重分支结构,一般情况下 switch
执行效率要高于 if
语句。但是也不能一概而论,应根据具体问题具体分析。简单比较如表所示。
语句 | If 语句 | Switch 语句 |
---|---|---|
结构 | 通过嵌套结构实现多重分支 | 专为多重分支设计 |
条件 | 可以测试多个条件表达式 | 仅能测试一个条件表达式 |
逻辑关系 | 可以处理复杂的逻辑关系 | 仅能处理多个枚举的逻辑关系 |
数据类型 | 可以适用任何数据类型 | 仅能应用整数、枚举、字符串等类型 |
相对而言,下面情况更事宜选用 switch 语句。
- 枚举表达式的值。这种枚举是可以期望的、平行的逻辑关系。
- 表达式的值具有离散性,是不具有线性的非连续的区间值。
- 表达式的值是固定的,不会动态变化。
- 表达式的值是有限的,不是无限的,一般应该比较少。
- 表达式的值一般为整数、字符串等简单的值。
下面情况更事宜用 if 语句。
- 具有复杂的逻辑关系。
- 表达式的值具有线性特征,去对连续的区间值进行判断。
- 表达式的值是动态的。
- 测试任意类型的数据。