JavaScript权威指南

第一章 概述

(1)JavaScript是面向对象的,解释型程序设计语言.
(2)JavaScript是松散类型的语言(弱类型).
(3)当把一个JavaScript解释器嵌入Web浏览器时,就形成了客户端JavaScript.
(4)Web浏览器定义的文本对象模型DOM(Document Object Model)
(5)IE不支持W3C标准的事件处理



第二章 语法结构

2.1 字符集
(1)JavaScript是16位的Unicode字符集编写的.
(2)JavaScript中每个字符都是由两个字节表示的.

2.2 大小写敏感
(1)JavaScript是一种区分大小写的语言.

2.3 空白行和换行符
(1)JavaScript会忽略程序中记号之间的空格,制表符,换行符.

2.4 可选的分号
(1)语句在不同行可省略分号

2.5 注释
//
or /* */

2.6 直接量
literal(直接量):程序中直接显示的数据值.

2.7 标识符identifier
用来命名变量和函数,或者代码中某些循环的标签
命名规则:第一个字符必须是字母,_,$.数字不允许出现在首个字符的位置.
接下来是字母,数字,_,$.
注:标识符不能与关键字同名.

2.8 保留字
abstract    boolean        break    byte
case catch char class const continue
debugger default delete do double
else enum export extends
false final finally float for function
goto
if implements import in instanceof int interface
long
native new null
package private protected public
return
short static super switch synchronized
this throw throws transient true try typeof
var void volatile
while with



第三章 数据类型和值
三种基本的数据类型:数字,文本字符串,布尔值.
两种小数据类型:null,undefined.
复合数据类型:object.
另一种特殊对象:函数function

3.1 数字
(1)所有数字都由浮点型表示.
3.1.1 整型直接量
3.1.2 八进制和十六进制直接量
3.1.3 浮点型直接量
3.1.5 数值转换
3.1.6 特殊的数值
无穷大 Infinity
无穷小 -Infinity
NaN 与任何数值都不相等,包括自身.isNaN()专门检测这个值
isFinity()检测一个数字是否是无穷大或负无穷
Number.MAX_VALUE:表示最大的数字
Number.MIN_VALUE:表示最小的数字(与零最接近的数字)
Number.NaN:特殊的非数字值
Number.POSITIVE_INFINITY:表示正无穷大的特殊值
Number.NAGATIVE_INFINITY:表示负无穷大的特殊值

3.2 字符串
3.2.1 字符串直接量
3.2.2 字符串直接量中的转义序列
\n 换行
\0 NUL字符
\b 退格符
\t 水平制表符
\n 换行符
\v 垂直制表符
\f 换页符
\r 回车符
3.2.3 字符串的使用
确定一个字符串的长度s.length;
s.charAt();
s.subString(x,y);
s.indexOf("xx");

3.2.4 把数字转换为字符串
数字会在需要的时候自动转换为字符串.
显示转换:String(number);
or number.toString();
toFixed()把一个数字转换为字符串,并且显示小数点后指定的位数.
toExponential()使用指数表示法把一个数字转换为字符串,小数点前面有一位,小数点后面有知道的位数.
toPrecision()使用指定的有意义的位数来显示一个数字.
var n = 123456.789;
n.toFixed(0); //"1234567"
n.toFixed(2);//"123456.79"
n.toExponetial(1);//"1.2e+5"
n.toExponetial(3);//"1.235e+5"
n.toPrecision(4);//"1.235e+5"
n.toPrecison(7);"123456.8"

3.2.5 把字符串转换为数字
(1)var number = string -0;
这样可以得到这个字符串的数字
(2)Number(string);
(3)parseInt(STRING)
parseFloat()截取整数和浮点数
注:如果字符串是0开头,parseInt可能解析成8进制也可能解析成16进制,不太好.

3.3 布尔值

3.3.1 布尔值的转换
布尔值在数字环境中,true转换成1,false转换成0
布尔值在字符环境中,true-->"true",false-->"false"

3.4 函数
函数是真正的数值,这意味着函数可被存储在变量,数组和对象中,而且函数还可以作为参数传递给其他函数.

函数的定义方式:
(1)function square(x){};
(2)var square =function(x){};
(3)var square = new Function(){"x","/*....*/"}(基本没用)

3.5 对象
3.5.1 创建对象
var o = new Object();
var now = new Date();
var pattern = new RegExp("");

