既然标题给出了问号,那么答案必然是否定的;
先不说概念性的东西,来看一段代码:
//先定义一些变量;
var iNum = 10;
var sText = 'i am string';
var aArray = [1,2,3];
var bIs = true;
var fnFun = function(){};
var oNull = null;
var unde = undefined;
var oObj = {};
//打印他们的类型;
console.log(typeof iNum); //number
console.log(typeof sText); //string
console.log(typeof aArray); //object
console.log(typeof bIs); //boolean
console.log(typeof fnFun); //function
console.log(typeof oNull); //object
console.log(typeof unde); //undefined
console.log(oObj); //[object Object]
上面的结果看,足以证明javascript中一切皆对象是错误的,我们可以看得出来,总共出现了包括number、string、boolean、undefined、object、function、[object object]这七种情况;
先不解释这些,我们来看一些东西:
原始类型(值类型)与 引用类型
在javascript中变量只能存储为两种类型,一是原始类型(又称值类型),一是引用类型;
原始类型(值类型):
首先它是存放在栈内存中的,当然值也是直接存放在变量访问的位置;
这是因为值类型的值是不会发生变化的(也就是占用的空间是固定不变的),这样直接去栈内存中去取数据,大大提高了访问速度;
原始类型包括以下五种类型 : undefined、boolean、number、string、null;
这里要特别说一下string 与 null;
string :
其他语言将字符串string归为了引用类型,主要原因是因为字符串长度是可以变化的,但是ECMAscript硬性规定了他是原始类型,所以它只能是原始类型;
null
这个东西就有意思了,可以从上面的例子中可以看出,他打印出来的居然是object;
按他的类型分配(原始类型)他不应该返回的是 null吗?; 我们知道null返回的是一个空对象,既然是空对象那么js处理的时候,自然将它的类型返回会object了,因为空对象也是对象;
是的,这么一看就很矛盾了,既然是对象又要归为原始类型,是不是很怪,呵呵,像这样的问题javascript存在很多,这也是为什么javascript被大家所诟病了;
引用类型
从上面的例子看,有很多也也许会有疑问,怎么难道函数不是对象吗?对象不是对象吗?
这个时候,我们就需要instanceof来判断了;
console.log(fnFun instanceof Object) //true
console.log(oObj instanceof Object) //true
很显然数组和对象都是对象,属于对象的一个分支吧;但是函数不一样;
你知道蛋生鸡鸡生蛋的故事吗?哦,知道!
那你知道函数与对象的故事吗?哦,不知道!那好吧,我告诉你;
函数是对象,对象是由函数创造的,这就是函数与对象的关系;
这也太简单了吧,是的,就是这么简单;看下面列子:
//数组作为对象这样创建;var aArray = [1,2,3,4];其实就是下面写法的简写
var aArray = new Array();
aArray[0] = 1;
aArray[1] = 2;
aArray[2] = 3;
aArray[3] = 4;
//而Array又是个函数;这说明数组对象是由函数创建的;
//对象作为对象这样创建:var oObj = {};其实也是下面写法的简写
var aArray = new Object();
//而Object又是个函数;这说明对象对象是由函数创建的;
所以说函数与对象之间的关系就是包含与被包含的关系;
总结
从上文我们可以得出了一下结论,值类型除了null都不是对象,一切引用类型和null都是对象,所以javascript中一切皆对象,确切说应该是一切引用类型都是对象;
本篇文章讲到这里了,如果有不正确的地方,还望指正,共同学习,共同进步,感谢阅读;
微信搜索关注公众号 【大前端js】,回复vue教程,react教程,webpack实战等等,获得不同的视频教程,大量视频教程等你来拿;
原创不易,总结不易,手打不易,转载时请注明出处,谢谢