“一切都是对象”这句话的重点在于如何去理解“对象”这个概念。
当然,也不是所有的都是对象,值类型就不是对象。
JS中一个常用的操作符——typeof用来判断数据类型
1 function show(x) { 2 3 console.log(typeof x); // undefined 4 console.log(typeof 10); // number 5 console.log(typeof 'abc'); // string 6 console.log(typeof true); // boolean 7 8 console.log(typeof function () {}); //function 9 10 console.log(typeof [1, 'a', true]); //object11 console.log(typeof { a: 10, b: 20 }); //object12 console.log(typeof null); //object13 console.log(typeof new Number(10)); //object14 }15 show();
从以上代码可以看出,undefined、number、string、boolean、null属于简单的值类型,不是对象。剩下的几种情况——function、array、object都是对象,他们都是引用类型。
判断一个变量是不是对象很简单。值类型的判断用typeof,引用类型的判断用instanceof。
1 var fn = function () { };2 console.log(fn instanceof Object); // true
对象——若干属性的集合
JS里面数组是对象,函数是对象,对象还是对象。对象里面的一切都是属性,只有属性,没有方法。那对象里的方法如何表示呢?方法也是一种属性,因为它的属性表示为键值对的形式。
同时,js里的对象可以任意的扩展属性,没有class的约束。
上面代码中,obj是一个自定义的对象,其中a,b,c就是他的属性,而且c的属性值还是一个对象,它又有name、year两个属性。
但函数跟数组不是这样定义属性的,以函数为例:
1 var fn = function () { 2 alert(100); 3 }; 4 fn.a = 10; 5 fn.b = function () { 6 alert(123); 7 }; 8 fn.c = { 9 name: "王福朋",10 year: 198811 };
上面代码中,函数作为对象呗赋值了a,b,c三个属性。
一切引用类型都是对象,对象是属性的集合