3.5.2 对象直接量
var point ={x:2,y:3};
也可以嵌套
var rectangle ={
    upperLeft:{x:2,y:3},
    lowerRight:{x:4,y:4}
}
3.5.3 对象转换
非空对象用于布尔环境,转换为true;
用于字符串环境,调用toString()方法;
用于数字环境,调用valueOf()方法;

3.6 数组
3.6.1 数组的创建
var arr = new Array();

3.6.2 数组的直接量

3.7 null
表示无值,无对象

3.8 undefined
虽然undefined和null这两个值不同,但==却把他们看做相等.
例:my.prop == null;
若实在需要区分这两个值,可用===,typeOf运算符

3.9 Date对象

3.10 正则表达式
/^ /

3.11 Error对象

3.14 对象类型到基本类型的转换(*)
(1)不管何时,当一个非空对象用于布尔环境时,它都可以转换为true.
var o = new Object();
if(o){
    alert("true");
}else{
    alert("Kong ");
}
(2)大多数对象继承了Object默认valueOf()方法.该方法只是返回对象本身,不会返回一个基本类型.
(3)数组元素的toString()方法把数组元素转换为字符串,然后返回这些字符连接的结果,包括字符串间的逗号.
所以空数组就转换为"",进而转换为0;若数组中有元素不是数字则,被转换为NaN.
var arr = [];
alert(arr);//""
alert(arr.toString());
var brr =["hello"];
alert(brr);//hello
alert(brr.toString());
var crr =[1,2,3];
alert(crr);//1,2,3
alert(crr.toString());

3.15 传值和传址
处理数据值的三种方式:
复制,传递,比较.

        传值                        传址
复制    实际复制的是值,                复制的只是对值的引用.如果通过传递给这个新的引用修改了数值,
    存在两个不同的独立的拷贝        这个改变对最初的引用是可见的.

传递    传递给函数的值是一个独立的拷贝        传递给函数的是对值的引用.如果通过传递给它的引用修改了数值
    对他的改变在函数外部没有影响        这个改变在函数外部可见

比较    比较两个独立的值(通常逐字节比较)    比较两个引用,判断引用的是否是同一个值.对两个不同数值的引用不相等,
                        即使是由相同字节构成的.

3.15.1 基本类型和引用类型
基本类型通过传值操作,引用类型通过传址操作!
注:JavaScript中的字符串被当做基本类型处理.

3.15.2 复制和传递字符串
字符串通过传值进行比较,通过传址进行复制和传递.‘



第四章 变量

4.1 变量的类型
(1)JavaScript是非类型语言.

4.2 变量的声明
var i;
声明多个:
var i,j;
var message ="hello";
var i=0,j=0,k=0;

4.3 变量的作用域

(1)在函数内部,局部变量的优先级比同名的全局变量高.


4.3.1 没有块级作用域
(1)函数中声明的变量在整个函数都有定义(作用).
var scope="global";
function change(){
    alert(scope);//global
    scope="local";
}
change();

var scope="global";
function change(){
    alert(scope);//undefinied;
    var scope="local";
}
change();

4.3.2 未定义的变量和未赋值的变量
(1)给未被声明的变量赋值,并不会出错.程序会在全局变量中隐式的声明之.


4.4 基本类型和引用类型
var a =[1,2,3];
var b =a ;
a[0]=99;
alert(b);//[99,2,3]!

4.5 垃圾收集
自动,与Java类似

4.6 作为属性的变量
4.6.1 全局变量
(1)在程序的顶层代码中,可使用this关键字引用全局变量.
(2)JavaScript中Window代表浏览器窗口,是包含在该窗口中的所有JS代码的全局对象.

4.6.2 局部变量:调用对象

4.6.4 JavaScript的执行环境

4.7 深入理解变量的作用域
(1)每个JavaScript执行环境都有一个和它关联在一起的作用域链
(2)在一个函数中,作用域链由两个对象构成,第一是局部变量,第二才是全局变量.



第五章 表达式和运算符
运算符        运算类型    所执行的操作
delete        lvalue        取消定义的一个属性
typeof        任意        返回数据类型    alert(typeof scope);//string
void        任意        返回未定义的值 var a; alert(void a);//undefinied
instanceof    对象构造函数    检查对象类型
in        字符串,对象    检查一个属性是否存在

5.2.1 运算数的个数
一元运算符:-取反
二元运算符:+
三元运算符:?:
就是拥有参数的个数嘛!

