写在前面

网上非常多都在说”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

nullundefined呢?我们接着摸。

首先是nullnull是一个关键字,表示“空值”,我们对null执行typeof操作,输出结果是object,所以我们可以把null看成一个特殊的对象,这个对象表示一个“空对象”(突然想到了白马非马论),即便是一个“空对象”,它也是一个对象。这个小伙伴们可以理解一下。

然后是undefinedundefined是另一个表示“空值”特殊值,它表示未定义,当我们对变量只声明没有初始化时,输出为undefined,当我们引用一个不存在的属性时,输出也为undefined,小伙伴们可以自行验证,但是请注意它并不是一个关键字,它是一个变量,而且是一个全局变量,我们可以验证一下:

alert(undefined in window)

输出为:

true

结果证明undefined确实是一个全局变量。

同样,我们用typeof来看一下undefined的类型,输出为undefined。这严格表明undefined是这个类型的唯一成员,顺带提一句,nulltypeof虽然是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楼博主也有这样的回复内容
原文:http://www.cnblogs.com/myvin/p/4660138.html
注:在秘密花园中看到js一切皆对象,就认为如此了。但是今天复习js的基本类型和引用类型的时候,发现红宝书里说基本类型不是对象。遂发现这篇文章,转载以码。

JS中是否一切皆对象 ?相关推荐

  1. JS入门篇-万物皆对象

    万物即是对象,这是我看<悟透javascript>第一部分最强烈的印象.接下来我来理一下书中第一部分的脉络. 书中告诉我们,在编程的世界里就是数据和实现的逻辑,接下来讲了在JS中,万物皆是 ...

  2. JS中怎样使用Date对象加减日期

    var date = new Date(2018,0,7)//新建一个时间,用于表示2018年1月7日. 为什么用0表示1呢,这是一个js的设计缺陷,0-11表示1-12月. 日期相加 如果date要 ...

  3. js中判断两个对象是否相等。

    js中判断两个对象是否相等. js中的Object.Array.Function等复杂数据类型,是无法直接用==和===操作符进行比对的. Object对比 const tar = { name:'张 ...

  4. java和js中遍历数组和对象的总结

    java和js中遍历数组和对象的总结 在这儿写遍历数组和对象,权当复习和总结 1.java中数组的三种初始化方法 ①静态初始化 [java] view plaincopy 1. int[] arr = ...

  5. JS中 new FormData() - FormData对象的作用及用法

    JS中 new FormData() - FormData对象的作用及用法 js FormData 方法介绍 formData是ajax2.0(XMLHttpRequest Level2)新提出的接口 ...

  6. JS中判断对象是对象还是数组

    JS中判断对象是对象还是数组的方法 JS中判断对象是不是数组的方法 JavaScript中检测对象的方法  1.typeof操作符  这种方法对于一些常用的类型来说那算是毫无压力,比如Function ...

  7. 简单聊聊js中的内置对象

    文章目录 一.Map对象 1.常用属性和方法 2.示例 二.Set 1.属性和方法 2.示例 三.Date对象 1.创建Date对象 1.1.*new Date() ;* 2.2.*new Date( ...

  8. js中的内置对象(详细篇)

    在js里,一切皆为或者皆可以被用作对象.可通过new一个对象或者直接以字面量形式创建变量(如var i="aaa"),所有变量都有对象的性质.注意:通过字面量创建的对象在调用属性和 ...

  9. new 实例化对象是啥意思_二. 初步认识JS中的类和对象

    1 构造函数的定义 在JS中, 没有类(class)的概念, 主要是通过构造函数来模拟的. 语法 function 构造函数名 () {// 函数体} 使用function关键字表示定义一个构造函数 ...

最新文章

  1. svn的merge使用例子
  2. linux移植会话层层协议,Linux内核移植-南京林业大学毕业设计.DOC
  3. Qt 调用 Windows 接口实现窗口置顶
  4. 面向对象编程 object oriented programming(OOP)(第二篇)
  5. 一文详解PolarDB披荆斩棘的“秘密武器”
  6. 初学Hibernate
  7. 5天玩转mysql视频教程_六天带你玩转MySQL
  8. AI+混合云模式,如何最大化挖掘数据价值?
  9. 如何弹出一个模式窗口来显示进度条 .
  10. Final Cut Pro X for Mac(fcpx视频剪辑)中文版
  11. Charles 4.2 HTTPS抓包,乱码设置,证书信任,证书安装
  12. endnote初始化数据库支持_考前复习必备MySQL数据库(关系型数据库管理系统)
  13. 百度之星程序设计大赛
  14. 如何使用PDF编辑软件给PDF删除页码
  15. codeup3692 星期英文单词
  16. 通过you-get在哔哩哔哩下载视频报错处理
  17. python snmp
  18. Python程序员职业现状分析,想提高竞争力,就要做到这六点
  19. Word2Vec增量训练实现
  20. Java 1077 互评成绩计算

热门文章

  1. 告别龟速,极速克隆 PX4/ArduPilot
  2. 数字藏品APP系统开发|数字藏品系统引见
  3. 基于vue构建前端应用
  4. 5行代码找出100以内所有的合数
  5. 小尼机器人_机器人卖车?“小尼”已悄悄的来到了深圳
  6. 索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!
  7. CSS实现自适应布局:子元素项目整体居中,内部项目左对齐
  8. 波斯顿房价预测线型回归
  9. GO --微服务框架(二) goa
  10. 珂朵莉与斯卡布罗集市