《Javascript高级程序设计》读书笔记(一)
一、Javascript是什么
Javascript实现由以下3个不同的部分组成:
- 核心(ECMAScript)
- 文档对象模型(DOM)
- 浏览器对象模型(BOM)
ECMASript是一个重要的标准,它并不与任何具体浏览器相绑定。Web浏览器对于ECMAScript来说是一个宿主环境,在其他环境(如Macromedia用在Flash中的ActionScript)都有ECMAScript的实现。
二、ECMAScript基础
1、在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值。原始值存储在栈(stack)中,引用值存储在堆(heap)中,存储在变量处的是一个指针。
2、ECMAScript有5种原始类型,即Undefined、Null、Boolean、Number和String。
- Undefined:该类型只有一个值,即undefined,当声明的变量未初始化时,变量的默认值是undefined
- Null:值undefined实际是从null派生来的,null用于表示尚未存在的对象。
- Boolean:有两个值,即true或false。
- Number:Number类型有几个特殊值,如Number.MAX_VALUE、Number.POSITIVE_INFINITY、NaN等。NaN表示非数(Not a Number)。NaN一般发生在类型(String等)转换为数值失败时,判断一个值是否是NaN可使用isNaN()函数。
- String:在许多语言中,字符串被看作引用类型,而ECMAScript打破了这一传统。String类型存储的是Unicode字符。
3、引用类型
- Object类:ECMAScript中的所有类都从Object类继承而来,Object类中的所有属性和方法都会出现在其他类中。
Object类具有下列属性:
◇Constructor——创建对象的函数(构造函数)的引用。Object类该属性指向的Object()函数
◇Prototype——对象的对象原型的引用。对于所有的类,它默认返回Object对象的一个实例。
Object类还有几个方法:
◇HasOwnProperty(property)——判断对象是否有某个特定的属性,property为属性名
◇IsPrototypeOf(object)——判断该对象是否为另一个对象的原型
◇PropertyIsEnumerable(property)——判断给定的属性是否可以用for...in语句进行枚举
◇ToString()——返回对象的原始字符串表示
◇ValueOf——返回最适合该对象的原始值。对于许多类,该方法返回的值都与ToString()的返回值相同。 - Boolean类:Boolean类是Boolean原始类型的引用类型。
- Number类:Number类是Number原始类型的引用类型。
Number类有几个与格式化数值相关的方法:
◇toFixed()——返回具有指定位数小数的数字的字符串表示。
◇toExponential()——返回科学记数法表示的数字的字符串表示。
◇toPrecision()——根据最有意义的形式来返回数字的预定或指数形式。
以上这三个方法都会进行舍入操作。 - String类:String类是String原始类型的对象表示法。
String类具有大量的方法:
◇charAt()——返回指定位置的字符
◇charCodeAt()——返回指定位置字符的ASCII码
◇concat()——连接字符串,不过一般使用加号(+)连接字符串更多
◇indexOf()——从开头位置检索子串的索引
◇lastIndexOf()——从结尾位置开始检索子串的索引
◇localeCompare()——比较字符串
◇slice()和substring()——获取指定的子字符串
◇toLowerCase()和toLocaleLowerCase()——小写转换
◇toUpperCase()和toLocaleUpperCase()——大写转换
String类的所有属性和方法都可应用于String原始值上,因为它们是伪对象。其他引用类型也一样。
4、运算符
- 一元运算符(delete):删除之前定义的对象属性或方法的引用,delete运算符不能删除开发者未定义的属性和方法,如不能删除原始的ECMAScript的方法toString()
- 一元运算符(void):使任何值都返回undefined。该运算符通常用于避免输出不应该输出的值。如
<a href='javascript:void(window.open('about.blank'))">click me</a>
这使window.open调用返回undefined,它不是有效的值,不会显示在浏览器窗口中。记住,没有返回值的函数真正返回的都是undefined。 - 所有整数字面量都默认存储为有符号整数,只有用ECMAScript的位运算符才能创建无符号整数。
- 逻辑运算符(AND):由双和号(&&)表示,逻辑AND运算并不一定返回Boolean值
◇如果一个运算数是对象,另一个是Boolean值,返回该对象
◇如果两个运算数都是对象,返回第二个对象
◇如果某个运算数是null,返回null
◇如果某个运算数是NaN,返回NaN
◇如果某个运算数是undefined,发生错误 - 逻辑运算符(OR):由双竖线(||)表示,逻辑OR运算并不一定返回Boolean值
◇如果一个运算数是对象,另一个是Boolean值,返回该对象
◇如果两个运算数都是对象,返回第一个对象
◇如果某个运算数是null,返回null
◇如果某个运算数是NaN,返回NaN
◇如果某个运算数是undefined,发生错误 - 无论何时比较一个数字和一个字符串,ECMAScript都会把字符串转换成数字。如果字符串不能转换成数字,会返回NaN。根据规则,任何包含NaN的关系运算都要返回false。
- 如查一个运算数是Boolean值 ,在检查相等性之前,把它转换成数字值。false转换成0,true转换成1。
- 如果两个运算符都是对象,比较相等性实际是比较它们的引用值。
- 全等号(===)和非全等号(!==)所做的和等号(==)和非等号(!=)相同,只是它们在检查相等性前,不执行类型转换。
5、语句
- for...in用于枚举对象的属性,propertyIsEnumerable()是ECMAScript中专门用于说明属性是否可以用for...in语句访问的方法。 下面语句用于显示BOM window对象的所有属性:
for (sProp in window) {
alert(sProp);
}
6、函数
- 如果函数无明确的返回值,或调用了没有参数的return语句,那么它真正返回的值 是undefined。
- ECMAScript中的函数不能重载。
- ECMAScript的函数可以接受任意个数的参数。使用特殊对象arguments,无需明确命名参数,就可以重写函数。利用arguments对象判断传递给函数的参数个数,可模拟函数重载,如:
function doAdd() {
if (arguments.length == 1) {
alert(arguments[0] + 10);
} else if (arguments.length == 2) {
alert(arguments[0] + arguments[1]);
}
}
doAdd(10); // 输出“20”
doAdd(30, 20); // 输出“50” - ECMAScript的函数只不过是一种引用类型
- 函数名只是指向函数的引用变量,可以把函数作为变量传递给另一个函数使用
- Function对象的valueOf方法和toString方法都返回函数的源代码