(1)原始值:1,“2”,false,true,null,undefined
(2)复杂值又称为复杂对象或引用对象:new String/Number/Array/Object/Boolean()等
//原始值 var str2 = String('12'); var str = '22'; //复杂值 var obj = {}; var str = new String();
1.构造函数实例拥有指向构造函数的constructor
var foo = function(){}; var obj = {}; var str = new String(); var arr = [1,2]; foo.constructor;//function() obj.constructor;//Object() str.constructor;//String() arr.constructor;//Array()
原始值和构造函数也是有关系的,所以constructor也指向构造函数。
2.也可以查看自定义构造函数的实例对象。用constructor查看实例对象的构造函数,构造函数在定义的时候必须给出函数名称。
//有函数名称 var myFunction = function myFunction(){ }; //匿名函数 var noNameFunction = function(){}; my_fn = new myFunction(); my_fn.constructor;//myFunction() my_no_name_fn = new noNameFunction(); my_no_name_fn.constructor;//function
作用:查看别人编写大量代码时,尤其是不知道new实例对象的构造函数时,可以用constructor查看生成此实例的构造函数。但是如果知道构造函数,可以使用instanceof验证。
3.instanceof需要特别注意的地方:只有复杂值和new生成的实例对象instanceof返回true
var noNameFunction = function(){}; my_no_name_fn1 = new noNameFunction(); my_no_name_fn2 = noNameFunction(); my_no_name_fn1 instanceof noNameFunction;//true my_no_name_fn2 instanceof noNameFunction;//false var name ="sam"; name instanceof String;//false var name = new String("sam"); name instanceof String;//true var obj = { name:"obj"}; obj instanceof Object;//true
4.构造函数创建的实例可以拥有自己的独立属性
var name='sam'; name.foo = 'foo'; name.foo; //undefined,字面量和原始值是不支持此功能的 var name = new String('sam'); name.foo = 'foo'; name.foo;//'foo' var myFunction = function(){}; my_fn1 = new myFunction(); my_fn2 = myFunction; my_fn1.foo = "foo"; my_fn1.foo;//'foo' my_fn2.foo = "foo"; my_fn2.foo;//'foo' my_fn3 = new myFunction(); my_fn3.foo;//undefined
5.javascript对象都是动态的,也就是说javascript对象是可以改变的。
Number.prototype.calculate = function(a,b){ return a+b; }; num = new Number(); num.calculate(1,2);
6.typeOf操作符:原始值中undefined返回的就是undefined,null返回的就是object,其余的按照自己的类型来;复杂值返回的是object,function除外,返回的是Function。
7.在进行对象比较的时候要谨记:原始值比较采用值比较,复杂值比较采用引用比较。
var str_compare = 'sam'; var str_to = 'sam'; str_compare === str_to;//true var obj_1 = {name:'sam'}; var obj_2 = {name:'sam'}; obj_1 === obj_2;//false obj_3 = obj_1; obj_1 === obj_3;//true
8.复杂对象具有动态属性
所谓的复杂对象具有动态属性,是指对复杂对象的复制是引用拷贝,改变任何一个拷贝的属性值,其他都会跟着改变。
var obj_1 = {name:'sam'}; var obj_2 = obj_1; obj_1.name = 'tom'; obj_1.name;//tom obj_2.name;//tom var arr =[1,2]; arr_copy = arr; arr_copy[0] = 3; arr;//[3,2]
9.删除对象属性
var obj_1 = {name:'sam',class:1}; delete obj_1.name; obj_1.name;//undefined
10.head对象与全局属性、全局变量
所谓全局变量就是直接包含在head对象内部的值。
var name = 'sam'; var fn = function(){ console.log(window.name); }();
11.引用head对象的两种方式:直接赋值,使用this
var name = 'sam'; var window_var1 = this; var window_var2 = window; var fn = function(){ console.log(window_var1.name);//'sam' console.log(window_var2.name);//'sam' }(); //但是head对象是隐式的,显示调用降低性能。 var name = 'sam'; var window_var1 = this; var fn = function(){ console.log(name);//'sam' }();
12.javascript中等同于false的值:0,-0,null,“”,undefined,NaN,false