JavaScript 对象模型-执行模型(一)

来源:互联网 发布:2015编程语言排行 编辑:程序博客网 时间:2024/06/10 09:46

Javascript作为一个客户端的执行脚本语言,越来越受到行内的关注。

开始在学习javascript时,根本没有对这种语言有深层次的理解,就开始使用了。

起初只以为js的作用主要就是做本地化数据验证的,随着时间的增长,越发发现javascript的潜力很大。尤其在使用了Jquery和YUI之后。

 

首先下面这篇文章介绍的是JS的基础。

关于JS的学习资料有很多,如果只是用JS做做数据验证或者DOM控制,可能和这篇文章干系不大。但如果你对你new一个对象时,它内部操作是什么,或者,究竟Jquery和YUI这些JS的库,内部如何实现很感兴趣的话,可能这篇文章对你会有所帮助。

这些内容本来就很枯燥,我尽量尝试写的易懂一些吧。本人能力有限,有误的地方希望能指出。

 

浏览器一般会先下载JS文件到本地,然后解析,再执行。

下文主要是来自richie的博文,加上我参考其他资料所注解和一些文字的修正。

主要涉及内容是:Javascript的数据类型,Prototype机制,对象模型,执行机制,闭包。

谈到闭包,很多人跳过JS原理,翻查了大量的资料都不是很理解它的概念。其实要认识闭包,对JS中函数,变量,作用域这些知识的认识是必须的。

 

数据类型

基本数据类型:是JS语言最底层的实现。

data structure implementation model

Javascript内置数据结构(build-in data structure),数据结构是不能通过JS访问的。

Javascript内置构造器(build-in constructor),在你new一个对象时会调用到。

Javascript内置对象(build-in object),我们在JS里面可以调用的数据类型。通常我们在JS中使用时会用首字母大写,例如Number。

 

 

注:你可以使用typeof来判断一个变量是什么类型。下面是基本类型:

undefined,未定义,值类型

number,数值,值类型

string,字符串,值类型

boolean,布尔值,值类型

object,对象,引用类型,一个无序属性的集合,这些属性的值为简单数值类型、对象或者函数。

function,函数,引用类型,函数是对象的一种,实现上内部属性[[Class]]值为"Function",表明它是函数类型,除了对象的内部属性方法外,还有[[Construct]]、[[Call]]、[[Scope]]等内部属性。函数作为函数调用与构造器(使用new关键字创建实例对象)的处理机制不一样(Function对象除外),内部方法[[Construct]]用于实现作为构造器的逻辑,方法[[Call]]实现作为函数调用的逻辑。

另外还有扩展类型:

Date,日期对象,引用类型,based object

RegExp,正态表达式,引用类型,based function

NaN,非数字,值类型,based number

开始很容易混淆undefined和NaN,其实

undefined就是指数据没有值(a piece of data is undefined when it has no value)。

NaN则是一个警告值,你使用了非数字参与计算(NaN is a value that isn't a number even though you're expecting the value to be one)。

 

有下列两点需要记住:

1.Function, Object, Boolean, Number, String, Date, Array, RegExp等都是JavaScript语言的内置对象,它们都可以看作是函数的派生类型,例如Number instanceof Function为true,Number instanceof Object为true。在这个意义上,可以将它们跟用户定义的函数等同看待。
2.它们各自可以代表一种数据类型,由JS引擎用native code或内置的JS代码实现,是暴露给开发者对这些内置数据类型进行操作的接口。在这个意义上,它们都是一种抽象的概念,后面隐藏了具体的实现机制。

 

看完上述介绍,我们来举几个例子:

var num1 = new Number(123);

var num2 = 123;

var num3 = Number(123);

num1 == num2;//true

num1 === num2;//false

num2 === num3;//true

num1 instanceof Number;//true

num1 instanceof Object;//true

上面这个例子,说明了几点:

1. "=="是比较值,"==="是引用比较。"=="在比较时会进行类型转换(例如1=='1',是true),所以只要使用"==="就可以了。 

2.num1是Number的实例,也是Object的实例。

3.Number(123)可以视为强制类型转换。

4.Number(123)和直接量123是等价的。

*需要注意的是,上面的例子只是为了说明数字的关系。在现实使用JS的时候,没有必要使用new Number的方式去产生数字。用直接量即可。