JavaScript一共有两种类型,非别为原始类型和引用类型.JavaScript使用一个叫做variable object的东西来记录创建的数据类型,如果新建数据为原始类型,则直接存储在variable object中,如果为引用类型,则用variable object来存放指向引用类型的指针.
原始类型
JavaScript一共有5种原始类型:
1. Boolean
2. Number
3. String
4. Null
5. Undefined
当把一个存储原始类型数据的变量赋值给另一个变量时,两个变量存储的值一样,但分别拥有的是各自的拷贝.
1
2
3
4
5
| var color1 = "red";
var color2 = color1;
color1 = "green";
console.log(color1); // green
console.log(color2); // red
|
typeof 关键字
用来判断当前原始类型的具体类型:
1
2
3
4
5
| console.log(typeof 10); // number
console.log(typeof "hello"); // string
console.log(typeof true); // boolean
console.log(typeof null); // object
console.log(typeof undefined); // undefined
|
== 与 ===
两者的作用基本一样,唯一的不同就是==
在比较的时候会进行类型转换,而===
则按原值比较.
1
2
3
4
5
6
7
8
| console.log("5" == 5); // true
console.log("5" === 5); // false
console.log(true == "true"); // false
console.log(true === "true"); // false
console.log(null == null); // true
console.log(null === null); // true
console.log(null == undefined); // true
console.log(null === undefined); // false
|
引用类型
引用类型即对象,它是由一组键值对组成,很像其他语言中的hash.键可以为string或者一般的literal,值为原始类型或者方法.创建对象一般有两种方法: 使用new和使用object literal.
1
2
3
4
5
6
7
8
9
10
11
| 1.
var book = new Object();
book.name = "Head first Java"
book.year = 2014
2.
// literal
var book = {
name: "javascript oo design",
year: 2014
}
|
与原始类型的赋值不同的是,引用类型在赋值过程中不会在内存中再次拷贝指向数据,而是仅仅创建一个新的指针指向原来的引用.
1
2
3
4
| var obj1 = new Object();
var obj2 = obj1;
obj1.myCustomProperty = "Qiushi";
console.log(obj2.myCustomProperty); // "Qiushi"
|
和Java类似,JavaScript也有垃圾回收机制,也即没有指针指向对象时,其被回收.
1
2
| var obj = new Object();
obj = null;
|
原始类型的包装
原始类型中的String,Number和Boolean分别有其对应的包装类型,当系统检测到原始类型被读取并被当做对象使用时,系统会创建一个零时的原始类型的包装类,当包装类不再被使用的时候立即被系统回收.
1
2
3
4
5
6
7
8
9
10
| var name = "Qiushi";
var firstChar = name.charAt(0);
console.log(firstChar); // "Q"
在系统中被解释为:
var name = "Qiushi";
var tmp = new String(name);
var firstChar = tmp.charAt(0);
tmp = null;
console.log(firstChar);
|
例如如果我们按照下面这么做:
1
2
3
4
5
6
7
8
9
10
11
12
13
| var name = "Nicholas";
name.last = "Zakas";
console.log(name.last); // undefined
在系统中被解释为:
var name = "Nicholas";
var tmp = new Sring(name)
tmp.last = "Zakas";
tmp = null // 零时变量被摧毁
var tmp = new String(name)
console.log(name.last);
tmp = null
|
再看下面这个例子:
1
2
| var name = "Qiushi"
console.log(name instanceof String) // false
|
name在这里没有被当做对象使用(obj.xxx),所以没有零时对象创立,而原始类型不是其包装类的引用,所以会返回false.
读取对象中property的方法
有两种方法可以实现,第一种是obj.propertyKey,另一种是obj[propertyKey].后者的好处是可以通过一个varaible动态地决定是去取obj里的哪个property,例如:
1
2
3
4
5
6
7
| var obj = {
book: "gone with the wind",
fruit: "banana"
}
var f = "fruit";
console.log(obj[f]); // banana
|