重读阮一峰 《JavaScript 标准参考教程》一书。有沧海拾遗的感觉,偶有收获,记录下来,以便之后查阅...
JS语法
变量提升
- 只有用
var
声明变量才会变量提升 - 要规避这种特性,可以直接写
a = 0
,或者用winsow.a = 0
这种形式 - 用
function
关键字声明的函数会将整个函数提升到顶部,用var foo = function () {}
可以只提升foo
变量的声明,但函数体还是会留在原地,这样可以避免一些错误
switch-case语法
- 每一个
case
语句后面都要加break
,不然程序还是会往下走 -
switch-case
语法使用的是严格相等的模式
数组
- 数组即对象,不过是拥有有序的键名('0','1',...)
- 本质上,数组的下标是字符串。只不过我们写成数字下标时,JS解析器会对数字进行隐式转换
- 数组与狭义对象的差别之一是数组的length属性是动态变化的。清空数组的一种方式是
arr.length = 0
- 给数组添加一些不符合数组规范的属性不会影响它的
length
属性 - 类数组对象也有
length
属性,但是该属性不是动态的
强制类型转换
-
Number()
是比parseInt()
更加严格的转换 -
String()
可以用来区分狭义对象和数组 Boolean()
错误处理
-
error
对象使用new Error()
构造函数,并传入错误信息message
- 三个属性:
name、message、stack
-
throw
用于中断程序执行,抛出意外或错误。接收表达式作为参数,可以抛出各种类型的值
闭包
- 作用:①外部读内部的变量 ②闭包的变量不会被回收,可以用来存储变量 ③封装对象的私有属性和方法
- 外部函数的内部环境会一直存在,闭包可以看作是函数内部作用域的一个接口
- 外部函数每一次执行都会形成新的闭包,该闭包又保留外层函数的内部变量,所以内存消耗挺大,要慎用
IIFE
-
function
关键字既可以作为语句,也可以作为表达式 -
()()
是为了让JS解释器将function解析成表达式,后面的小括号是用来传参的。 - 还有其他形式的如:
(function(){}())、~function(){}()...
狭义对象
- 对象的键名为字符串。我们用对象字面量的方式定义对象,键名可以省略引号
-
Object.keys(obj)
方法返回包含所有键名的数组(该方法可以用来判断一个对象是否为空) -
delete obj.xx
删除对象的某个属性 -
'xx' in obj
判断对象是否有某个属性(继承过来的属性也被包含) -
obj.hasOwnProperty('xx')
判断对象是否有某个属性(不包含继承过来的属性也)