5.2.2 运算数类型

5.2.3 运算符优先级

5.2.4 运算符的结合行
一元运算符,复制运算符和三元运算符的结合性是从右往左的!
x=~-~y
w=x=y=z
q=a?b:c?d:e?f:g
等同于===>
x=~(-(~y))
w=(x=(y=z))
q=a?b:(c?d:(e?f:g))

5.3 算数运算符
+:对数字进行加法运算,对字符串进行拼接,对对象通过调用对象的valueof(),toString()转换进行加法或拼接
-
*
/

5.4 相等运算符
5.4.1 相等运算符(==)和等同运算符(===)
==比较宽松的同一性定义,即允许进行类型转换
===等同运算符,严格的同一性检测两个运算数是否完全等同.
null和undefined,它们完全相同.
var a = null;
var b;
if(a==b)alert("null==undefined")

5.5 关系运算符
NaN与任何类型数据比较都是false!!

5.5.2 in运算符
要求:运算符左边的是一个字符串或能被转换成字符串,右边的是一个对象或者数组.

5.5.3 instanceof运算符
要求:运算符左边是一个对象,右边是对象类的名字.

5.6 字符串运算符
"11"<"3" //true,以字符串进行比较
s = 1+2+"slsss"; //3slsss
为什么呢?因为+运算符是从左往右工作的,除非括号改变这个顺序

5.7 运算符逻辑
&& ||

5.8 位运算符
& ^ | ~ << >> >>>(用0补足的右移运算符)

5.9 赋值运算符

5.10 其他运算符
(1)typeof运算符
返回任意运算数的类型
(2)对象创建运算符new
语法:
new constructor(arguments)
(3)delete运算符
删除指定的对象属性,数组元素,变量.
但是不能删除声明的运算数.
例;var o  ={x:1,y:2};
delete o.x;//true
delete o;//false
(4)void 运算符
用途:舍弃运算数的值,返回undefined,用于javascript:URL中




第六章 语句

6.1 表达式语句

6.2 复合语句

6.3 switch语句
case后可跟任意表达式
例:case 60*2;
case Math.PI;
case n+1;
case表达式是通过===等同运算符判定的,所以表达式必须在没有转化类型的情况下进行匹配.

6.4 for/in语句
for(variable in object)
statement

6.10 标签语句
identifier : statement
identifier可以是任何合法的标识符,但不能是保留字.
通过标签可以给语句起一个名字,这样便于引用这个语言

6.18 with语句
with(object)
statement
作用:将object添加到作用域链的头部,然后执行statement,再把作用域链恢复到原始状态.


第七章 对象和数组

7.1 创建对象
对象:是一个无序的属性的集合,每个属性都有自己的名字和值.

7.2 对象的属性
var o ={};
o.title="javascript xxx";

7.2.1 属性的枚举
for(var name in obj)

7.2.2 检查属性的存在性
in可以用来测试一个属性的存在性
例:if(x in obj)
若查询一个不存在的属性,则会返回undefined.
所以一般如下检测
if(obj.x!==undefined)

7.2.3 删除属性
delete obj.x;

7.3 作为关联数组的对象
object.property
object["property"]
前者的属性名是标识符,后者的属性名是字符串

7.4 通用的Object属性和方法
7.4.1 constructor属性
JavaScript中,每个对象都有一个constructor属性,它引用了初始化这个对象的构造函数.
constructor属性有助于确定一个对象的类型
instanceof 检查constuctor的属性值

7.4.2 toString()方法

7.4.3 toLocaleString()方法

7.4.4 valueOf()方法
用于对象需要转换为基本类型的环境中,JavaScript会自动调用这个方法.
alert(Date.valueOf()); //function Date(){[native code]};

7.4.5 hasOwnProperty()方法
对象的用字符串参数指定的名字对应的非继承的属性,则返回true;
例:var o ={};
o.age =10;
o.hasOwnProperty("sdfsd");//false 没有这个属性
o.hasOwnProperty("toString");//false toString是继承属性
Math.hasOwnPropery("cos");//true
o.hasProperty("age");//true
注:参数必须为字符串!

7.4.6 propertyIsEnumerable()方法
对象用字符串指定名字的属性是非继承且可枚举的,则返回true.
注:对象所有自定义属性都是可以枚举的,而继承属性不能枚举!!!

7.4.7 isPrototypeOf()方法
如果方法所属对象是参数的原型对象,则返回true.
var o ={};
o.constructor == Object;
Object.constructor = Function;

