JavaScript 是一门面向对象的编程语言,但是区别与我们熟知的java、c#等强类型的面向对象的语言。JavaScript的面向对象是基于对象原型的面向对象,而不是像java 、c#等强类型语言一样是基于类的面向对象。理解这一点很重要,这是JavaScript与其他面向对象语言最大的区别。
JavaScript也是一门日益流行的编程语言。注意,笔者始终强调,它是一门编程语言,一门面向对象的编程语言,不再是一门简单的寄生在浏览器中运行的脚本语言。
JavaScript可以运行在客户端(通常是web浏览器)操作html dom 使之显示动态的效果,JavaScript也可以运行的服务器端(如nodejs),由服务器提供JavaScript解释器和执行引擎,JavaScript也可编写图像化,文件io 、网络编程、线程开发、甚至游戏开发。总之,JavaScript正在成长成为一门用途广泛、且强大的编程语言----广泛的应用领域、高速的解释执行引擎,灵活多变的弱类型数据结构、强大的函数式编程风格等等,这就是JavaScript!
相信未来的十到二十年后,JavaScript一定会变得超乎我们想象的强大。
JavaScript中数据类型:
Number 数字类型,包括整型、浮点型
String 字符串直接量,字符串变量,字符串对象
Object 对象
Function 函数对象
Array 数组对象
Boolean 布尔值对象
RegExp 正则模式对象
Date 日期对象
Math 数学对象
Error 异常对象
null 空
undefined 未定义
null 和undefined 是JavaScript中的两个特殊的数据类型,也是JavaScript的关键字。对null 执行typeof运算,结果返回‘object’ ,也就是说可以将null认为是特殊的对象值,其含义是‘非对象’,但实际上,通常认为null是它自有类型的唯一一个成员,它可以表示数字,字符串和对象的‘无值’。
undefined则是JavaScript中表示更深层次的‘空值’,它是变量的一种取值,表示变量没有被初始化。在查询对象中不存在的属性或数组中不存在的成员时,会返回undefined,说明属性或成员不存在。如果存在但值为null,则会返回null。
尽管null和undefined是不同的,但它们都表示‘值的空缺’,两者往往可以互换。‘==‘运算符比较二者时返回true(===比较时返回false),在期望是布尔类型的场合使用它们时,则会将它们转为false(假值)。null和undefined都不包含任何属性和方法,这也是与其他值(基本)类型不同的地方。
一般的,JavaScript 的值类型(也称为基本类型)都有直接量和包装对象两种体现形式。比如,我们在代码中直接输入一个 ‘abc’, 那么它就是一个字符串直接量,在JavaScript内存中就存在一个内存区值为‘abc‘。 但是由于我们没有给定一个变量指向这个内存区,所有我们不能使用它。这时我们应该为这个内存区设置一个变量指向(引用)这个内存区。var a='abc'; 这时a就指向了‘abc’。 JavaScript是弱类型语言,实际上你随时可以改变a的指向,指向一个Object对象或一个Array数组等均可。
你可以访问a.length 甚至a.split()方法,你一定会好奇,‘abc’ 这个字符串不是基本类型吗,为什么还可以像对象一样可以有自己的属性和方法呢?
为了解释清楚这个问题,我们必须先了解JavaScript中值类型和对象类型(null 和undefined是2种特殊值类型,我们暂且不提)。JavaScript中虽然有数字、字符串、布尔值、正则模式、日期、数学、函数等类型,但是按照是否具有对象的的特性标准来分,字符串和、数字、布尔都是值类型(仅仅具有值的性质,没有自己的属性和方法),与之相对的Ojbect、Function 、Array、Math 它们天生就有自己的属性和方法,换句话说它们天生就是具有对象特性。(后面我们将会讲到Function 、Array其实也是对象)
那么为什么a.length 、a.split() 调用 时不会出错呢? 因为当你调用一个值类型的属性或方法时,JavaScript自动将值类型a转变为一个临时对象 new String
(a),调用结束后临时对象消失,a又变回了值类型 (转换规则 :字符直接量转变为String对象 ,数字直接量转变为Number对象,布尔直接量则转变为Boolean对象等)
我们再来看下,为什么笔者一直说null和undefined是JavaScript中两种特殊的原始值数据类型。其一,null和undefined 虽具备值的性质,但它们表示‘空值’或'未定义的值',区别于其他值类型,尽管如此,我们一般还是将它们当做值类型。其二,它们不能够转变为对象,区别于对象类型,也就是说你永远不能调用它们的任何属性或方法,而其他值类型都可以转变为对象。