当我们说“一切皆对象”时,我们到底在说什么
今天,非技术方向的同事问了我一个问题“js中一切皆对象到底是个啥意思,值类型也是?为什么有这个说法呢”(原话),那么,故事就从这里开始
老规矩,纯技术流解释在后面,懒得看废话的同学直接翻到最后,谢谢
首先,刚看到这个问题,我心里居然冒出来一堆很禅意的东西,瞬间觉得自己是不是快成仙了[捂脸]
问题1. JS里是不是一切皆对象呢##
是的
JavaScript作为一门高级语言(脚本),的确一切都是对象,而非基本数据类型。而且不止JS,Java、Python等所有高级语言,都是处于“一切皆对象”的状态
问题2. 到底啥叫“一切皆对象”呢##
回答这个问题,我们需要先搞明白,高级语言和底层语言的区别:
底层语言:以C语言为代表,直接操作计算机原始数据;优点在于速度奇高无比,当年我用10台服务器干掉别人200台服务器,就是靠的这个;而缺点同样明显,不安全,你犯下的一个小错误,直接可以把系统崩掉,因为在你的程序和系统之间没有任何中间环节
高级语言:以Java为代表的,从不操作底层数据,对原始数据进行封装然后操作;优点是安全、稳定;缺点自然就是性能确实够低,毕竟任何操作都是在“虚拟层”里完成的(JVM和V8都算),任何操作都得经过人家倒手一遍才行
那么,问题来了
问题3. 现在我们来回归一下本质:到底什么是“对象”##
在我眼里看来,对象其实有两重含义
一种思想、工具:###
-
人类毕竟是生物,脑容量究竟是有限的,所以无法理解过于复杂的东西;为了降低复杂度,至少降低到程序员能理解的程度,我们需要忽略大部分细节,把精力集中到问题主干上;面向对象的核心就在这里,通过封装屏蔽掉各种细节,帮助人们把精力集中到主要结构上
-
简单的例子是,你从来不用在写程序时关心Date.getFullYear、ng-directive、data-role和render的实现细节,否则你智商再高也写不出大型程序
一种结构、包装:###
-
从另一种程度上,面向对象说的是一种结构,对硬件基础数据进行包装、添加更多功能,使其易于操作、安全稳定,而当我们说“一切皆对象”时,其实是说的这层意思
-
简单的例子是,C语言的原始字符串就是一段连续内存,没有length、没有match、没有charAt,也没有compareTo;不但难以操作,而且还非常容易出问题(你别告诉我没见过内存溢出,谁都年轻过,不丢人)
喜闻乐见的示意图###
所以,我们明白了“一切皆对象”是真的,那么,两个问题:
-
这样好吗
-
对我们意味着什么
这样好吗##
如果时间回到15年以前,我一定是坚决的“性能派”,脑子里只想着性能必须优化到极致、性能压倒一切、性能就是正义之类的
不过人毕竟会变得成熟,至少目前我看来可维护性和性能同样重要,甚至性能不敏感的应用中可维护性才是压倒一切的,毕竟当年24小时必须保持3个手机满电的日子真心不是人过的
首先,我们会发现对象这种东西,确实是性能的大敌,但它对安全性和易用性又有无可匹敌的优势
其次,要分场景对待,对于人造航天器那种1个字节就是几千美金的应用,没人会去用OOP;而你写个JS,8个G的内存一多半都用不上的情况下,性能倒还真不是最重要的
对我们意味着什么##
没意味啥,JS又没有本地内联代码,你担心这事儿干啥
接下来说点结论吧
=纯技术流的分割线=
1. JS中一切皆是对象,或者说一切皆封装,而非原始数据
2. 这样会牺牲性能,但对安全性和易用性有巨大提升
3. 对于前端这种“非军”、“非底层”程序而言,这样并没有任何问题
=end of 纯技术流的分割线=
家里快没电了又懒的冲,过得担惊受怕的,啥时候支付宝不光能充电还能查询剩余电量就好了啊 @马云