7.5 数组
var o =[,,];//含有两个未定义参数的数组
创建数组的方式:
(1)直接量
var o =[];
(2)调用Array构造函数
var a= new Array();//无参,与[]直接量等同
var a = new Array(1,3,"test");
var a = new Array(10);//传入一个参数,是指定了数组的长度

7.6 数组的读与写
数组的下标只能是0~2^32-1的整数
若为其它,JS会自动转换为字符串.
例:a[-1.23]=true;//是为一个名为"-1.23"的属性赋值.

var c ={age:10,name:"sanguo"};
这是个对象了,不是数组!!!

7.6.1 添加数组新元素
JS数组可以具有任意个数的元素,可以在任何时刻改变元素的个数.

7.6.2 删除数组元素
delete运算符知识将数组的元素设置为undefined,数组元素本身还是存在的.
Array.shift();//删除数组中的第一个元素
Array.pop();//删除数组中的最后一个元素
Array.splice();//从一个数组中删除一个连续范围内的元素

7.6.4 数组的长度
a[49]=0;//数组的长度为50


7.6.5 截断或增长数组
数组的length的属性可读也可写,若给其赋予一个比length小的值,那么超出长度部分的数组将会被截取掉.

7.7 数组的方法
7.7.1 join()方法
把一个数组的所有元素转换为字符按串,然后再把他们连接起来.
例:var a =[1,2,3];
a.join();//"1,2,3"
a.join(",");//"1, 2, 3"

7.7.2 reverse()方法
返回颠倒后的数组

7.7.3 sort()方法
排序,若不传入参数,则按字母的顺序排序.未定义的元素放置在排序数组的末尾
若要按其他顺序排列,则要传入一个比较函数.

7.7.4 concat()方法
创建并返回一个数组,包含调用这个方法的原始数组的元素.
若方法中的参数包含数组,则将其展开,将元素添加进去,只能展开一层!!!
例:var a =[1,2,3];
a.concat(4);//1,2,3,4
a.concat([5,6]);//1,2,3,4,5,6
a.concat([7,[8,9]]);//1,2,3,4,5,6,7,[8,9]

7.7.5 slice()方法
返回指定下标范围的数组片段.
参数-1,是指定最后一个元素,-2倒数第二个元素
前开后闭

7.7.6 splice()方法
splice()可以将元素从数组中删除,也可以添加新元素到数组,也可以同时执行这两个操作.
第一个参数指定了要删除的元素的位置,第二个参数指定要删除元素的个数.若第二个元素省略则删除到结尾的所有元素.
返回删除了的数组.
除了前两个参数,还可以有任意多个参数,指定的是要插入的元素.


7.7.7 push()和pop()
push()将元素添加到数组的尾部,并返回数组的新长度;
pop()将删除数组最后一个元素,并返回删除掉的值.

7.7.8 unshift()和shift()方法
unshift():将元素添加到数组的头部,并返回数组的长度
shift():删除数组的第一个元素,并返回删除的元素,后面的所有元素向前移动以填补空白.

7.7.9 toString()和toLocaleString()方法




第八章 函数
8.1 函数的定义和调用
function f(x){};
var f = function(x){};
var f =function fact(x){};
//定义了一个未命名函数,且将她的引用存储在变量f中.fact只是一个用来引用自身的函数名称,并不是这个函数的引用!
但IE貌似可以调用!

8.2 函数参数
8.2.1 定义可选参数
function fact(x,a){
 if(!a) a=[];//如果a为空或undefined
 ********
 *****
}
或者用一个习惯用法,而非用if判断,a=a||[];
注:要确保需要忽略的参数要放在参数列表的末尾

8.2.2 可变长参数列表
Arguments对象是一个类似数组的对象,可以按照数目(不是名字)获取传递给函数的参数值.
arguments并不是数组,只是类似数组,它是一个Arguments的对象.
arguments只是一个标识符,并非保留字,若函数中用到了arguments,则会隐藏Arguments对象的使用.

属性callee
可用来对未命名函数递归的调用自身.

8.3 作为数据的函数
(1)将函数赋给新的引用;
(2)将函数赋给对象的属性;

8.4 作为方法的函数
方法有一个非常重要的特性:方法体中,用来调用方法的对象成为关键字this的值.

8.6 函数的属性和方法
8.6.1 属性length
函数的属性length是只读的!!!
返回的是需要的参数的个数,即形参的个数.

