类型
JavaScript 类型可以简单的分类两组:基本类型和复杂类型。访问基本类型,访问的是值,而访问复杂类型,访问的是对值的引用。
//基本类型
var a = 5;
var b = a;
b = 6;
a; //=>5
b; //=>6
//复杂类型
var a = ['hello', 'world!'];
var b = a;
b[0] = 'bey';
a[0]; //=>bey
b[0]; //=>bey
上述复杂类型的例子,a 和 b 包含了对值的相同引用。因此,当通过b修改数组的第一个元素时,a 相应的值也改变了,也就是说 a[0] === b[0] 。
类型的判断
要在 JavaScript 中准确无误的判断变量的类型绝非易事。下面我们就通过几个例子看看。
//创建一个字符串
var a = 'hello';
var b = new String('world!');
a + b; //=>hello world!
对a和b进行 typeof 与 instanceof 操作
typeof a == typeof b; //=>false
a instanceof String; //=>true
b instanceof String; //=>false
结果很意外,难道 b 不是字符串吗?答案是这两个家伙都是货真价实的字符串。
a.substr == b.substr; //=>true
并且使用 == 判断时相等,而使用 === 判断时结果并不相同。
a == b; //=>true
a === b; //=>false
考虑到在类型定义会有差异性,建议在定义类型的时候避免 new ,使用直观定义(列如: var a = [ ];)。
注:条件表达式中有一些值会被判断为 false:null、undefined 、' '还有0。
下面我们再来看看另一种情况:
//定义一些变量
var a = null;
var b = [];
var c = {};
我们继续对定义的变量进行进行 typeof 与 instanceof 操作
typeof a == typeof b; //=>true
typeof b == typeof c; //=>true
a instanceof Object; //=>true
b instanceof Object; //=>true
c instanceof Object; //=>true
这个时候就不能直接通过对类型来判断,这时要通过查看对象内部 [[class]] 值:
Object.prototype.toString.call(b) == Object.prototype.toString.call(c); //=>false
Object.prototype.toString.call(b) == '[object Array]'; //=ture
instanceof Array 这种方法只适用于与数组初始化在相同的上下文中才有效。