文章目录
1、“一切都是对象”,在js中”一切都是对象”,并不是所有都是对象,值类型就不是对象
下面我们通过typeof函数输出所有的类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| console.info(typeof(x)) console.info(typeof(true)) console.info(typeof("hyData")) console.info(typeof(100)) console.info(typeof(function(){})) console.info(typeof([1,2,3,5,6])) console.info(typeof({"name":"hy","age":4})) console.info(typeof(null)) console.info(typeof(new Number(10)))
|
其中string number boolean undefined 是值类型,其余都是对象,都是引用类型 ,
值类型与引用类型的区别,我们以连锁店和连锁店钥匙来理解
(1)值类型:变量的交换等于在一个新的地方安装总店的规范开了一个连锁店,各自经验互不影响
demo
1 2 3 4
| var str1 = "tang quan kun"; var str2 = str1; str1="tqk" console.info(str2)
|
把一个值类型str1的值传给str2时,实际上是个str2分配了一个地址和内存,所以改变str1的值时,str2不受影响
(2)引用类型:变量的交换等同于一个店在配了一把钥匙给老板娘,老板跟老板娘共同管理这家店,相互之间会有影响
demo
1 2 3 4 5 6 7 8
| var obj1 ={ "name":"tang quan kun", "age":24 } var obj2 = obj1 console.info(obj2.name) obj1.name = "tqk" console.info(obj2.name)
|
从上面可以看出,只要是改变了obj1后,obj2也会跟着改变,那是因为在obj2 = obj1时,没有给obj2开辟一个空间,而是把obj2指向了obj1
如果要判读一个值类型为什么类型用typeof判读,如果判读一个引用类型为什么类型用instanceof进行判断
1 2 3
| var fun = function(){} ; console.info(fun instanceof Function ) console.info(fun instanceof Object )
|
2、对象就是若干属性的集合,js不像java或者c++那样要new一个class出来,不像那么严格,js的对象可以任意的扩展 ,下面一个demo
1 2 3 4 5 6 7 8 9 10
| var obj = { age:4, name:function(){ console.info("hyData") }, other:{ "name":"xxx", "year":2017 } }
|
其中obj是一个自定义对象,里面的name、age、other是属性,other又是一个 对象,里面有name、year属性。下面以函数为例子
1 2 3 4 5 6 7 8 9 10 11
| var fn = function(){ console.info("come in") }; fn.name = "hyData"; fn.age = function(){ console.info(4) }; fn.other ={ "name":"xxx", "year":2017 };
|
上面的fn函数就被作为对象赋值了name、age、other属性。我们调用的时候可以以fn.other 这样调用,这样做的用处很多,例如jQuery中的get请求,$.get(…)