男人的世界只有 “女人” ,Javascript世界就只有 “对象”
就在今天,本司某个None Geek同事问了我一个意味深长的问题,如下:
“JS中提到的一切皆为对象到底是个啥子意思咧,数值类型也是吗? 为什么有这个说法呢~”(原话)
那么,今天的故事就从这里拉开帷幕,嘿嘿 ~~
根据鄙人的老传统,纯技术流派的解释将直接甩到最后,省得让我的读者数量锐减,先说点人话哈,懒得看废话的G客同学们可以直接干到页底,相信各位专家学者也不想听我瞎哔哔,本人这里谢过 , 请勿拍砖, 抵制键盘侠和吃瓜群众, 咱要说就说点儿有水平有技术含量滴 @_@
首先,刚看到这个问题,我心里居然冒出来一堆很有哲学及其儒家禅意的东西,瞬间感觉自己是不是快成仙了(领悟了传说中的第七感!!)[捂脸]
问题1. JS里是不是一切皆对象呢?
是的
JavaScript作为一门高级语言(脚本),的确一切都是对象,而非基本数据类型。而且不止JS,Java、Python等所有高级语言,都是处于“一切皆对象”的状态
问题2. 到底啥叫“一切皆对象”呢
回答这个问题,我们需要先搞明白,高级语言和底层语言的区别:
底层语言:以C语言为代表,直接操作计算机原始数据;优点在于速度奇高无比,当年我用10台服务器干掉别人200台服务器,就是靠的这个(干什么就不说了,给大家点儿悬念);而缺点同样明显,不安全,你犯下的一个小错误,直接可以把系统干崩掉,因为在你的程序和系统之间没有任何中间缓冲环节, 好比高手过招, 一超错整盘全输高级语言:以Java为代表的,从不操作底层数据,对原始数据进行封装然后操作;优点是安全、稳定;缺点自然就是性能确实够低(当然相对来说,只要硬件发展了,任何都是浮云),毕竟任何操作都是在“虚拟层”里完成的(JVM和V8都算),任何操作都得经过人家二手翻译一遍机器才能懂
那么,问题来了~~~~~~~~
问题3. 现在我们来回归一下本质:到底什么是“对象”
在我眼里看来,对象其实有两重含义:
一种思想、工具:
人类毕竟是生物,脑容量究竟是有限的,所以无法理解过于复杂的东西;为了降低复杂度,至少降低到程序员能在单位时间中完成的程度,我们需要忽略大部分细节,把精力集中到问题主干上;面向对象的核心就在这里,通过封装屏蔽掉各种细节,帮助人们把精力集中到主要结构上
简单的例子是,你从来不用在写程序时关心Date.getFullYear、ng-directive、data-role和render的实现细节,否则你智商再高也没时间构建出大型程序
一种结构、包装:
从另一种程度上,面向对象说的是一种结构,对硬件基础数据进行包装、添加更多功能,使其易于操作、安全稳定,而当我们说“一切皆女(dui)人(xiang)”时,其实是说的这层意思
简单的例子是,C语言的原始字符串就是一段连续内存,没有length、没有match、没有charAt,也没有compareTo;不但难以操作,而且还非常容易出问题(你别告诉我没见过内存溢出,谁都年轻过,不丢人)
喜闻乐见的示意图(非技术的朋友可以忽略)
所以,我们明白了“一切皆对象”是真的,那么,两个问题:
这样好吗
对我们意味着什么
这样真滴好吗?
如果时间回到15年以前,我一定是坚决的“性能派”,脑子里只想着性能必须优化到极致、性能压倒一切、性能就是正义之类的
不过人毕竟会变得成熟,至少目前我看来可维护性和性能同样重要,甚至性能不敏感的应用中可维护性才是压倒一切的,毕竟当年24小时必须保持3个手机满电的日子真心不是人过的
首先,我们会发现对象这种东西,确实是性能的大敌,但它对安全性和易用性又有无可匹敌的优势
其次,要分场景对待,对于人造航天器那种1个字节就是几千美金的应用,没人会去用OOP;而你写个JS,8个G的内存一多半都用不上的情况下,性能倒还真不是最重要的
所以说: 不同的实际环境,造就了风格不同的解决方案
对我们意味着什么
没意味啥,JS又没有本地内联代码,你担心这事儿干啥
编程哲学就是这么来滴~
JS中一切皆是对象,或者说一切皆封装,而非原始数据
这样会牺牲性能,但对安全性和易用性有巨大提升
对于前端这种“非军”、“非底层”程序而言, 并没有任何问题
来源:igeekbar