类型
JavaScript的数据类型分为两类:原始类型(primitive type)和对象类型(object type)。JavaScript中的原始类型包括数字、字符串和布尔值,还有两个特殊的原始值:null(空)和undefined(未定义),它们不是数字、字符串和布尔值,分别代表了各自特殊类型的唯一的成员。
除了数组(Array)类和函数(Function)类之外,JavaScript语言核心定义了其他三种有用的类。日期(Date)类定义了代表日期的对象,正则(RegExp)类定义了表示正则表达式的对象,错误(Error)类定义了那些表示JavaScript程序中运行时错误和语法错误的对象。
JavaScript的类型可以分为原始类型和对象类型,也可分为可以拥有方法的类型和不能拥有方法的类型,同样可分为可变(mutable)类型和不可变(immutable)类型。对象和数组属于可变类型:JavaScript程序可以更改对象属性值和数组元素的值。数字、布尔值、null和undefined属于不可变类型——比如,修改一个数值的内容本身就说不通。字符串可以看成由字符组成的数组,你可能会认为它是可变的。然而在JavaScript中,字符串是不可变的:可以访问字符串任意位置的文本,但JavaScript并未提供修改已知字符串的文本内容的方法。
原始类型数字、布尔值和字符串都有对应的包装对象类型,分别为Number、Boolean和String,相同值的原始类型值与包装对象相等但不恒等。
var x = 1;
var xObj = new Number(x);
x == xObj; //true
x === xObj; //false
变量作用域
在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的,我们称为块级作用域(block scope),而JavaScript中没有块级作用域。JavaScript取而代之地使用了函数作用域(function scope):变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。
var scope = "global";
function f(){
console.log(scope); //输出"undefined",而不是"global"
var scope = "local"; //变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的
console.log(scope); //输出"local"
}
你可能会误以为函数中的第一行会输出"global",因为代码还没有执行到var语句声明局部变量的地方。其实不然,由于函数作用域的特性,局部变量在整个函数体始终是有定义的,也就是说,在函数体内局部变量遮盖了同名全局变量。尽管如此,只有在程序执行到var语句的时候,局部变量才会被真正赋值。因此,上述过程等价于:将函数内的变量声明“提前”至函数体顶部,同时变量初始化留在原来的位置:
function f(){
var scope; //在函数顶部声明了局部变量
console.log(scope); //变量存在,但其值是"undefined"
scope = "local"; //这里将其初始化并赋值
console.log(scope); //这里它具有了我们所期望的值
}
拓展阅读
定义变量除了使用var之外,可以使用const定义常量,使用let定义块级作用域变量,let变量只在{}间有效。
不过const和let是在ES6中增加的,仅在最新版浏览器中得到支持,慎用!