类型、值和变量
null和undefined
- null:使用typeof运算得出的是“object”,故可认为是一个特殊的对象,含义是“非对象”。
- undefined:typeof运算结果为“undefined”,表面这个值是这个类型的唯一成员。表示“变量为初始化”、“对象属性或者数组值不存在”、“函数没有返回值”。
-
null == undefined //=> true
,故要使用严格 === 来区分它们。
全局对象
JavaScript可以直接引用它们。
包装对象
字符串不是对象,但它有属性。只要引用了它的属性,JavaScript就会通过调用new String(s)转换成对象,注意是临时的,一旦属性引用结束,这个新建的临时对象就会被销毁。下面引用书中的例子说明一下:
第二行代码创建了一个临时的字符串对象,并给其新增了一个属性len,并赋值为4,随即这个临时对象将会被销毁。故第三行,通过原始的字符串(未被修饰过)创建一个新的字符串对象,尝试读取len属性,这个属性自然是不存在的,最后返回t的值为undefined。
同理,数字、布尔值也会如此。我们可以通过new String()、new Number()、new Boolean()来显式的构造包装对象:
s==S
返回true,恒等符“===”则视为不等,返回false。
类型转换
- 显式类型转换:最简单的就是使用Number()、String()、Boolean()、Object(),如下:
隐式类型转换:部分运算符会,如+和!操作等等:
x + "" \\\等价于new String(x); +x \\\等价于Number(x); !!x \\\等价于Boolean(x);注意是双等号
-
数字到字符串的转换:
-
对象转换为原始值:toString()和valueOf()
变量声明
- 作用域
- var声明的变量存在变量提升
- var允许重复声明
语句
声明语句
- var语句:声明变量。
-
function语句:声明函数,总是出现在js代码的顶部。
结合var的函数定义语句也会存在变量提升,函数体的初始化仍然在原来的位置。