作者 魏楷聪 发布于 2015年01月20日
一个完整的JavaScript实现是由以下3个不同部分组成的:
a. 核心(ECMAScript) b. 文档对象模型(DOM) c. 浏览器对象模型(BOM)
> JavaScript的核心ECMAScript描述了该语言的语法和基本对象
ECMAScript是一个重要的标准,但它并不是JavaScript唯一的部分,当然,也不是唯一被标准化的部分。
ECMAScript描述了以下内容:a. 语法; b. 类型; c. 语句; d. 关键字; e. 保留字; f. 运算符; g. 对象。
ECMAScript仅仅是一个描述,定义了脚本语言的所有属性、方法和对象。其它的语言可以实现ECMAScript来作为功能的基准,JavaScript就是这样。
ECMAScript并不与任何具体浏览器相绑定,实际上,它也没有提到任何用户输入输出的方法。每个浏览器都有它自己的ECMAScript接口的实现,然后这个实现又被扩展,包含了DOM和BOM。
> DOM描述了处理网页内容的方法和接口
DOM(文档对象模型)是HTML和XML的应用程序接口(API)。DOM将把整个页面规划成由节点层级构成的文档。HTML或XML页面的每个部分都是一个节点的衍生物。
DOM通过创建树来表示文档,从而使开发者对文档的内容和结构具有空前的控制力。用DOM API可以轻松地删除、添加和替换节点。
> BOM描述了与浏览器进行交互的方法和接口
BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作。使用BOM,开发者可以移动窗口、改变状态栏中的文本以及执行其它与页面内容不直接相关的动作。BOM只是JavaScript实现的一部分,没有任何相关的标准。由于没有相关的BOM标准,每种浏览器都有自己的BOM实现。
1. 原始值和引用值
在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值。
a. 原始值(primitive value)是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
b. 引用值(reference value)是存储放在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
原始类型占据的空间是固定的,将它们存储在较小的内存区域中——栈中,便于迅速查询变量的值。
引用类型的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。
> (重点)五大原始类型(primitive type):
Undefined、Null、Boolean、Number、String
1. 可以用 typeof 运算符来判断一个变量是属于哪种类型:
"undefined",变量是Undefined型
"boolean",变量是Boolean型
"number",变量是Number型
"string",变量是String型
"object",变量是一种引用类型或 Null 类型
2. Undefined 类型
只有一个值,即undefined(字面量)。当声明的变量未初始化时,该变量的默认值是undefined。但是,值undefined并不同于未定义的值,而typeof运算符并不真正区分这两种值。
var oTemp;
// make sure this variable isn't defind
// var oTemp2;
alert(typeof oTemp); // outputs "undefined"
alert(typeof oTemp2); // outputs "undefined"
alert(oTemp2 == undefined); // cause error
对未定义的oTemp2使用除了typeof之外其它运算符,将引起错误,因为那些运算符只能用于已定义的变量。
当函数无明确返回值时,返回的值也是值undefined。
3. Null 类型
只有一个值,即null(字面量)。用于表示尚未存在的对象。
值undefined实际上是从值null派生来的。
alert(null == undefined); // outputs "true"
4. Boolean 类型
有两个值true和false(即两个Boolean字面量)。
5. Number 类型
既可以表示32位的整数,还可以表示64位的浮点数。直接输入的(而不是从另一个变量访问的)任何数字都被看作Number型的字面量。
整数可以被表示为八进制或十六进制的字面量,但所有数学运算返回的都是十进制结果。
浮点数字面量必须包括小数点和小数点后的一位数字,用它进行计算前,真正存储的是字符串。
一个特殊值:NaN,表示非数(Not a Number)。
alert(isNaN("blue")); // outputs "true"
alert(isNaN("123")); // outputs "false"
6. String 类型
String类型的独特之处在于,它是唯一没有固定大小的原始类型。字符串字面量是由双引号(")或单引号(')声明的。
> 四大引用类型:Object类、Boolean类、Number类、String类
引用来型通常叫作类(class),也就是说,遇到引用值时,所处理的就是对象。ECMAScript定义了“对象定义”,逻辑上等价于其它程序设计语言中的类。
具有等价的原始类型的引用类型:
1. Object 类
Object类自身用处不大,但ECMAScript中的所有类都由这个类继承而来,Object类中的所有属性和方法都会出现在其它类中。
属性 prototype:对该对象的对象原型的引用(指针)。对于Object类,该指针指向原始的object()函数。
方法 prototypeIsEnumerable(property):判断给定的属性是否可以用for...in语句进行枚举。
2. Boolean 类
Boolean类是Boolean原始类型的引用类型。
Boolean对象将覆盖object类的valueOf()方法,返回原始值,即true或false。toString()方法也会被覆盖,返回字符串“true”或"false"。
建议少用Boolean对象,最好还是使用Boolean原始值。
// 在Boolean表达式中,所有对象都会被自动转换为true
var oFlaseObject = new Boolean(false);
var bResult = oFlaseObject && true; // outputs true
3. Number 类
创建Number对象并得到数字对象的Number原始值(valueOf()方法):
var oNumberObject = new Number(55);
var iNumber = oNumberObject.valueOf();
toFixed()方法返回的是具有指定位数小数的数字的字符串表示:
var oNumberObject = new Number(99);
alert(oNumberObject.toFixed(2)); // outputs "99.00"
这里,toFixed()方法的参数是2,说明了应该显示几位小数,空的小数位由0补充。toFixed()方法能表示具有0到20位小数的数字,超出这个范围的值会引起错误。
只要可能,都使用数字的原始表示法。
4. String 类
String类是String原始类型的对象表示法。
String对象的valueOf()方法和toString()方法都会返回String类型的原始值:
var oStringObject = new String("hello world");
alert(oStringObject.valueOf() == oStringObject.toString()); // outputs "true"
String类具有属性length,它是字符串中的字符个数:
var oStringObject = new String("hello world");
alert(oStringObject.length); // outputs "11"
String类还有大量的方法,可以查看API。
5. instanceof 运算符
instanceof运算符与typeof运算符相似,用于识别正在处理的对象的类型。与typeof方法不同的是,instanceof方法要求开发者明确地确认对象为某特定类型。
var oStringObject = new String("hello world");
alert(oStringObject instanceof String); // outputs "true"
2. 转换
> 简单的转换方法
1. 转换成字符串
3种主要的原始值Boolean值、数字和字符串都是伪对象,都有toString()方法,可以把它们的值转换成字符串。
Boolean型的toString()方法只是输出“true”或“false”,结果由变量的值决定。
Number类型的toString()方法有两种模式,即默认模式和基模式。
在默认模式中,返回的都是数字的十进制表示。
在基模式中,可以用不同的基输出数字。
var iNum1 = 10;
alert(iNum1.toString(2)); // outputs "1010"
alert(iNum1.toString(8)); // outputs "12"
alert(iNum1.toString(16)); // outputs "A"
HTML采用十六进制数表示每种颜色,在HTML中处理数字时这种功能非常有用。
2. 转换成数字,只转换第一个无效字符之前的字符串
parseInt():
var iNum1 = parseInt("1234blue"); // return 1234
var iNum2 = parseInt("0xA"); // return 10
var iNum3 = parseInt("22.5"); // return 22
var iNum4 = parseInt("blue"); // return NaN
parseInt()方法的基模式:
var iNum1 = parseInt("AF", 16); // return 175
var iNum2 = parseInt("10", 2); // return 2
var iNum3 = parseInt("10", 8); // return 8
var iNum4 = parseInt("10", 10); // return 10
如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。
parseFloat():
var iNum1 = parseFloat("1234blue"); // return 1234
var iNum2 = parseFloat("0xA"); // return 0
var iNum3 = parseFloat("22.5"); // return 22.5
var iNum4 = parseFloat("22.34.5"); // return 22.34
var iNum5 = parseFloat("0908"); // return 908
var iNum6 = parseFloat("blue"); // return NaN
> 强制类型转换(type casting)
1. Boolean(value):把给定的值转换成Boolean型
当要转换的值是至少有一个字符的字符串、非0数字或对象时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。
var b1 = Boolean(""); // false - empty string
var b2 = Boolean("hi"); // true - non-empty string
var b3 = Boolean(100); // true - non-zero string
var b4 = Boolean(null); // false - null
var b5 = Boolean(0); // false - zero
var b6 = Boolean(new Object()); // true - object
Number(value):把给定的值转换成数字(可以是整数或浮点数),转换的是整个值
var n1 = Number(false); // 0
var n2 = Number(true); // 1
var n3 = Number(undefined); // NaN
var n4 = Number(null); // 0
var n5 = Number("5.5"); // 5.5
var n6 = Number("56"); // 56
var n7 = Number("5.6.7"); // NaN
var n8 = Number(new Object()); // NaN
var n9 = Number(100); // 100
String(value):把给定的值(任何值)转换成字符串
强制转换成字符串和调用toString()方法的唯一不同之处在于,对null或undefined值强制类型转换可以生成字符串而不引发错误:
var s1 = String(null); // "null"
var oNull = null;
var s2 = oNull.toString(); // won't work, causes an error
3. 函数
函数是ECMAScript的核心。函数(function)就是对象。
如果函数无明确的返回值,或调用了没有参数的return语句,那么它真正返回的值是undefined。
1. 无重载:ECMAScript中的函数不能重载,没有方法(函数)重载的概念。
2. arguments对象:每个函数都有一个隐含的对象 arguments,表示给函数实际传递的参数
3. Function类:所有自定义的函数都是Function 对象类型的。Function 对象接收的所有参数都是字符串类型的,其中最后一个参数就是要执行的函数体,而前面的参数则是函数真正需要接收的参数。
每一个函数对象都有一个 length 属性,表示该函数期望接收的参数格式。它与函数的 arguments 不同,arguments.length 表示函数实际接收的参数格式。
Function对象也有与所有对象共享的标准valueOf()方法和toString()方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。
4. 闭包
所谓闭包,是指词法表示包括不必计算的变量的函数,也就是说,该函数能使用函数外定义的变量。
(完)