JavaScript精要之原始类型和引用类型
概念理解:
原始值:原始类型变量中的值
引用值:就是对象,或者交做实例。
原始值被直接保存在变量的对象内,引用值则作为一个指针保存在变量对象内,该指针指向实际对象在内存中的存储位置。
创建对象:1
var object = new Object();
注意:因为引用类型不在变量中直接保存对象,所以,这里的object变量实际上并不包含对象的实例。这里的object是一个指向内存中实际对象所在位置的指针。这里的object的正确名称,应该叫被创建对象的引用!!!!
原始类型具有的原始方法(总结):1
2
3
4
5
6
7
8
9
10
11var name = "Cooling";
var lowercasename = name.toLowerCase();//转化为小写
var firstLetter = name.charAt(0);//得到C
var middleOfName = name.substring(2,5);//得到2-4的字符
var count = 10;
var fixedCount = count.toFixed(2);//10.00
var hexCount = count.toString(16);//转化为16进制a
var flag = true;
var stringFlag = flag.toString;//转换为字符串"true"
字面量形式:
字面量形式允许你在不需要使用new操作符和构造函数显式创建对象的情况下,生成引用值。
①在原始类型中:
字量面就是变量的字符串表现形式。它不是一种值,而是一种记法。1
var name = "cooling";//这里的cooling就是字面量
②在引用类型中,存在对象字面量、数组字面量、函数字面量、正则表达式字面量:
a.对象字面量(两种):1
2
3
4
5
6
7
8
9
10
11var person = {
name : "cooling",
age : 20,
job : "Web Engineer"
};
var person = {
"name" : "cooling",
"age" : 20,
"job" : "Web Engineer"
};//这种形式可以方便在属性名字里加空格
b.数组字面量(两种方式):1
2
3
4
5var colors = ['red','green','blue'];
console.log(colors[0]);//red
var colors = new Array('red','green','blue');
console.log(colors[0]);//red
c.函数字面量:
注意这里和构造函数的区别,构造函数是对新构造的函数设置属性,这里是new一个新的函数,然后往函数里面传值。
1 | function reflect(value){ |
d.正则表达式字面量(关于正则表达式,会另外起一篇博客详细讲解)
略
访问属性:
存在两种方式访问属性:1
2
3
4
5var array = [];
array.push(12345);
//等价于
var array = [];
array["push"](12345);//注意这里需要加双引号
也可以这么写:1
2
3var array = [];
var method = "push";
array[method](12345);
鉴别引用类型:
①typeof:(只能鉴别是否是函数,对于非函数,返回object)1
2
3
4function cooling(value){
return value;
}
console.log(typeof cooling);//function
PS:(其对于原始类型,还是可以做出判断的!)1
2
3
4
5
6
7
8
9alert(typeof null); // "object"
alert(typeof function () {
return 1;
}); // "function"
alert(typeof '梦龙小站'); // "string"
alert(typeof 1); // "number"
alert(typeof a); // "undefined"
alert(typeof undefined); // "undefined"
alert(typeof []); // "object"
②instanceof(可以鉴别其具体是不是某个类型):1
2
3
4
5
6
7
8var items = [];
var object = {};
function cooling(value){
return value;
}
console.log(items instanceof Array);//true
console.log(object instanceof Object);//true
cobsole.log(cooling instansof Function);//true
鉴别数组:
我们都已经知道,instanceof可以用来鉴别其是否是数组。但是在同一个页面中可能存在不同的框架,当你把一个数组,从一个框架传到另一个框架时,instanceof就无法识别它,因为那个数组是来自不同框架的Array实例。我们可以使用Array.isArray()方法来检测,这也是鉴别数组的最佳方法。1
2var items = [];
console.log(Array.isArray(items));//true
基本包装类型(或者叫原始封装类型)-属于引用类型:
String、Number、Boolean:注意这些都属于引用类型,不过是比较特殊的引用类型。它们三的存在,使得原始类型用起来跟对象一样方便。
1 | var name = "cooling"; |
这是在背后,实际发生的:1
2
3
4
5var name = "cooling";
var tem = new String(name);
var firstChar = tem.charAt(0);
tem = null;//注意这里的自动销毁
console.log(firstChar);
测试上面的自动销毁部分:1
2
3
4var name = "cooling";
name.zs = "zs";
console.log(name.zs);//undefined
这是实际发生的:1
2
3
4
5
6
7
8var name = "cooling";
var tem = new String(name);
tem.zs = "zs";
tem = null;
var tem = new String(name);
console.log(tem.last);
tem = null;
提醒:instanceof是用来检测引用类型的。由于这里的name对象创建后立即被销毁,因此使用instanceof来检测这里的name的时候,会显示false,而不会显示它的对象类型。代码如下:
值得注意的是,如果这里使用typeof判断的话,是可行的,因为这里会直接把name看成原始类型,然后用typeof判断。注意typeof是既可以判断原始类型,也可以检测引用类型的!
1 | var name = "cooling"; |
如果手动创建的话,那么会有些副作用(不能够鉴别出它的数据类型):1
2
3
4
5
6var name = new String("cooling");
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