JavaScript“并非”一切皆对象
上一篇:《函数声明和函数表达式——函数声明和函数表达式的异同》
p{font-size:14px;
}
#写在前面
网上非常多都在说”JavaScript一切皆对象“,那么这个"一切"到底是实实在在的"一切",还是一个虚数?也有看过网上的文章,有的三纸无驴,就是抄抄概念,有的也只是解释了一部分,并没有给出确切的结论。那么我想结合自己的理解,给出一个确切的结论。
当然,结论嘛,自然要放在文章结尾。小伙伴们接着往下看。
数据类型概要
进入之前,有必要概要地说一下js的数据类型,当然小伙伴们也可以直接pass。
js的数据类型有两种:原始类型和对象类型。其中原始类型又包括以下几种类型:数字型、字符串型、布尔值、null和undefined。其中对象类型包括用户通过各种方法自己创建的对象和一些函数数组啊之类的特殊对象。
原始值
原始值不可修改
说到了原始值,就有必要再简单聊一下原始值的一些东西。
首先给出个结论:
原始值是不可以修改的,是什么就是什么,就算强迫也强迫不来(这是倔强呢)。数字、布尔值、null、undefined很显然是不能修改的,5就是5,它不能是6,但是对于字符串可能有些小伙伴会有疑惑:字符串怎么不能修改啊,那么多的字符串方法都可以修改字符串呢。为了解释,还是先来个热乎乎的例子爽一下。
var string='The handsome have five girlfriend.';
string.toUpperCase();
我们定义了一个“帅哥有五个女朋友”的字符串(其实屌丝也有五姑娘啊,the diors have five girlfriend
啊),然后调用了toUpperCase()
方法将字符串转为大写。我们输出一下:
alert('原来的字符串是:' + string + '修改后的字符串是:' + string.toUpperCase());
OK,输出结果是这样的:
原来的字符串是:The handsome have five girlfriend. 修改后的字符串是:THE HANDSOME HAVE VIFE GIRLFRIEND.
看到这里,一切都赤裸裸了:
看上去字符串的方法返回了修改后了的字符串,实际上是返回了一个新的字符串,即是两个字符串,糟糠之妻还在榻上(其他的方法小伙伴也可以试试)。
那么,聊到这里,可以看到原始值确实不可以修改的,即原始值是不可变的。
原始值是对象吗
接下来,我们切入正题:原始值到底是不是对象?
首先,对象类型自然是对象,至于原因嘛,就是“证明我妈是我妈”。至于原始类型是否为对象,我们先上字符串类型来说明。
照旧先来个新鲜出炉的血淋淋的例子:
var string='Make Life Get Better';//这不是MLGB吗!!!!!!!!!
alert(string.length);
这个MLGB是个字符串,按理来说不应该像对象一样有属性啊,但是事实呢?我们再看下这新鲜出炉的血淋淋的输出:
20
结果是这个原始值字符串确实使用了字符串对象才有的length
属性,输出了string
字符串的长度。
ok,而正是因为这样我们才有理由把字符串类型看成对象。那这是为什么呢?这里就涉及到了包装对象的概念。
包装对象
其实在上面的例子中在读取字符串的时候会创建一个对象,但是这个对象只是临时的,所以我们称它为临时对象,学术名字叫包装对象。说它临时,是因为我们在读取它的属性的时候,js会把这个string
字符串通过new String()
方式创建一个字符串对象,有了对象自然就有了属性,但是这个对象只是临时的,一旦引用结束,这个对象就被销毁了。
然后再引用《JavaScript权威指南》里面的一句话补充一下:
其实(包装对象)在实现上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样的。
同理,数字、布尔值在读取属性的时候也可以通过自己的构造函数来创建自己的一个临时对象,并像对象一样(就是一个对象)引用各自的属性,所以,字符串、数字、布尔值都可以看成是对象,注意,这里是看成对象,他们并不是真正的对象,也就是严格来说,它们并不是对象,因为对象是可变的,可以修改属性,而原始值是不可变的是不可修改的(看上面),但是他们的包装对象和对象是非常相似的,可以读取包装对象的属性,所以我们只是说成,可以看成对象。
但是请注意一点:
因为创建的只是一个临时对象,写的属性只存在于临时对象上,引用完后随即销毁,写的属性自然也烟消云散,皮之不存,毛将焉附就是这个道理。创建的临时对象只可以读属性,不可以写属性。感兴趣的可以赋一个属性,然后读取该属性看看。为了给大家节省几个字节的流量,例子就不在这儿写了。
null
&undefined
那null
和undefined
呢?我们接着摸。
首先是null
,null
是一个关键字
,表示“空值”,我们对null
执行typeof
操作,输出结果是object
,所以我们可以把null
看成一个特殊的对象,这个对象表示一个“空对象”(突然想到了白马非马论),即便是一个“空对象”,它也是一个对象。这个小伙伴们可以理解一下。
然后是undefined
,undefined
是另一个表示“空值”特殊值,它表示未定义,当我们对变量只声明没有初始化时,输出为undefined
,当我们引用一个不存在的属性时,输出也为undefined
,小伙伴们可以自行验证,但是请注意它并不是一个关键字,它是一个变量,而且是一个全局变量,我们可以验证一下:
alert(undefined in window)
输出为:
true
结果证明undefined
确实是一个全局变量。
同样,我们用typeof
来看一下undefined
的类型,输出为undefined
。这严格表明undefined
是这个类型的唯一成员,顺带提一句,null
的typeof
虽然是object
,但是认为null
是它自有类型的唯一成员。但是undefined
并没有包装对象,typeof
类型也不是object
,和对象并没有沾亲带故的关系,所以我并不把它看成是对象。
小了个结
当然,以上只是简单的解释,如果往深处挖水还很多(是不是说水还很深合适一些。。。),但是可以简单的来一个结论:除了undefined
,JavaScript的一切都是对象或者可以看成对象。当然,这只是一家之言,也欢迎小伙伴们分享自己的理解。我去,到点了,该睡午觉了。沙扬娜拉。
补充内容
2015/8/23
9楼网友manxisuo提出:用instanceof
判断null
会打印出false
,在此我说下我的理解:
- console.log(typeof null)是true,console.log(null instanceof Object)是false。
- 1、instanceof是用来判断引用类型的,而null是五种基本类型中的一种,用instanceof来判断基本类型都是返回false的。我认为这是比较直接的原因。
- 2、第二种解释我认为其实并不太对,但是我也曾经这么理解过,所以拿出来一块儿看看。instanceof是判断是否为引用类型的实例,null是一个空引用,并不是object实例化出来的,所以会打印出false。而且因为null是一个比较特殊的只包含自己的基本类型,所以也得特殊对待。
- 3、你还是看第一种解释吧。
- PS:10楼博主也有这样的回复内容
作者:myvin
原文出处:http://www.cnblogs.com/myvin/p/4660138.html
转载请记得说明作者和出处哦-.-
下一篇:《拥Bootstrap入怀—导航栏篇》
JavaScript“并非”一切皆对象的更多相关文章
- JavaScript中并非一切皆对象
对象是js中的基础以及核心,在js中有六种主要类型:string number boolean null undefined object 除了oject类型以为其他五种本身并非对象,null本身 ...
- JavaScript学习笔记之对象
目录 1.自定义对象 2.Array 3.Boolean 4.Date 5.Math 6.Number 7.String 8.RegExp 9.Function 10.Event 在 JavaScri ...
- javascript之一切皆为对象3
在前面两个章节“Javascript之一切皆为对象1”和“Javascript之一切皆为对象2”中,曾提到: 1.“一切(引用类型)皆为对象” 2. “每个函数都有一个prototype” 3. “每 ...
- javascript之一切皆为对象2
其实呢,“函数function”和“对象object”之间还有这么一句话:对象是通过函数来创建的,而函数却又是一种对象. 这个函数是一种对象,上节中“Javascript之一切皆为对象1”也清楚的阐述 ...
- Javascript之一切皆为对象1
在javascript的世界里,有这么一句话,一切皆为对象. 但是这个对象,应该怎么理解呢? OMG,难道值类型也是对象?!! 当然,不是. 准确地讲是对于“引用类型”而言. 那,在JavaScrip ...
- JavaScript系列----一切皆是对象
1.判断对象类型 1.1.typeof 运算符 首先要认识到,typepof是一个运算符,其运算需要一个参数,返回值是参数的类型. typeof使用方法 typeof parameter //使用方法 ...
- Javascript万物皆对象?
在javascript的世界里,有这么一句话,万物皆对象. 但是这个对象,应该怎么理解呢? exm........??,难道值类型也是对象?!! 当然,不是. 准确地讲是对于“引用类型”而言. 那,在 ...
- 深入浅出javascript(六)对象
2.为什么一切皆对象? <Javascript权威指南>解释了这个问题,问题的起源在于,如果typeof(字符串)返回的是string,并非object,那么为什么字符串也是对象呢? 简单 ...
- javascript笔记整理(对象基础)
一.名词解释 1.基于对象(一切皆对象,以对象的概念来编程) 2.面向对象编程(Object Oriented Programming,OOP) A.对象(JavaScript 中的所有事物都是对象) ...
随机推荐
- 【bzoj1029】【JSOI2007】建筑抢修
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 6417 Solved: 2883[Submit][Statu ...
- 二次封装bootstrap-table及功能优化
/** * 设置bootstrat-table * @param params */ function setBootstrapTable (target, params) { // 默认设置表格内容 ...
- Vue.js随笔一(Webpack + Vue.js开发准备,含VNM、NPM、Node、Webpack等相关工具)
想入门工具是必须的,这一章将向大家带来vue.js相关的程序安装步骤. ①首先你需要有一个NVM(一个非常好用的Node版本管理器): 1.NVM下载地址:https://github.com/cor ...
- [LeetCode] 数学计算模拟类问题:加法,除法和幂,注意越界问题。题 剑指Offer,Pow(x, n) ,Divide Two Integers
引言 数学计算的模拟类题目,往往是要求实现某种计算(比如两数相除),实现的过程中会有所限定,比如不允许乘法等等. 这类题目首先要注意计算过程中本身的特殊情况.比如求相除,则必须首先反映过来除数不能为0 ...
- 解决VS Code编译调试中文输出乱码
最近尝试用VS Code配置了C和C++的编译调试环境,结果遇到了中文输出乱码问题,查阅网上竟然还没有相关问题,有怀疑是mingw中文支持问题,但最后证明是VS Code编码问题. 解决方案: 文件- ...
- UVA 12520 Square Garden
https://vjudge.net/problem/UVA-12520 题意:n*n网格中染色m个格子,染色格子的最长轮廓线 贪心 将格子分为4类 1.隔一个选一个,互不相邻的格子 2.4个角上的格 ...
- 搜索:DLX算法
精确覆盖问题:在一个0-1矩阵中,选定部分行,使得每一列都有且只有一个1.求解一种选法 舞蹈链(Dance Link),也就是一个循环十字链表,可以快速的删掉和恢复某行某列 结合了舞蹈链的搜索就称作D ...
- CS48 D BIT
统计一个点对应的和它严格右下方的点,点对数量.由于数据规模很大,不能直接上二维的前缀和,先排一维序,然后用BIT维护前缀和即可. /** @Date : 2017-09-14 20:17:30 * @ ...
- js获取上、下级html元素 js删除html元素方法
js获取下级html元素:htmlEle.childNode; js获取上级html元素:htmlEle.parentNode; js删除当前html元素: htmlEle.removeNode(tr ...
- WPF集合控件实现分隔符(ItemsControl Separator)
在WPF的集合控件中常常需要在每一个集合项之间插入一个分隔符样式,但是WPF的ItemsControl没有相关功能的直接实现,所以只能考虑曲线救国,经过研究,大概想到了以下两种实现方式. 先写出Ite ...