JavaScript“并非”一切皆对象

网上非常多都在说”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的一切都是对象或者可以看成对象。当然,这只是一家之言,也欢迎小伙伴们分享自己的理解。我去,到点了,该睡午觉了。沙扬娜拉。

时间: 2024-10-31 01:07:52

JavaScript“并非”一切皆对象的相关文章

javascript之一切皆为对象2

其实呢,"函数function"和"对象object"之间还有这么一句话:对象是通过函数来创建的,而函数却又是一种对象. 这个函数是一种对象,上节中"Javascript之一切皆为对象1"也清楚的阐述了. 但这个对象又是通过函数来创建的,咳咳,似乎在平时代码中也是哈. 请看下面代码 function Fn(){ } var fn =new Fn(); 你可能会说,哥们,不对吧,不是我们也曾写过如下代码吗!! var obj = {}; 哈,是的哈

javascript之一切皆为对象3

在前面两个章节"Javascript之一切皆为对象1"和"Javascript之一切皆为对象2"中,曾提到: 1."一切(引用类型)皆为对象" 2. "每个函数都有一个prototype" 3. "每个对象都有一个__proto__" 那么,问题来了,在随笔"Javascript之一切皆为对象2"中,不是有下图么 那,根据"一切(引用类型)皆为对象",图中的函数Fn不

Java之路(一) 一切皆对象

Java语言假设我们只进行面向对象的程序设计,即在开始用Java进行设计前,我们需要将思想切换到面向对象的世界中. 1.用引用操纵对象 每种编程语言都有自己操纵内存中元素的方式.是直接操纵元素还是用某种基于特殊语法的间接表示来操纵对象? Java中将一切都视为对象,这样就可采用较为单一固定的语法. 虽然将一切都看做对象,但操纵的标识符实际上是对象的引用. 拥有一个引用,并不一定与一个对象相关联. 2.必须由使用者创建所有对象 1).Java内存分配 五个地方可以存储数据: a.寄存器.位于处理器

详解javascript中的this对象

详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的设计模式来实现面向对象的编程,其中this "指针"就是实现面向对象的一个很重要的特性.但是this也是Javascript中一个非常容易理解错,进而用错的特性.特别是对于接触静态语言比较久了的同志来说更是如此. 示例说明 我们先来看一个最简单的示例: <script type=&q

JavaScript的内置对象及其时间对象

0413 对象的类型是object. JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... javaScript中万事万物皆对象 删除对象的属性:delete 例:delete obj.bianmei this 这个对象,在不同使用场景代表不同对象    1.对象方法里的this就是当前对象本身 例:var obj = { name:‘张三’ say:function(){ //this就是“我”的意思 console.log(this.name)} } obj.say()

JavaScript强化教程-cookie对象

Cookie对象: 是一种以文件(Cookie文件)的形式保存在客户端硬盘的Cookies文件夹中的用户数据信息(Cookie数据).Cookie文件由所访问的Web站点建立,以长久的保存客户端与Web站点间的会话数据,并且该Cookie数据只允许被所访问的Web站点进行读取. 存储 cookie <script>     function saveCookie(cname,cvalue,exdays){         var d = new Date();         d.setTim

JavaScript学习笔记——BOM_window对象

javascript浏览器对象模型-windwo对象(上) BOM Browser Object Model window对象 是BOM中所有对象的核心. 一.属性 1.(位置类型-获得浏览器的位置) IE: window.screenLeft 可以获得浏览器距屏幕左上角的左边距 window.screenTop 可以获得浏览器距屏幕左上角的上边距 //IE //左边距 //alert(screenLeft) //上边距 //alert(screenTop) FF: alert(screenX)

JavaScript Math和Number对象

Math 对象:数学对象,提供对数据的数学计算.如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. Number 对象 :Js中提供数字的对象.包含整数.浮点数等等.并提供数字的类型转换.小数点截取等方法. 1. Math 对象 1.1 介绍 Math 对象,是数学对象,提供对数据的数学计算,如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 1.2 构造函数 无 :Math 对象无构造函数,无法被初始化,只提供静态属性和方法. 1.3 静态属

在JavaScript中重写jQuery对象的方法

jQuery是一个很好的类库,它给我们解决了很多的客户端编程,任何东西都不是万能的,当它不能满足我们的需求时我们需要对它进行重写,同时也不要影响其原有的功能或者修改其原有的功能:我现在的web应用程序大多数时候的数据交互都是通过Ajax来完成的,这样就可以将一些隐藏字段的数据保存在HTML标签的属性中,使HTML标签的代码量减少,如:ID,Timestamp等等,这些不需要用户输入但又不得不提交的字段,通过表单提交的做法是 <input name="ID" value="