8.6.2 prototype属性
它的引用是预定义的原型对象.

8.6.4 apply()和call()方法
这两个方法的第一个参数都是要调用的函数对象,在函数体内这一参数是this的值.
call后面是参数是要传入的参数的值.
而apply传递函数的参数则需由数组指定.
f.call(o,1,2);
f.apply(o,[1,2]);

 

8.8 函数的作用域和闭包
8.8.1 词法作用域
JS中函数是通过词法来划分作用域的;
>>>


第九章 类,构造函数和原型
9.2 原型和继承
(1)概念:每个函数都有一个prototype属性(原型属性),这个属性是一个指针,指向一个对象,这个对象包含这个函数创建的实例的共享属性和方法;也就是说原型对象中的属性和方法是所有对象的实例共享的.
(2)每个实例中有一个有一个_proto_属性指向原型对象.
(3)一个对象的原型就是它构造函数的prototype的值
(4)所有的函数都有prototype属性,当这个函数被定义的时候,prototype属性自动创建和初始化.
(5)prototype属性的初始化值是一个对象,这个对象只带一个属性即为constructor,它指回到原型相关的那个构造函数.
(6)添加给原型对象的任何属性,都会被构造函数初始化为对象的属性.
(7)构造函数初始化的对象都从原型对象那边继承了完全相同的一组属性
(8)原型对象是放置方法和其他不变属性的理想的地方.
(9)使用原型对象可以显著的减少对象所需的内存数量,因为对象可以继承原型的属性.

区分继承属性和常规属性
Object.hasOwnProperty();
常规属性返回true,继承属性返回false(即属性存在于原型中)

9.2.1 读取和写入继承属性
属性的继承只是在读取的时候发生,而写入时不会发生.
也就说:在写入时若常规属性继承于原型属性,那么读取时常规属性覆盖原型属性.
例: var o =function(){};
o.prototype.p="123";
o.p ="321";
console.log(o.p);//"321"

9.2.2 扩展内建类型
(1)不仅用户自定的类有原型对象,类如String,Date这样的内建类也有原型.
(2)内建类的原型对象敬而远之,命名混乱,易混淆

9.3 JavaScript中的模拟类

9.4 通用对象模型
9.4.1 toString()方法
相当于重写toString()方法
Object.prototype.toString=function(){
return xxxxx;
}

9.4.2 valueOf()方法
用于将某种对象转换为基本类型时调用的,一般是要转换一个数字而不是字符串.

9.4.3 比较方法
JS中"="运算符是按地址比较对象而不是按值.

方法compareTo()

9.5 超类和子类

>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>


第十三章 Web浏览器中的JavaScript
13.1 web浏览器环境
三个特性:
(1)作为全局对象的Window对象和客户端JavaScript代码的全局执行环境
(2)客户端对象的层次和构成它的一部分文档对象类型DOM
(3)事件驱动的编程模型

13.1.1 作为全局执行环境的window对象
表示HTML文档的是Document对象,Window对象代表显示该文档的窗口.
JS的每个实现都有一个全局对象,该对象位于作用域链头部.这个全局对象的属性也是全局变量.
Document和Window是全局对象,Document的属性document,Window的属性window和self是全局变量.

13.1.2 客户端的对象层次和文档对象模型(DOM)
文档对象模型,即0级DOM.

13.2.4 defer属性
作用:提示浏览器继续解析文档,并延迟脚本的执行,直到遇到一个无法延迟的脚本.有助于提升性能哦
例:在HTML中 <script defer></script>
在XHTML中 <script defer="defer"></script>

13.2.5 <noscript>标记
作用:用来保存只有当浏览器中的javascript被关闭的时候才提交的内容.

13.3 HTML中的事件句柄
定义:事件句柄,又称事件处理函数,指事件发生时要处理的操作.
>>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>
>>>>>>>
>>>>>
>>>
>>
>


第十四章 脚本化浏览器窗口
14.1 计时器
setTimeout():安排一个函数在指定的毫秒数过去后运行,返回一个不确定的值;这个值可以传递给clearTimeout()来取消规化函数的执行.
setInterval():指定的函数在一个指定的毫秒间隔内重复调用.
小技巧:setTimeout(),注册一个函数在0微秒后调用.用以延迟代码的执行,直至文档稳定.

14.2 浏览器Location和History
14.2.1 解析URL

JavaScript权威指南,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。