Javascript作为一个客户端的执行脚本语言,越来越受到行内的关注。
开始在学习javascript时,根本没有对这种语言有深层次的理解,就开始使用了。
起初只以为js的作用主要就是做本地化数据验证的,随着时间的增长,越发发现javascript的潜力很大。尤其在使用了Jquery和YUI之后。
首先下面这篇文章介绍的是JS的基础。
关于JS的学习资料有很多,如果只是用JS做做数据验证或者DOM控制,可能和这篇文章干系不大。但如果你对你new一个对象时,它内部操作是什么,或者,究竟Jquery和YUI这些JS的库,内部如何实现很感兴趣的话,可能这篇文章对你会有所帮助。
这些内容本来就很枯燥,我尽量尝试写的易懂一些吧。本人能力有限,有误的地方希望能指出。
浏览器一般会先下载JS文件到本地,然后解析,再执行。
下文主要是来自richie的博文,加上我参考其他资料所注解和一些文字的修正。
主要涉及内容是:Javascript的数据类型,Prototype机制,对象模型,执行机制,闭包。
谈到闭包,很多人跳过JS原理,翻查了大量的资料都不是很理解它的概念。其实要认识闭包,对JS中函数,变量,作用域这些知识的认识是必须的。
数据类型
基本数据类型:是JS语言最底层的实现。
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的方式去产生数字。用直接量即可。