[JavaScript]一切都是对象

    突然发现很早以前我们公司老赵发给我的关于Javascript的pdf,觉得很有意思,今天把这篇博客修改一下。 

    编程的世界里有两种元素,一个是数据,另外一个是代码。而复杂的编程世界就是由数据和代码千丝万缕的纠缠暧昧关系而形成的。 

    数据天生就是文静的,总想保持自己固有的本色;而代码却是认为创造的,他总想改变这个世界。因此,它创造了那些杂乱的算法与子程序,以及纠缠不清的复杂数据结构,数据与代码分离难维护。因此一种新的面向对象编程的思想诞生了,面向对象的思想首次把数据和代码结合成统一体,并以一个简单的对象概念呈现给编程者。 

    JavaScript作为一种编程语言,把那些复杂的纠缠关系都用Function一直形式表现出来,在它的世界里一切都是对象。数据是对象,数组是对象,对象是对象,函数也是对象。

     数据是对象?不对吧!像number、string、boolean、undefined不就是基本的值类型吗? 它们可都不是对象。
好吧,那都被你们发现了,那我也只能承认这句句说不妥了;但我之所以这么说,因为我个人觉得,Javascript的设计者Brendan Eich先生本身也有这个意图;但是怎奈,编程本身就是由数据和代码组成,怎么能少了数据呢。 

    关于我对作者的这个想法,我们来看一个有意思的地方
var str=”123″;console.log(str.length);
上面我定义了一个基本的字符串类型,但却可以直接调用length这个属性,要知道对象才有属性。当然你可能又会说,这不就是Javascript内部进行包装了吗,这有什么,很多语言都有。好吧,又是我自作多情了。

    判断一个变量是值类型还是应用类型,非常简单,直接用typeof这个方法就可以了。

      看到上面的结果,也许你会马上反驳说:不对,我还看到了function类型,并不是只有基本的值类型和object。但要知道的是function也是对象,至于这边为什么不输出object类型,而是function,那肯定有他的深意在的(关于这个不同,后面有机会在聊)。 

    这里还有个比较奇怪的地方就是null返回的既然也是object的类型,有人说这个是错误的,曾经作者也试图把null的返回类型改成null,但修改后发现很多网站都无法正常运行,没办法只好保持了object类型,这点也是为什么我认为作者设计初心是一切都是对象的原因之一,当然你也可以说这是设计者的bug。

     既然一切都是对象,那我们首先要搞清楚“对象”的概念,否则就不要怪JavaScript嘲笑你找不到对象了。其实很简单:对象是属性的集合。我们知道在c#中,对象有字段、属性、方法等并且规定的非常严格。但在JavaScript中就比较随意了,对象里只有属性,方法也是属性。另外JavaScript是一种弱类型语言,定义一个变量后,可以把任意类型的值赋值给它。