当我们说“一切皆对象”时,我们到底在说什么

今天,非技术方向的同事问了我一个问题“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;不但难以操作,而且还非常容易出问题(你别告诉我没见过内存溢出,谁都年轻过,不丢人)

喜闻乐见的示意图###


所以,我们明白了“一切皆对象”是真的,那么,两个问题:

  1. 这样好吗

  2. 对我们意味着什么

这样好吗##

如果时间回到15年以前,我一定是坚决的“性能派”,脑子里只想着性能必须优化到极致、性能压倒一切、性能就是正义之类的

不过人毕竟会变得成熟,至少目前我看来可维护性和性能同样重要,甚至性能不敏感的应用中可维护性才是压倒一切的,毕竟当年24小时必须保持3个手机满电的日子真心不是人过的

首先,我们会发现对象这种东西,确实是性能的大敌,但它对安全性和易用性又有无可匹敌的优势
其次,要分场景对待,对于人造航天器那种1个字节就是几千美金的应用,没人会去用OOP;而你写个JS,8个G的内存一多半都用不上的情况下,性能倒还真不是最重要的

对我们意味着什么##

没意味啥,JS又没有本地内联代码,你担心这事儿干啥


接下来说点结论吧

=纯技术流的分割线=

1. JS中一切皆是对象,或者说一切皆封装,而非原始数据
2. 这样会牺牲性能,但对安全性和易用性有巨大提升
3. 对于前端这种“非军”、“非底层”程序而言,这样并没有任何问题

=end of 纯技术流的分割线=

家里快没电了又懒的冲,过得担惊受怕的,啥时候支付宝不光能充电还能查询剩余电量就好了啊 @马云

posted @ 2016-12-06 09:39  我叫blue  阅读(931)  评论(0编辑  收藏  举报