JavaScript面向对象系列:一、类型

js有5中原始类型 Boolean number string null undefined,所有原始类型的值都有字面形式。字面形式是不被保存在变量中的值。

js和其他许多语言一样,原始类型的变量直接保存原始值(而不是一个指向对象的指针)。当你将原始值赋值给一个变量时,改值将被赋值到变量中。也是就说,如果你使一个变量等于另一个变量时,每一个变量都有它自己的一份数据拷贝.例如

var color1 = "red";
var color2 = color1;

每个含有原始变量的变量使用自己的存储空间,一个变量的改变不会影响到其他变量.

虽然字符串、数字和布尔值是原始类型,但是他们也拥有方法(null和undefined没有方法).

尽管原始类型拥有方法,但是他们不是对象,js使他们看上起像对象一样,以此来提供语言上的一致性体验。

引用类型是指js中的对象,同时也是在语言中能找到的最接近类的东西。引用值就是引用类型的实例,也是对象的同义词。对象是属性的无序列表。

当你将一个对象赋值给变量时,实际是赋值给这个变量一个指针。将一个变量赋值给另一个变量时,两个变量各获得了一份指针的拷贝,指向内存中的一个对象。

js语言有垃圾收集功能,因此当你使用引用类型时无需担心内存分配。但是最好在不使用对象时将其引用解除,让垃圾收集器对那块内存进行释放。解除引用的最佳手段是将对象变量设置为null。

js内建类型 Array Date Error Function Object RegExp

鉴别引用类型,对于函数,typeof 返回的是 funcion,但是其他引用类型的返回都是object.其他的引用类型可以使用instanceof来鉴别。

es5引入Array.isArray(item)来鉴别数组

原始封装类型共有三种,String,Number,Boolean。这些特殊引用类型的存在使得原始类型用起来和对象一样方便。

字符串对象的存在仅用于该语句并在随后被销毁。

例如:

var name = "aaaa";
name.last = "bbbb"
console.log(name.last); //undefined

下面是实际在js引擎中实际发生的事

var name = "aaaa";
var temp = new String(name);
temp.last = "bbbb";
temp = null;
var temp = new String(name);
console.log(temp); //undefined
temp = null

实际上是在一个立刻就被销毁的临时对象上而不是字符串上添加了新的属性。之后当你试图访问该属性时,另一个不同的临时对象被创建,而新属性并不存在。虽然原始封装类型会被自动创建,在这些值上进行instanceof检查对应类型的返回值却都是false。

例如

var name = "aaa";
var count = 10;
var found = false;

console.log(name instanceof String); //false
console.log(count instanceof Number); //false
console.log(found instanceof Boolean); //false

这是因为临时对象仅在值被读取时被创建。instanceof操作符并没有真的读取任何东西,也就是没有临时对象的创建,于是它告诉我们这些值并不属于原始封装类型。
你也可以手动创建原始封装类型,但是有某些副作用

var name = new String("aaa");
var count = new Number(10);
var found = new Boolean(false);

console.log(typeof name); //"object"
console.log(typeof count); //"object"
console.log(typeof found); //"object"

手动创建原始封装类型实际会创建出一个object,这意味着typeof无法手动鉴别出你实际保存的数据类型

一个对象在条件判断语句中总被认为是true,无论该对象的值是不是等于false。

var found = new Boolean(false);
if(found){
console.log("Found")
}

//结果执行了,"Found"

总结

javascript中虽然没有类,但是有类型。每个变量或数据都有一个对应的原始类型或者引用类型。5种原始类型(字符串、数字、布尔值、空类型、未定义)的值会被直接保存在变量对象中。除了空类型,都可以用typeof来鉴别。空类型必须直接跟null进行比较才能鉴别。

引用类型是js中最接近类的东西,而对象则是引用类型的实例。可以使用new操作符或者字面量的形式创建新对象。通常可以用点号访问属性和方法,也可以用中括号。函数在js中也是对象,可以使用typeof来鉴别他们。至于其他引用类型,你应该用instanceof和一个构造函数来鉴别。

为了让原始类型看上去更像引用类型,js提供了三种原始封装类型:String、Number、Boolean。js会在背后创建这些对象是的你能够像使用普通对象那样直接使用原始值,但是这些临时对象在使用它们的语句结束时就立刻被销毁。虽然你也可以自己创建原始封装类型的实例,但是它们太容易令人误解,所以最好别这么干。

发表评论

电子邮件地址不会被公开。 必填项已用*标注