1:documnet对象支持一个属性声明了当前文档的最后修改日期,你可以使用这一属性自动地在文挡中显示一个
一个时间截
2:Javascript的windows.setTimeout()方法可以确定一个Javascript代码在多少毫秒之后执行,这对于在
javascript中建立迟延或者重复的动作是非常有用的,在javascript1.2中 settimeout()中增加了一个
名为setInterval()的方法
注:这里给我们的启示就是我们可以根据settimeout()这个方法定义不同的属性
3:Navigator对象(当然是以Nestcape Web浏览器命名的)的一些变量声明了正在运行浏览器的名字和版本
还有一些变量标识了运行该浏览器的平台,有了这些变量,脚本就能够根据浏览器或者平台来定制
自己的行为,这样一来,他们便可以利用某些版本支持的额外能力或者避开存在于某种平台上的bug了
注:我觉得这里提供给我们的是 我们可以通过Navigator获得浏览器的信息 然后我们根据是那个浏览
器就编写相应浏览器运行的脚本就可以了
4:在客户端的Javascript1.2中,Screen对像提供了显示web浏览器的显示器的大小和角度的信息
5:从Javascript1.1开始,windows对象的scroll()方法就允许Javascript程序在X方向和Y方向滚动窗口
在Javascript1.2中,涌现了一批用于移动窗口或者调整窗口大小的方法,它们替代了上述的scroll()方法
注:这个scroll()方法经常用到 所以我觉得用途比较广的
Javascript不能够做什么
客户端Javascript具有一连串给人留下深刻的印象的功能,但是要注意,这些功能只限制与浏览器相关
的任务或与文档相关的任务,由于客户端Javascript只用于有限的环境中,所以它没有独立语言所必需
的特征
除了动态地生成浏览器要显示的html文档(包括图象,表,框架,表单和字体,等等)之外,Javascript不
具有任何图形处理的能力
处于安全方面的原因,客户端Javascript不允许对文件进行读写操作,显示易见,你一定不想让一个来自于某个
站点的不可靠程序在自己的计算机上运行,并且随意篡改你文件
除了能够引发浏览器下载任意的Url所指的文挡以及把html表单的内容发送给服务器端脚本,电子邮件地址之外,
Javascript不支持任何形式的联网技术.
注:javascript不具备图形处理的能力,不允许对文件进行读写的操作
jvascript的安全性
只要程序(jvascript脚本,Visual basic程序或 Microsoft Word宏)包含在共享文档中,尤其是通过Internet或者
电子邮件传输文档,尤其通过Internet或电子邮件传输的文挡,就可以存在病毒或其他恶意程序,javascript语言的
设计者意识到了这些安全方面的问题,所以没有赋予Javascript程序执行破坏性操作的权利,例如通过前面说明,客户
端Javascript程序 不能够读取本地文件或者不能够执行联网操作.
但是,由于web浏览器环境非常复杂,在早期浏览器版本中出现了大量的安全性问题,例如,在Navigator2中,能够编写
可以自动窃取网页访问者的电子邮件地址的javascript代码 然后不经访问者同意就以他们的名义自动发送电子邮件,
不过现在这个问题已经被解决了
注:这里说明出现过了安全问题不过现在也大概有保证了
关于本次笔记
本书的其余章节分为五部分,本章之后是第二部分,它介绍了Javascript的核心,.
第二章:词法结构
第三章:数据类型和值:介绍了Javascriot支持的数据类型
第四章:变量 介绍了变量 变量的作用域以及相关主题
第五章:表达式的作用以及相关主题
第六章: 语句介绍了一种javascript的词法和用法
第七章:介绍了Javascript是如何定义函数,调用函数以及操作函数
第八章:对象 介绍了Javascript中最重要的数据类型对象
第九章:介绍了javascript中数组的创建和使用
第十章: 使用正则表达式的模式匹配,说明了在Javascript中使用正则表达式进行模式匹配和
和查找替换的操作
第十一章:javascript的更多主题 介绍了前面没有讨论过的高级主题,第一次读通全书的时候
可以略过该章,但是如果想成为一个javascript高手,那么理解它所包含的内容是
至关重要的
本书的第二部分介绍是的客户断Javascript,这一部的各章介绍了客户断Javascript的核心,---web浏览器的各个对象,并且还提供了
有关这些对象的用法示例程序,要想使一个运行在web浏览器中的Javascript程序生动有趣,必定要依靠专用的客户端的javaqscript程序
的特性
第二部分内容包括
第十二章:web浏览器中的Javascript 介绍了Javascript与web浏览器的集成, 它把web浏览器作为一种程序设计进行了考论,并且
还解释了把Javascript代码集成到
第十三章:窗口和框架 介绍了客户端Javascript最核心,也是最重要的对象---windows对象 还介绍了几个与windows对象有关的对象
第十四章: document对象 介绍了doucment对象以及把html文档内容展示给Javascript代码有关对象
第十五章: 表单和表单元素 介绍了hltml表单的form对象 此外,他还介绍了出现在hltml表单中的各种表单元素对象并且展示了一些使用
表单javascript程序
第十六章:脚本化cookie 说明了如何用cookie在web程序中保存状态
第十七章:文档对象模型 说明了w3c dom 标准的核心片段,并且展示了javascript脚本如何访问
html文挡中的任意元素
第十八章:联级样式表和动态的html介绍了使Javascript程序能够操作html文挡中的样式表
元素的外观和位置的那部分w3c dom标准 该章向你展示了如何用css属性创造大量
的DHTML效果
第十九章:事件和事件处理器 介绍了javascript事件和事件处理器 他们对于要和用户进行交互
的Javascript程序来说非常重要,该章涵盖了传统的事件模型 w3c dom标准事件模型号
和Internet explorer专有的事件模型
第二十章:“兼容性”探索了Javascript程序设计技术中有关兼容性的重要问题 并且考论了编写能
在大多数web浏览器上正确运行的Javascript代码方法
第二十一章:"Javascript的安全性"列表了建立在客户端Javascript安全限,并且解释了它们的基本原来
第二十二章:在javascript中Java 说明了如何使用javascript与Java小程序进行通信,并且对他们进行控制
此外它还介绍了如何进行反向操作,即在java小程序中调用Javascript代码
第三,四,五 部分是参考手册,分别说明Javascript语言刻心定义的对象,传统的客户端Javascript定义的对象,传统
的客户端Javascript定义的对象和新的w3c dom 标准定义的对象
Javascript探秘
研究Javascript最简单方法就是编写简单的脚本,客户端javascript的好处之一就是要编写javascript脚本不必购买或
下载的专用软件,一个web浏览器和一个简单的文本编辑器就构成了一个完成的开发环境
URL协议来计算Javascript的表达式,并返回计算结果,一个Javascript URL是由Javascript协议说明符加上加上任意的Javascript
代码构成的,当浏览器装载这些Url时,它将执行Javascript代码,这样URL的最后一个表达式将转换成字符串,该字符串会被作为
新文挡显示在Web浏览器中
比如:在浏览器的地址输入如下语句:
javascript:5%2
javascript:d = new Date(); typeof d;
等等上面这些都可以运行
注:这个在浏览器中可以输入直接调试 我觉得对我来说是比较新鲜的 有意思
在研究Javascript时,可能会编写出运行结果与你期望的值不相符的代码,并且应该对它进行调试,调试javascript的方法和其他语言的方法一样
即在代码中插入语句,输出有关变量的值,以便你能够判断到底问题出在那里,我们知道用document.write()可以实现这一点,但是该方法是不
从事件处理器中调用的,而且还有其他缺陷,所以使用alert()函数在一个单独的对话框中显示调试信息比较容易一些
另外,上面提到的for/in循环 对调试也非常有用,如你可以和alert()方法一起使用它,编写出一个函数来显示对象所有属性的名字和值
列表,这种函数在研究javascript语言和调试代码时非常有用
第二章 词法结构
1:字符集 Javascript程序是Undicode字符编写的
2:大小写的敏感性
3:空白符和换行符
4:可选的分号
注: 如果是不同的行可以省去分号 但是同行是不可以的
你的意图是 return true;
5: 注释
// 是一条单行注释
/* 这也是一种注释 */
6:直接量
直接量就是程序中直接显示出来的数据值
7:标识符
就是一个名字,在Javascript中,标识符号用来命名变量和
8:保留字
第三章 数据类型和值
表示操作的值的数据类型称为数据类型,Javascript允许你使用三种数据类型 数字 文本字符 和布尔值 此外它还支持二种小的数据类型
null和undefined(未定义)它们各自只定义了一个值
在javascript中的对象和数组是同一种数据类型 但是他们的行为却极为不同
Javascript中的对象二种 一种是对象表示是的已命名的值的无序集合,另一种表示的是编号的值的有序集合,后者被称为数组
Javascript还定义了另一种特殊的对象--函数 函数是具有可以执行代码的对象 可以通过调用函数执行某些操作 和数组一样,函数的行为
与其他类型对象不同,Javascript为函数定义了专门的语法,因此我们将函数看作是独立于对象和数组的 数据类型
除了函数和数组以外, Javascript语言核心还定义了其他一些专门的对象 这些对象表示的不是新的数据类型 而是新的对象类(class)
Date类定义的是表示日期对象 RegExp类定义表示正则表达式对象 Error类定义的是表示javascript程序中发生的语法错误和运行时错误
的对象
注:三种基本的数据类型 数字 文本字符 布尔值
其次还支持 复合数据类型 对象 函数 其次还定义了一些专用的对象
3.1 数字
这里我觉得比较简单 但是注意几点 我们可以采用科学计数法 和使用函数 比如
var ok=11e10;
var c=Math.sin(ok);
document.write(c);
还有要注意一下进制八进制 和十六进制
十六进制是以"0X"或者"0X"开头
特殊的数值
Infinity 表示无穷大的特殊值
NaN 特殊的非数字值
Number.MAX_VALUE 表示的最大数字
Number.MIN_VALUE 表示最小的数字(与零最接近的数字)
Number.NaN 特殊的非数字值
Number.Positive_infinity 表示无穷大的特殊值
Number.NeGATIVE_INfINITY 表示无穷大的特殊值
3.2 字符串
字符串(string)是Unicode字符,数字,标点符号等组成的序列,它是Javascript用来表示文本的数据类型,程序中的字符串直接量
是包含在单引号或者双引号中的
3.21
在javascript程序的设计过程 常常出现Javascript与html互相嵌套的情况 这个时候 如果用到多对引号 我们要注意引号的嵌套使用
比如:
<a href="" onclick="alert('thank you')">click me</a>
3.2.2 字符串直接量中的转义序号
在javascript中用 反斜线(\)表示具有特殊用途
\0 \b \t \n \v \f ...
3.2.3 字符串的使用
Javascript的内部特性之一就是能够连接字符串,如果将加号+用于数字就是将数字相加,如果将它用作字符串,它就会把这二个字符
串连接起来
确定一个字符串的长度 s.length
这里还要注意的是 在这里我们可以对字符串进行操作
比如:last_char = s.charAt(s.length-1) //获取最后一个字符
sub=s.substring(1,4); 抽出第二,三,四个字符
i=s.indexOf('a') 查找第一个字母"a"的位置
3.3 布尔值
只有二个true与flash
比如 if(a==4)
b=b+1;
else
a=a+1;
3.4 函数
函数(function)是一个可以执行的Javascript代码段 由javascript定义或者由Javascript实现预定义,虽然函数只被定义一次,但是javascript
确可以多次调用它,javascript函数可以带有实际参数或形式参数,用以指定这个函数执行计算要使用一个或者多个值,而且它还能够返回
一个值,用以表示计算结果,Javascript的实现提供了许多预定义函数如 Math.sin()
注:我觉得和c#里函数差不多 这里有一个函数的标识 function
还有同样它还能够接收和传递参数 同时还注意一些系统函数的使用
注: 因为函数是和数字,字符串一样的的数据类型,因此它可以像其他类型的值一样被赋给对象的属性,当一个函数被赋给一个对象的
属性的时候,它常常被当做那个对象的方法来引用 ** 这个我觉得比较新鲜 这个与其他语言不同 主要是把它看作一种数据类型
example:
funciton square(x)
{
return x*x;
}
y=Math.sin(x);
d=dd(x,y,z);
3.41 函数的直接量
函数的直接量,看起来就像函数的定义,只不过没有函数名,它们之间的最大差别是函数直接量,可以出现在其他的Javascript中
var square = function(x) { return x*x}
3.5对象
对象是已命名的数据集合,这些已命名的数据通常被作为对象的属性来引用,要引用一个对象的属性,就必须引用这个对象,在其后加
加句号和属性名 比如:image:width image:height
对象的属性在很多方面与javascript变量相似,属性可以是任何类型的数据,包括数组,函数以及他的对象,
例:
document.myform.button
这里引用了一个对象的button属性,而这个对象本身又存储在对象document的myform属性中
3.51
对象是通过调用特殊的构造函数
var point = new object();
point.x=2.3;
point.y=-1.2;
3.6 数组
例: document.imange[1].width 就是数组第二个元素 的width属性
javascript 并不支持Javascript并不是支持多维数组 不过它的数组元素还是数组 是一种无类型的语言,因此数组元素不必具有相同的类型
3.61
数组的创建
例如: 方法一
<script>
var a = new Array()
a[1]=1.2;
a[2]="Javascript";
a[3]={x:1,y:3}
document.write(a[3].y);
</script>
方法二
<script>
var a = new Array(1.2,"Javascript",true,{x:1,y:3});
document.write(a[2]);
</script>
方法三
var a = new Array(10); 10个未定义的数组
数组直接量
例:
<script>
var a =[1.2,"Javascript",true,{x:1,y:3}]
document.write(a[1]);
</script>
3.7 null
表示是一个特殊的值 表示无值
3.8 undefined
3.9 date对象
3.10 正则表达式
正则表达式是由于RegExp()对象表示的
3.11 Error对象
ECMA script v3 定义了大量错误的类 当发生运行错误的时,Javascript解释器会抛出某个类的对象,每个Error对象具有一个message
属性 它存放的是Javascript实现特定的错误消息, 预定义错误对象类型 Error EvalError RangeError SyntaxError TypeError
URIError
3.12 基本数据类型的包装对象
var s ="this is try people solus"
var last_word=s.substring(s.lastIndexOf(" ")+1,s.length);
document.write(last_word);
Javascript可以灵活地将一种数据类型的值转换为另一个种类型,当我们在对象环境中使用字符串时
Javascript会为这个字符串值内部地创建一个string包装对象,string对象就代替了原始的字符串
值,由于对象具有了属性和方法,
注:在整章很多地方都提到了直接量,这个是比较新鲜 必须对其有理解
第四章 变量
变量是一个和数值相关名字
4.1 变量的类型
javascript是无类型的 所以它的变量可以存放任何类型的值
如我们可以把一个数值赋给一个变量 然后再把它赋给另一个变量
是完全可以的 i=10 i="ten"
因为javascript是一种比较简单的语言 它没有像其他语言那样对类要求那么严格
4.2 变量的声明
var i;
var a,b //声明多个变量
如果声明语句没有赋值那么它的初使值就是 undefined
var 还可以作为for循环和for/in循环
<script>
for(var i=0;i<10;i++) document.write(i,"<br>");
</script>
4.2.1 重复的声明和遗漏的声明
使用var 语句多次声明同一个变量不仅是合法的 而且也不会造成任何错误
如果尝试给一个未声明的变量赋值会引发一个错误,如果尝试给一个未用var声明的变量赋值
Javascript会隐式声明该变量
4.3 变量的作用域
变量的作用域和C#的差不多
例: function checkscope()
{
var scope="local";
document.write(scope);
}
checkscope()
注:函数可以嵌套
4.3.1 没有块级的作用域
注:这里比较新鲜与其他语言不同的是 函数中声明的所有变量,在函数的任何地方都可以使用
4.3.2 未定义的变量和未赋值的变量
未定义的变量会引发错误
未赋值的变量会会创建该变量
4.4 基本的数据类型和引用类型
我们可以将数据类型分为二组,即基本类型有引用类型,数值,布尔值,null和未定义的值属于基本类型,对象
,数组和函数属于引用类型
对于数组来说,对象具有任意的长度,它并没有固定的大小,对于数组来说也是这样,因为一个数组可以具有
任意多个元素。
4.5 无用存储单元的收集
无用存储单元的收集,当字符串,对象和数组没有固定大小,所以他们的大小已知时,才对他们进行
动态的分配,Javascript每次创建字符串,数组,对象时,解释器都必须分配内存,最终都要释放
这些内存以便它们能够被利用
javascript不要求手动的去配内存,它使用一种称为无用存储单元收集的方法,Javascript的解释器
可以检测到何时程序不再使用一个对象了,当它确定了一个对象是无用的时候,它知道不再需要这个对象了
可以把它所占用的内存释放掉
注:我觉得这个了解一下就可以了 在现在的我用的程序中 还是很少用到
4.6 作为属性的变量
4.61 全局变量
在客户端的javascript中,windows对象代表 浏览窗口,它是包含在该窗口中的所有javascript代码的全局部对象
4.62 局部变量:调用对象
用一个独立的对象来存储局部变量使 Javascript可以防止局部变量覆盖同名的全局变量的值
4.63 Javascript执行的环境
一个框架中的javascript代码可以使用表达式parent.frames[1]来引用另一个框架中的javascript
代码,在第二个框架中的代码可以使用表达式parent.frames[0].x来引用第一个框架中的全局变量x
注:我觉得这个也是了解一下就可以了 注意windows的意义同时还要一个框架与另一个框架之间的关系
4.7 深入理解变量的作用域
注:这个也是了解一下就可以了 关键是理解作用域链,注意它查询是从从局部到整体的
注:第五章讲了变量的类型 变量的声明,遗留声明的处理方法,变量的作用域,并重点讲了一个与其他语言的不同的
的作用域没有块级的作用域,还有对未定义的变量和未赋值的变量的处理方法
同时也结合计算机的内存分配方面的知识讲了 基本类型和引用类型的分配的不同和原因, 还在javascrip中用
于收集释放内存的单元收集 还有作为属性的变量 全局变量与局部变量 以及javascript的执行环境
还有在javascript中找变量的顺序 以及由此产生的变量作用域链
第五章 表达式和运算符
5.1 表达式
5.2 运算符 见页71
5.21 运算数的个数
大多数运算符都是二元运算符, 简而言之他们有二个运算数,此外javascript还支持三元
运算符
5.22 运算数的类型
我们要注意传递给运算符的数据类型和返回的类型
其次我们还要注意 在某些情况 javascript会把表达式转换为适当的类型
注:只要注意javascript会把表达式转换为适当的类型就可以了
5.23 运算符的优先级
这里我觉得不要多说
5.24 运算的结合性
这个也不用多说
5.3 算术运算符
5.4 相等运算符
5.41 相等运算符(==) 和等同运算符(===)
5.4.1.1 Netscape中的相等和不等性
比较二个值是否相等
5.4.2 不等运算符(!=)和不等同运算符(!==)
5.5 关系运算符
5.5.1 比较运算符
5.5.2 in运算符
in运算符号要求左边的运算符是一个字符串,右边的运算符是一个对象或数组
var point ={x:1,y:1}
var has_x_Code="x" in point 值为true
5.5.3 instanceof 运算符
用于判断对象是不是属于某个类
比如: var d= new date();
d instanceof date//值为true d由date()创建
d instanceof Number// 值为flase d不是number对象
5.6 字符串运算符
5.7 逻辑运算符
5.8 赋值运算符
5.10 其他运算符
5.10.1 条件运算符(?:)
比: document.write(111>10 ? 3*5 :-1*12);
如果条件成立执行第一个 否则执行第二个
5.10.2 typeof 运算符号 类型符号
5.10.4 delete 运算符
delete运算符号是一个运算符,它将删除运算数所指定的对象的属性,数组元素或变量 如果删除
成功,它将返回true 如果运算数不能够删除 它将返回false
注意;并非所有的属性和变量都是可以删除的
例: var o ={x:1,y:2}
delete o:x;
typeof o.x
void 的另一个用途是专门生成 undefined值
5.10.6 逗号运算符(,)
5.10.7 数组和对象存储运算符
可以使用方括号([])来存储数组的元素,使用点号(.) 来存取对象元素
5.10.8 函数调用运算符
例: document.close()
Math.sin()
注:本章比较简单 不懂的地方可以查表一样看就可以
有一个新鲜的地方 void 相等运算符(==)和等同运算符(===)
第六章 语句
6.1 表达式语句
6.2 复合语句
{
x=Math.PI
cx=math.cos(x);
alert("cos("+x+")="+cx);
}
6.3 if语句
if(expression)
statement
if(expression)
statement1
else
statement2
6.4 else if 语句
6.5 switch 语句
6.6 while 语句
6.7 do/while 语句
do
statement
while(expression)
6.8 for
for(initialize;test;increment)
statement
在这里我们可以看到:在使用continue时, while循环与for循环并不等价
exzample: for(i=0,j=10;i<10;i++;j--)
sum+=i*j;
6.9 for/in
6.10 标签语句
parser:
while(token!=null){
}
6.11 break语句
6.12 continue语句
6.13 var 可以同时声明多个变量
6.14 function语句 定义一个javascript函数
function functionName(arg[1[arg2[...,argn]]]){
statements
}
6.15 return 语句
return expression
6.16 throw 语句
throw expression 抛出一个异常
6.17 try/catch/finally
错误处理代码
6.18 with 语句
with语句可以减少大量的深入
6.19 空语句
Javascript 语句小结见 121
注:这里注意一下for/in 语句 和标签语句的用法就可以了
第七章 函数
7.1 函数的定义
7.11 嵌套函数
7.12 function()构造函数 var f = new function("x","y","return x*y;");
7.13 函数的直接量 function f(x) {return x*x)}
7.2 作为数据的函数
在javascript中 函数不仅是一种语法 还是数据 我们能够把函数赋予变量 存储在对象的属性中或存储在数组元素中,传递给函数
function square(x) {return x*x}
7.3 函数的作用域;调用对象
Javascript 函数的主体,
7.4 函数的实际参数:Arguments对象
function f(x,y,z)
{
if(arguments.length!=3){
throw new Error("function f called with"+arguments.length+"arguments,but is exepects 3 arguments"
}
}
7.41 属性callee 用于引用当前正在执行的函数,这对未命名的函数调用自身非常有用
注:这个是调用自身
<script>
function d(x){
if(x<=1) return 1;
return x* arguments.callee(x-1);
}
document.write(d(3));
</script>
7.5
函数的属性和方法
7.51 属性length
由于函数是对象 具备 属性length:
7.5.2 属性prototype
每一个函数都有一个prototype属性 它引用预定义的原型对象,原型对象在使用new运算符把函数作为构造函数时起作用,它在定义新的
对象类型时起着非常重要的作用
7.5.3 定义你自己的函数属性
这个是说明我们可以为对象建立属性
a.b=1;
function a() {
return a++;
}
7.5.4 方法apply()和call()
注:这二个方法是所以函数都具有的
使用它们可能更简单
例:我们要把二个数字传递给函数f() 并将它作为对象o的方法调用 可以使用如下代码
o.m=f
o.m(1,2);
delete o.m
apply()方法与call()方法相似,只不过是要传递给函数参数是由数组指定的
注:本章讲了函数的定义和调用,嵌套函数,
构造函数: var f = new Function("x","y" "return x*y;");
函数的直接量:var f= fuction(x) {return x*x; );
作为数据的函数: var a =square(4) //a存放数字16 注:函数不仅是一种语法 它还可以是数据,这意味着它能够把函数
赋给变量,存储在对象的属性中或存储在数组元素中,传递给函数
还讲到了函数的实际参数:Arguments对象 Arguments对象就像数组,可以按照数字获取传递给函数的参数值,但它并非真正的
Array对象 我觉得Arguments很有意思也很有用 我们可以利用它获得传递给函数的参数值
下面讲了arguments的属性calless 是用来引用当前正在执行的函数
最后讲了函数的属性和方法
属性lengthm,prototype 我们还可以定义自己的属性 接着讲了方法 apply()和call() 使用这二个方法可以像调用其他对象
方法一样调用函数
第八章 对象
对象是一种基本的数据类型 而且它们也是最重要的一种数据类型
8.1 对象的属性
对象是一种复合数据类型,它们将多个数据集中在一个单元中,而且允许使用名字来存取这些值,解释对象的另一个方法是,对象是
一个无序的属性集合,每个属性都有自己的名字和值,存储在对象中已命名的值既可以是数字和字符串这样的原始值,也可以是对象
8.1.1 对象的建立
对象是由运算符new创建的,在这个运算符之后必须有用于初始化对象的构造函数名,
var now = new date()
var new_years_eve = new date(2000,11,31);
8.1.2 属性的设置与查询
var book = new Object(); //设置对象
book.title="Javascript:the Definitive Guit" //设置对象的属性
alert(book.title) //读取属性
8.1.3 属性的枚举
我们可以用 for/in 循环提供了一种骗历对象属性的方法,
下面的函数用于列出对象的所有属性
function displayprertryName(obj){
var names=" ";
for(var name in obj) names +=name+"\n";
alert(names);
注:属性可以列举
8.1.4 未定义的属性
如果要读取一个不存在的属性的值, 那么得到的结果是一个特殊的Javascript值---undefined
可以使用运算符 delete来删除一个对象的属性:delete book.chapeter1
注:用delete来删除一个对象的属性
8.2 构造函数
我们从前面知道,在javascript中,使用new 运算符以预定义的构造函数(如Object(),date(),Function()等) 可以初使化一个新对象
要创建已经定义了带有属性的对象,需要编写一个构造函数在新的对象中创建并初使化这些属性,构造函数是具有两个特性的javascript
函数
它由new运算符调用
传递给它的是一个对新创建的空对象的引用,该引用作为关键字this的值,而且她还要对新创建的对象进行适当的初使化
Rectangle对象的构造函数
例:
function Rectangle(w,h)
{
this.width=w;
this.height=h;
}
var rect1 = new Rectangle(2,4);
var rect2 = new Rectangle(22,33);
注:构造函数如何使用它的参数来初使化this关键字所引用的对象属性,记住构造函数只是初使化了特定对象,但并不返回这个对象
构造函数没有返回值
8.3 方法
所谓方法,其实就是通过对象调用javascript函数,回忆一下可以知道,函数就是数值,它们所使用的名字没有任何特殊之处,可以将
函数赋给任何变量,甚至赋给一个对象的任何属性,如果有一个函数f和一个对象0,就可以使用如下的代码定义一个名为m的方法
0.m
注:说了几次的话题了注意函数是可以赋值给对象 作为一个属性的
方法有一个非常重要的属性,即在方法主体内部,关键字this的值就变成了调用该方法的对象,
注:这里的this我的觉得和Actionscript里的this差不多,
例:
//该函数使用了关键字this,这样它就不必自己调用自己
//而成为了定义width属性和height属性的对象的方法
function compute_area()
{
return this.width*this.heigth;
}
//使用前面定义的构造函数创建一个新的Rectangle对象
var page = new Rectangle(8.5,11);
//通过把函数赋予对象属性,来定义一个方法
page.area=compute.area;
var a =page.area(); // a=8.5*11=93.5
注:本几部分感觉始终没有完全的掌握,注意这这里创建对象的方法,以及怎么样
把函数赋给对象,并注意是怎么样来定义一个方法的
我已经学了 怎么样创建对象,以及怎么样设置对象的属性和查询
然后怎么样对属性进行枚举, 怎么样删除属性
以及怎么样建立构造函数 它与对象的关系 它怎么样成为对象的一个方法
例二:
首先定义一些函数将他们作为方法
function Rectangle_area() { return this.width * this.height; }
function Rectangle_perimeter() { return 2*this.width + 2*this.height; }
function Rectangle_set_size(w,h) { this.width = w; this.height = h; }
function Rectangle_enlarge() { this.width *= 2; this.height *= 2; }
function Rectangle_shrink() { this.width /= 2; this.height /= 2; }
为Rectangle对象定义一个构造函数,
构造函数不仅要初始化属性,还要给方法赋值
function Rectangle(w, h)
{
// Initialize object properties.
this.width = w;
this.height = h;
// Define methods for the object.
this.area = Rectangle_area;
this.perimeter = Rectangle_perimeter;
this.set_size = Rectangle_set_size;
this.enlarge = Rectangle_enlarge;
this.shrink = Rectangle_shrink;
}
现在,一旦创建一个Rectangle对象,就可以直接调用它的方法
var r = new Rectangle(2,2);
var a = r.area();
r.enlarge();
var p = r.perimeter();
注:1:说实在的在这里我觉得 在网上实际中看到的一般是比较简单的,所以看起来比较简单
而我这里看的例子确是很多地方用到这样一个特性 就是把函数作为对象的属性
这一特性, 如果对象是构造函数的话 我们就可以实例化该对象
然后我们就可以引用该对象的属性了 我觉得这个和actionscript差不多
以及后面的超类和子类
我觉得在学本门语言 也必须掌握这样一个特定 构造函数 实例化函数
上面的例子很重要
比方: 比方我们把Rectangle_area()赋予给构造函数 Rectangle()作为它的一个属性
然后我们实例化函数Rectangle(2,2)
这样我们通过新建的r 就可以引用它的属性就相当方便了
2:因为Javascript是一种无类型的语言,所以你不能给函数的参数指定一个数据类型,而且
Javascript也不会检测传递的数据是不是那个函数所要求的类型,如果参数的数据类型很重要
那么可以用运算符typeof对它进行检测
3:上面的例子总想在前面和后面加上一个<script>就去进行调试,后来终于知道了 原来这样
是不行的,因为它们在本书的例子中是放在js文件中的
4: 直接量的大分析
对函数直接量的解析
上面是构造函数所用的方法,其实还有一种直接的方法
var f = new Function("x","y", "return x*y";);
开始对函数的直接量,不是很明白,觉得不是很明白,不过对它有一个很清晰的认识了
函数的直接量是用关键字function后面加上可选的函数名,用括号括起来的参数列表和
用花括号括起来的函数定义的 简单的说 函数的直接量看起来就像个函数定义,只不过
没有函数名,只不过没有函数名,它们之间的最大差别是函数直接量可以出现在其他Javascript
表达式中,因此除了函数定义来定义函数square();
function square(x) { return x*x}
还可以用函数直接量来定义它
var saquare = function(x) { return x*x}
对对象的直接量的解析
在学习的过程中也常常看到说对象的直接量,可以也不知道这是什么所以对此,也进行一下说明
对象的直接量是由一个列表构成的,这个列表的元素是用冒号分隔的属性/值对,元素之间用逗号
开了,整个列表包含在花括号之中,所以可以使用如下的方式来创建并初使化上面代码中的piont
对象: var point ={x:2.3,y:-1.2}
数组的直接量
数组的直接量是一个封闭在方括号中的序列
var a=[1.2,"javascript",true];
对其他直接量的理解
上面讲的是主要的 其实还有其他的 比如:
整型直接量:一个数字直接出现在Javascript中的时候 我们称它为数值直接量
十六进制直接量;浮点直接量:字符直接量
我对此的理解:我觉得这二个 一个是没有用函数名 第二个是不要声明对象了
二我们我们要使用直接量 我想应该是直接出现在其他javascript表达式中
其实这个在其他语言中也有 只是称呼不同 开始我还比被这个新名次给迷住了
其实就是给对象 数组 什么的 直接赋值
当然如果不直接赋值那就写法不同的比如上面的
对象:var o = new Object();
数组: var a = new Arrary();
函数:function square(x)
{
return x*x;
}
8.4 原型对象
先看一个例子
用原型对象定义一个circle类
//我们的类定义一个构造函数的方法 用它初使化circle对象的属性
function cirle(x,y,r)
{
this.x=x; //圆的x座位
this.y=y; //圆的Y座标
this.r=r; //圆的半径
}
//创建并舍弃初使的circle对象
new Circle(0,0,0);
//定义一个常量 即所有circle对象共有的属性
circle.prototype.pi=.3.1415
//定义一个圆的周长的方法
//首先声明一个函数,然后把它赋给原型对象的一个属性
function Circle_circumferentce(){ return 2*this.Pi * this.r}
circle.prototype.circumference= Circle_circumferentce;
//定义另一个方法,这次使用函数直接量来定义函数
Circle.prototype.area=function(){return this.Pi * this.r*this.r;}
//circle类已经定义了 现在我们可以创建一个实例并调用它的方法
var c = new Circle(0,0,1);
var a = c.area();
var p = c.circumference();
上面这个是一个 有一个类 ---》 对象 ---》方法 的这样一例子
我觉得在这里 circle为一个类 而c为对象 area(), c.circumference()为方法
我觉得Circle其实就是 对象的c的原型对象 而这里的方法也是利用函数的直接量
赋予给另对象作为其的一个属性 而调用该函数就直接用area()就可以了
开始对函数这里有一点不理解:
Circle.prototype.area=function(){return this.Pi * this.r*this.r;}
var c = new Circle(0,0,1);
var a = c.area();
为什么写的是 c.area() 而不是c.area 也知道第一句是用函数的直接量去写的
后来想了想觉得这种写法是正确的 因为它需要传递参数啊 如果不要传递参数就不需要
括号了
再对照c# 看一个例子
class workmen_yg
{
double a;
public workmen_yg( double a)
{
this .a = a;
}
public virtual void workmen( double i)
{
}
public double workmen_end( double year1)
{
if (year1 == 1 )
{
return 800 ;
}
else
{
for ( double t = 1 ;t <= year1;t ++ )
{
a = a * ( 1 + 0.1 );
}
return a;
}
}
}
class wokemen
{
public static void Main()
{
double year1 = 1 ;
double r = 800 ;
workmen_yg r1 = new workmen_yg(r);
r1.workmen(r);
Console.WriteLine( " {0} " ,r1.workmen_end( year1));
}
}
仔细观察c#中的这个例子 就可以发现
workmen_yg r1 = new workmen_yg(r); 和 var c = new Circle(0,0,1); // 这个都是确立一个对象
r1.workmen(r); 和 var a = c.area(); //通过这个对象去调用其下面的方法 包括有的要传递参数
workmen_yg 和 Circle //这里是充当类的角色
注:Javascrip以原型对象为基础的继承机制,不是采用以类为基础的继承机制
avascript中的对象可以具有大量的属性,而且还可以动态地将这些属性添加到对象中
虽然Javascript支持我们称为对象的数据类型,但它并没有类的概念,这使它有别于那些向对象的编程语言,在面向对象的编程语言中
,共的概念是强类型和支持以类为基础的继承机制,如果根据这个评判标准,javascript很容易从真正的类中区分出来, 但是我们又
发现Javascript大量的使用了对象,而且它还有自己的以原型对象为基础的继承机制,这说明Javascript是一种真正面向对象的语言
,它从大量的其他面向对象语言中获得灵感,这些语言采用以原型对象为基础的继承机制,而不是采用以类为基础的继承机制
虽然Javascript不是一种以类为基础面向对象的程序设计语言,但是它在模拟像Java和C这样的语言相当出色,
首先,我们知道到 对象是一个数据结构,包含各种命令了的数据段,而且还包含对这个数据段进行操作的各种方法,一个对象组将数
值和方法组织到一个方便的包中,这样就增强了代码和模块的可用性,从而使用程序设计更加容易,Javascript中的对象可以具有大量
的属性,而且还可以动态地将这些属性添加到对象中,这样像Java和c++这样的强类语言中是做不到的,在那些语言中,每个对象都有
一套预定义的属性, 而且每个属性都有预定义的类型,在使用javascript的对象来模似面向对象的程序设计方法时,通常是给每个对象
预线定义一套属性,以及该属性的数据类型。
在Java和C++中,类定义了对象的结构,类确定了一个对象包含有哪些域以及每个域包含什么样的数据类型,类也定义了对象进行操作的方法
虽然javascript并没有真正类的概念,但是我们知道,它用构造函数和原型模拟了类
在javascript和类为基础的面向对象语言中,同一个类可以具有多个对象,我们常常称对象是它所属的那个类的实例,所以任何类都
可以有多个实例,有时候我们用实例化这个术语描述创建一个对象的过程。
java中有一条常用的约定,即命名类时以大写字母开头,命名对象时以小写字母开头,这一约定可以帮助我们区分代码中的对象和类,
Javascript沿用了这一有用的约定
一个Java类的成员有四种可能的具备类型,实例属性,实例方法,类属性以及类方法 下面我们讲Javascript如何模拟它们
8.51 实例属性
每一个对象都有它自己单独的属性副本,简而言之,如果有十个给定的类的对象,那么每个实例属性就有十个副本
注:我觉得这个比较好理解 其实就是实例化一个类
8.52 实例的方法
实例的方法和实例的属性非常相似,只不过它是方法而不是数值( 在Java中,函数和方法并不像他们在javascrip那样是数据,
所以这一区别就更加明显了)实例方法是由特定对象或实例调用的,Circle类中的方法area()就是一个实例方法,它是由于
cicle对象c调用的
a=c.area();
实例方法使用关键字this来引用他们要操作的对象或者实例,虽然一个类的任何实例都可以调用实例方法,但是这并不意味着
每个对象都像实例属性那样含有自己专有的方法副本,相反,每个实例方法都是类的所有实例共享的,在Javascript中 给类
定义一个实例的方法,是通过把构造函数的原型对象中的一个属性设置为函数值来实现的,这样,由那个构造函数创建的所有
对象都会共享一个已继承的对象函数的引用,而且在使用上面所述的方法调用语法就能够调用这个函数
8.5.3 类属性
在Java中,类属性是一个与类相关联的变量,而不是和类的每一个实例相关联的变量,无论一个类创建多少个实例,每个类属性只
有属性只有一个副本,就像实例属性是通过类的实例存储的一样,类属性是通过类存储的。
例: Circle.pi=3.14
8.5.4 类方法
类方法是一个类关联在一起的方法,而不是和类实例关联在一起的方法,要调用类方法,就必须使用类本身,而不能使用该类的特定
实例,方法Date.parse()就是一个类方法,通过构造函数对象date()才能够调用这个方法,而不能通过date类的一个特殊实例来调用
它
由于类方法不能通过一个特定的对象调用,所以使用关键字this对它来说没有什么意义和类属性一样,类方法是全局性的,因为类方法
不能够对特定饿对象进行操作,所以类方法更容易被认为是由类调用的函数,同样的,将这些函数关联到一个类可以使它们在javascript
的名字空间有一个顺利的位置,并且防止出现命名冲突,在javascript中,要定义一个类方法,只需要用合适的函数作为构造函数的属性
即可
下面是一个例子,它包含了前面四个例子中所有基本的成员类型
function Circle(radius) { //这个构造函数定义了类自身
this.r =radius; //r是构造函数定义并初使化的一个实例属性
}
Circle.PI是一个类属性,它是构造函数。
Circle.PI=3.14159;
//以下的函数将计算一个圆的面积
function Circle_area() { return Circle.PI*this.r*this.r;}
//下面我们通过把函数赋给构造函数的原型对象使它成为一个实例方法
//记住,在Jaavscript1.2中 我们可以调用函数直接量定义一个无需命名为Circle_area的函数
Circle.prototype.area=Circle_area;
//以下是另一个函数,它以两个cirlce对象为实际参数,并返回其中较大的一个(取半径较大的实际参数)
function Circle_max(a,b) {
if(a.r>b.r) return a;
else return b;
}
//由于该函数比较是两个Circle对象,所以将它看作对个别Circle对象进行操作的实例方法是没有意义的,但是我们不希望
//它成为一个独立的函数,所以我们把它赋予一个构造函数。使它成为的方法
Circle=Circle_Max;
//下面的代码使用了circle对象的各个域
var c = new Circle(1.0) //创建Cicrle类的一个实例
c.r = 2.2 //设置实例属性r
var a = c.area(); //调用实例方法area()
var x = Math.exp(circle.PI); //在我们自己的计算中使用属性PI
var d = new Circle(1.2); //创建一个Circle实例
var bigger = Circle.max(c,d);
8.5.7 超类的子类
在Java,C++中,其它以类为基础的面向对象的语言中,都有一个明确的类层次的概念,每一个类
都有一个超类,它们从超类中继成属性和方法,类还可以被扩展,或者说子类化,这样其它子类
就能够继成它的行为,我们已知道,Javascript支持的是以原型为基础的继成机制,但是我们
仍旧能够总结出类似的类层次图,在javascript中,类Object是最通用的类,其它所有的类都是
专用化了的版本,或者说是Object的子类,另一种解释方法是Object是所有内部类的超类,所有
类都继成了Object的基本方法
注:这里object就是和其它类一样它就是相当是超类
我们已经学会了对象如何从它们构造函数的原型对象中继承属性,那么它们又是如何继成类型
Object的属性的呢,我们知道,原型对象本身就是一个对象,它是由构造函数Object()创建的
,这是意味着对象继成了Object.prototype属性,因此Complex的对象就继成了Complex.prototype
对象的属性,而后者又继成了Object.prototype的属性,由此可以推出,对象Complex继成了两个对象
的属性,在Complex对象中查询某个属性时,首先查询是是这个对象本身,如果在这个对象中没有发现
要查询的属性,就查询Complex.prototype对象,最后,如果在那个对象中还没有找到要查询的属性
就查询Object.prototype对象
注:1:这里我们要注意一下它查询的方向
查询对象本身----》查询Complex.prototyepe对象--》查询Object.prototype对象
这里体现出来的是由对象 到 类 到超类 的一个过程 对我们明白这个概念有很大的帮助
2:由于Complex原型对象是在查询Object的原型对象被查询的,所以Complex.prototype的属性
就隐藏了Object.prototype的同名属性
我们在本章使用的类都是Object的直接子类,这是javascript程序设计所特有的,通常它不需要生成更加
复杂的层次,但是在必要的情况下,有可能对其它类进行了类化。
例如:假定我们要生成类complex的一个子类,以便能添加工工业一些新方法,要做到这一点,只需要确保
新类的原型对象是Coplex的一个实例,这样它就能继承Complex.prototype的所有属性
//下面是子类的构造函数
function MoreComple(real,imaginary){
this.x=real;
this.y=imaginary;
}
//我们将它的原型对象作为Complex对象,这意味着新的实例继成MoreComplex.prototype;--->后者由Complex.prototyepe继成
而来的---->它又由Object.prototype继成而来的
MoreComplex.prototype = new Complex(0,0)
//下面给子类添加一个新的方法或特性
MoreComplex.prototype.swap=function()
{
var tmp = this.x;
this.x = this.y;
this.y =tmp;
}
注:只要注意一下你就会发现,如果你如果讲到类的继承就会讲到属性Prototype,那么prototype到底是干什么的,
其实每个函数都有一个prototy属性,它引用的是预定义的原型对象,原型对象在使用new运算符把函数作为
构造函数时起作用,它在定义新的函数时起作用
仔细观察我们就会发现,oreComplex.prototype = new Complex(0,0) 表达了一个继承的作用 虽然我prototypo
没有比较深刻的了解 但是我觉得它确实在传递这这样一种继承的关系,我想以后应该对次有更进一步的认识
仔细观察觉得问题就出在prototype 它有这样一个用法
如果我们要表达a对象继成了b对象那么我们就这么写:a.prototype=b
如果b是构造函数我们就可以这么定义 a.prototype= new b(x,y) 这里b是构造函数,new b(x,y)是实例化构造函数为
对象 开始看这个看不懂,现在知道了
a.prototype.b=c 这里的a可以是对象或者类,b为类的属性或者类 而c是a方法 注意这里如果a为类,那么c就为
类的属性,如果a为对象,那么c就为对象的属性 而这里c可以为方法
上面展示子类化方法有一点缺陷,由于我们明确地把MoreComplex,prototype,设成了我们所创建的 一个对象,所以就
覆盖了Javascript提供的原型对象,而且抛弃了给定的constructor属性,该属性引用的是创建这个对象构造函数,但是
MoreComplex对象继承了它的超类的constructor属性,明确地设置这一属性可以解决问题
MoreComplex.prototype.swap=MoreComplex;
8.6 作为关联数组的对象
我们已经见到过用运算符"."来存取一个对象的属性,而且数组更常用的存取属性运算符是[],这样,下面的代码是等价的:
object.property
object["prooerty"]
这两条语法之间最重要区别是;前者的属性名是标识符,后者的属性名却是一个字符串,很快我们就会明白为什么这一点如此重要
在c,c++,java和其它类似的强类型语言中,一个对象的属性数是固定的,而且必须预定义这些属性的名字,由于javascript是一种
松类型的语言,它并不采用这一规则,所以估用Javascript编写的程序中,可以为对象创建任意数目的属性,但是当你采用“."
运算符来存取一个对象的属性时,属性名是用标识表示的,而且在javascript中,标识符必须被依个的输入,它们不是一种数
据类型,因此程序不能对它们进行操作
另一方面,当数组的[]表示来存取一个对象的属性时,属性名是用字符串表示的,字符串是Javascript的一种数据类型,因此可以
在程序运行过程中操作并创建它们,
var addr = "";
for(i=0,i<4;i++)
{
addr +=customer["address"+i]+'\n';
}
这一代码读取了customer对象的属性 address0,address1,address2和address3 并且将它们连接起来.
上面的代码段说明了采用数组表示法访问带有字符串表达式的对象的属性是非常灵活的,虽然我们也可以用"."的表示法来编写
那个例子,但是也有一些情况是只能用数组来解决的
所以在编写程序时就不用“."运算符来存取对象的属性,但是可以使用运算符[]来命名属性,因为它的属性名是一个符串值
(该值是动态的,可以在运行时改变的),而不是一个标识符,如果当一个数组采用的是这种形式,我们常常称它为关联数组
它是一个关联数组,它是一个数据结构,允许你动态在将任意数值和任意字符串关联在一起,实际上javascript对象在内部
是用关联数组实现的,存取属性时使用"."的表示法使用看来像样C++和Java的静态对象使用,它们同样很出色,
除此之外,它们还有更强大的能力,可以将数值和任意字符串关联起来,从这个角度看,javascript比C++和Java对象更像Per数组
我们在第六章中介绍了for/in循环,当这个Javascript语句和关联数组一起使用时,它的强大之处才真正显示出来,现在返回到
股票业务量的例子中,在用户输入了自己的业务量后,我们需要使用如下代码来计算它的当前总值
var value = 0;
for (stock in protfolio) {
//获联有价证卷览表中每支股票的单价
//然后用股份额乘以它
如果没有for/in循环我们就编不出这样的代码,因为股票的名字是可以预知的,这是把属性名从名为portfolio的关联数组中抽出来
的惟一方法
注:这一个知识点说实在的不是非常熟悉,但是我知道我们使用了按[]来命名属性,而对象采用这种
形式,我们常常称它为关联数组,它可以解决实际许多的问题,比如上面说的股票问题
而for/in 循环这个是我们应该注意的,这个前面学过现在对其进行再一次说明,它可以遍利查出对象所有的属性
8.7 对象的属性和方法
在javascript中所有对象都由类Object继成而来,虽然一些专用的类,如内部的String类,或用户定义
的Complex类都定义了自己的属性和方法,但是所有对象,无论它的类是什么都支持Object定义的
属性和方法,由于这些属性和方法的一般性,使得它们具有特殊的重要性.
注:这里想要强调一句话:所有对象,无论它的类是什么都支持Object定义的属性和方法
8.7.1
从Javascript1.1开始,每个对象都具有constructor属性,它们引用的是用来初始化该对象的构造函数
例:
var o = new Complex(1,2)
o.constructor = Complex;//值为true
当然,并不是每一个Complex对象(或者其他任何类型对象)都具有自己惟一的constructor属性,相反这个属性是从原型对象继承而来的
我们在前面的节中讨论过,Javascript会为我们定义的每一个构造函数都创建一个原型对象prototype属性,但是在前面的小节中没有
说明原型对象的初始值是非空的,在原型对象创建之初,它包括一个constructor属性,用来引用构造函数,也就是说,如果有一个函数
f,那么属性f.prototype=constructor就总等于f(除非将它设为别的值)
由于构造函数定义了一个对象的类,所以属性constructor在确定给定对象的类型时是一个功能强大的工具,例如 可以使用如下代码
来确定一个未知的对象类型
if(( type o=="object")&&(o.constructor == date))
但是,并不能保证constructor属性总是存在的,例如,一个类的创建者可以用一个全新的对象来替换构造函数的原型对象,而新对象可
能不具换构造函数在原型对象,而新对象可能不具有有效的constructor属性
8.7.2 toString()方法
转换成字符串
这里想说明一个地方:
当我们定义一个类的时候,就应该为它定义一个tostring()方法,以便能够将这个类的实例转换成有意义的字符串,这个字符串
应该包含被转换的对象的有用信息,因为这对调试来说非常有用
例:
Circle.prototype.tostring=function() {
return"[cirlce of radius"+this.r+",centered at("+this.x+","+this.y+").];
}
用上面定义的tostring()方法可以将一个典型的circle对象转换成字符串"[cirlce of radius i, centered at(0,0).]
8.7.3 toLocalestring()
除了tostring()方法外,object()类还定义了toLocalestring()方法,Object类还定义了toLocalsestring()方法,该方法的作用
是返回该对像局部化的字符串表示,Object类定义的默认toLoacalestring()方法自身不做任何局部化,返回的结果与tostring()
方法返回的完全相同,但是Object类的子类则可能定义自己的toLocalestring()方法
注:这个和tostring()差不多,但是它是在局部的
8.7.4 valueof() 方法
方法value()和方法tostring()非常相似,当Javascript需要调用它,这个函数返回的是能代表关键字this所引用的对象的的值
的数据,由于对象没有定义为原始类型的值,所以大多数对象都没有等价的原始值,因些由object类定义的value()方法不执行任何
转换,只是返回调用它的对象,像Number和Boolean这样的类具有明显的原始等价值,所以它们就覆盖了方法valueof(),让它返回合适
的原始值,这就是Number和boolen对象的行为和它们的等价原始值如此想象的原因
注:这个以前在别的编程语言中看到,我想差不多的
8.7.5 hasOwnProperty()方法
如果局部定义了一个非继承的属性,属性名是由一个字符串实际参数指定的,那么该方法将返回true 否刚,它们返回false
例: var o = new Object()
o.hasowmProperty("underf")//返回false:tostring是一个继成的属性
Math.hasOwmProperty("cos");//true:Math对象有cos属性
注:我觉得它的作用就是检查这个对象有没有这个属性
8.7.6 propertylsEnumerable()方法
如果你定义了一个属性,属性名是由一个字符串实际参数指定的,而且该属性可以用for/in循环枚举出来;那么该方法返回true
否刚返回false
例:
var o ={x:1}
o.propertyisenumerable("x");//返回true:改属性存在,而且可以枚举
o.propertyisemumerable("y");//false该属性不存在
o.propertyisEnumerable("valueof")//flase:该属性不可枚举
注意,ECMAScript标准规定propertyisEnumerable()方法只考虑对象直接定义的属性
注:这里我觉得就是强掉了属性可以用for/in循环枚举出来;那么该方法返回true 否刚返回false
8.7.7 isPrototypeOf()方法
如果调用对象是实际参数指定的对象的原型对象,该方法返回true.否刚返回false,该方法用途和对象的construector属性相似
var o = new Object();
Object,prototype.isPrototypeOF(o) //true:o.constructor ==Object;
Object.isPrototypeof(0); //false
Function.prototype.isPrototypeof(object) //true:Object.constructor==Function
注:我觉得该函数检查的是实际参数指定的对象是不是原型对象
第九章 数组
数组不过是一个具有额外功能层的对象
9.1 数组和数组元素
数组是一种数据类型,它包含或者存储了编码的值,每个编码的值称为该数组的一个元素,同一个数组的不同元素可以具有不同的类型
,数组的元素甚至可以包含其它数组,这样就可以创建一个复杂的数据结构,即元素为数组的数组
注:注意这一点,同一个数组元素可以具有不同的类型
9.1.1 数组的创建
有三种方法:
1:第一种方式无参数调用 var a = new Array();
2:直接赋值:var a = new Array(1,2,3,4,5,"number1","number2");
3:指定数组长度但不指定数组: var a = new array(10);
注:上面说的三种方法
9.1.2 数组元素的读写
a[b]=c
我们在前面见到过,运算符[],还可以用来存取已命名对象的属性
例:my["salary"]*=2;
注:上面的例子,告诉我们对象和数组本质是相同,这个在Javascript中才有的,注意数组的下标必须是大于等于0并小于2(32)
-1的整数,如果你使用的数字太大,或使用了负数,浮点(或布尔值,对象及其它值),javascript会将它转换为一个
字符串,用生成的字符串作为对象属性的名字,而不是作为数组下标,因此, 下面的代码创建了一个名为"-1.23"的属性
,而不是定义了一个新的数组元素;
9.1.3 添加数组元素
要给一个数组添加新元素,只需要给它赋一个值就可以了不起: a[10]=19;
注:这里有两点要注意
1:在像c和Java这样语言,数组元素个数是固定的,你必须在创建数组时指定它的元素,而在Javascript中刚不同,它的数组
可以任意个元素,你可以任何时候改变元素个数
2: 在Javascript中,数组是稀疏的,这个意味着组的下标不会落在一个连续的数字范围内,只有那些真正存取在数组中的元素
才能够分配到内存
9.1.4 数组的长度
注:这注意下面几点
1: 和其它语言一样,下标从0开始
2: 数组的Length(),返回数元素的个数
3: length属性既可以读也可以写,这里就会出现两种情况,如果给Length设置了一个比它的当前值小的值,那么数组将会被
截,那么大于这个长度以外的元素都会被抛弃,它们的值也会丢失
如果值比当前值大,那么新的,未定义的元素将会被添加到数组未尾使得数组增长到新的指定的长度
4: 通过使用length属性来截断数组元素是唯一缩短数组长度的方法,因为如果你作用delete运算符来删除数组中的元素
那个元素变成未定义,但是数组的length属性并不会改变
9.1.5 多维数组
虽然Javascript不支持真正的多维数组,但是允许使用元素为数组的数组,这样就非常接近多维数组,要存取一个元素为数
组的数组的元素,只需要使用两次[]运算符即可
假设变量matrix是一个元素数字数组的元素,它的每个元素matrix[x]都是一个数字,要存取这个数组中的一个数字,就要写成
matrix[x][y]
注:对于多维数组,想说的是Javascript并不真正支持多维数组,但是我们可以在数组中嵌套数组
9.2 数组的方法
注:这里介绍类Array,这个函数很重要,它提供了各种方法来操作数组,我查了此函数,它很有用
9.2.1 join()方法
它可以把一个数组的所有元素都转换成字符串,然后再把它们连起来
sting.split()相反,后者是通过将一个符串分割成几个片段创建数组
9.2.2 reverse()方法
将颠倒数组元素的顺序,并返回颠倒后的数组
9.2.3 sort()方法
Array().sort()是在原数组上对数组元素进行排序,返回排序后的数组
例: var a = new Arrary("bb","cc","aa");
a.sort();
var s = a.join(","); //返回 s =="aa,bb,cc"
9.2.4 concat()方法
方法Array.concat()能创建并返回一个数组,这个数组包含了调用concat()的原始数组的元素,其后跟随的是concat()的参数
如果其中有些参数是数组,那么它将被展开,其元素将添加到返回的数组中,但是要注意的是,concat()并不能递归地展开一
个元素为数组的数组
9.2.5 sicle()方法
注:这个就是根据不同的参数截取数组元素中的元素
9.2.6 splice()方法
注: 它是插入或删除元素数组元素的通用方法
9.2.7 push()方法和pop()方法
注:这个两个方法在其它语言中我也接触过,它们也知道 这里不多说
9.2.8 unshift()方法和shif()方法
9.2.9 tostring()方法和toString()方法
注:将数组中的每个元素转换成一个字符串
第十章 使用正刚表达式的模式匹配
正刚表达式是一个描述字符模式的对象,Javascript的Regexp类表示正则表达式,而string和RegRXP都定义了使用正刚表达式进行强大
模式匹配和文本检索与替换的函数
注:我觉得这个很有用,因为我们常常要在用正则表达式进行文本检索,虽然在非脚本语言中我们也常常用到正则表达式,但是我觉得最
好用脚本
10.1 正则表达式定义
在Javascript中,正刚表达由RegExp对象表示
如果你要创建RegExp对象,有下面两种方法
1:直接创建: var pattern =/S$/;
2:用构造函数RegExp()也可以定义一个等价正则表达式 var pattern = new RegExp("S$");
正则表达式中都有它特殊的含义,如:/s$/ 匹配的就是以字母"s"结尾的字符串
注:有关正则表达式的完整语法远远超出了本书的范围,而Perl语言对此有完整介绍
10.1.1 直接量字符
在正则表达中所有字母字符和数字都是按照直接量与自身相匹配,javascript的正则表达式语法还通过以反斜杠(\)开头的
转义序列支持某些非字母的字符 如:/n 为换行
具体见:Page175 表175
注:许多标点符号具有特殊的含义(^$*.?=|/\(){}[]),某些符号只有在正刚表达式特殊环境中才具有特殊的含义,
其它环境刚被按照直接量进行处理,作为一个通用原则.如果你在正则表达式中按照直接量使用这些标点符号,就必须加前缀a\,
其它标点符号(如引号和@)没有特含义,在正刚表达式中只按照直接量匹配自身
还有许多字母和数字在反斜杠前有特殊含义,所以想按照直接量进行匹配的字母和数字,不要用反斜杠
那么如果我们要直接加反斜杠,怎么办:用正则表达式"/\\/"与任何包含义反斜杠的字符匹配
10.1.2 字符类
我觉得就是对字符进行匹配操作的
字符的匹配法则可以见表Page 176 表10-2正则表达式的字符类
例: /[abc]/ 与字母a,b,c中的任何一个字母匹配
/[^abc]/ 与字母a,b,c中之外的任何一个字母匹配
组合使用: \s匹配所有空白符,\d 匹配所有数字 /[\s\d]/就可以匹配任意空白符和数字
10.1.3 重复
对于一些比较复杂模式使用正则表达式语法都指定该正则表达式中的一个元素重复出现的次数.
注:这里在的用法比较重要,很多复杂的地方都要用到,正则表达式的重复字符在表10-3中有
10.1.3.1 非贪婪的重复
列出的重复字符可以匹配尽可能多的字符,而且允许接下的正则表达式继续匹配,我们说重复"贪婪的",可以
非贪婪的方式进行重复
10.1.4 选择,分组和引用
如果有很多表达式项,我们可以用"|" 表达或的关系
例: /ab|cd/ 匹配是字符ab或者cd
注意:选择项是从左到右考虑的,直到发现匹配项,如果左边的选择项匹配,就忽然右边的匹配项,即使它产生更好的匹配,
因此,把模式/a|ab/应用到字符串"ab"上时,它只匹配第一个字符
在正则表达式中,括号的另一个作用是在完整的模式中定义子模式,当一个正刚表达式成功地和目标字符串相匹配时,可以
从目标串中抽出和括号中的子模式相匹配的部分,这是通过在字符"\"后加一位或多位数字实现的,
数字指定了带括号的子表达式在正则表达式中的位置
例: \1 表达式引用的是第-个带括号的子表达式
注:这里说明一下,我们如果要在正则表达中,抽出与其匹配的部分出来,我们就可以使用括号,如果这个表达式有
几个部分,那么我们就可以用几个括号,而/n 就是抽出第N个括号里的东西
正则表达式的选择,分组和引用字符见表10-4 Page180
10.1.5 指定匹配的位置
正则表达式的锚字符,见表10-5 正则表达式的锚字符
10.1.6 标志
它是正则表达式的标志,它说明高级模式匹配的规则,和其他的正则表达式语法不同,标志是在"/"符号之外说明,即它
们不出现在两个斜杠之间,而是位于第二个斜杠之后
表10-6:正则表达式的标志
10.1.7 Javascript不支持的Perl RegExp特性
10.2 用于模式匹配的string方法
这里讲了几个方法 search():该方法以正则表达式为参数,返回第一个与之匹配的子串的开始字符的位置
例:"Javascript".search(/script/i);
replace():执行检索替换操作
例: text.replace(/javascript/gi,"Javascript"); //无论大小写形式如何,都用正确的大小写形式替换
当前的字符串
match()是最常用的string()方法,它惟一的参数就是一个正则表达式,返回的是包含了匹配结果的数组
split()这个方法可以把调用它的字符串分解为一个子串数组,使用分隔符是它参数
例: "123,356,789".split("."); //返回["123","456","789']
10.3 RegExp对象
RegExp类的一个不寻常的特性是它既然定义了类属性,又定义了实例属性
RegEXp支持三大方法和大量属性
例: var a = new RegExp("\\d{5}","g");
10.3.1 RegExp定义了两个用于执行模式匹配操作的方法
exec() 方法对一个指定的字符串执行一个正则表达式,也就是说它在一个字符串中检索匹配,如果找到了匹配就返回
一个数组,否则返回null
例: var pattern =/java/g;
var text="Javascript is more fun than java !";
var result;
while((result =pattern.exec(text))!=null){
alert("Matched'"+result[0]+"'"+'at position " +result.index+";next search begins at "+pattern.lastindex);
}
另一个RegExp方法Text(),它比exec()方法简单一些,它的参数是一个字符串,如果这个字符串包含正则表达式的一个匹配
它就返回true
10.3.2 每个RegExp对象都有五个属性,属性source是一个只读字符串,它存放的是正刚表达式的文本,属性global是一个只读
的布尔值,它说明了该正则表达式是否具有标识g 其次还有ignorecase lastindex multiline
第十章 Javascript的更多主题
11.1 数据类型转换
我们知道是一种无类型语言,这就是说,在声明一个变量时无须指定它的数据类型,所以它给予了Javascript所需要的灵活性
和简单性,Javascript对数据类型的灵活方式的一个重要特性是自动类型转换.
对于数据类型转换基本规则:如果某个类型值用于需要其它类型的值的环境中,Javascript就自动将这个值转换成所需要的类型
这里还可以参考一个表:
表11-1:自动数据类型转换
11.1.1 对象到基本数据类型的转换
一般通过valueof()转换,但是由于大多数对象继成了Object()对像,ValueOF()方法,它只返回对象本身,所以我们可以
用tostring()方法进行转换
11.1.2 显式类型转换
我们还可以显式的从一种类型转换为另一种类型
Number(),Boolen(),string(),Object()都可以作为函数调用,就像作为构造函数被调用一样,采取这种方式调用时,这些
函数将把它们的参数转换成合适的类型,例如:可以使用string(x)将任意x转换成一个字符串,使用object(y)将任意值y
转换成一个对象
要把一个转换成字符串,可以把它连到一个空串上:
var x_as_string = x+"";
要把一个值强制转换成数字,就用它减0:
var x_as_number = x-0;
要把一个值强制转换成布尔值,需要连用两次"!!"运算符
var x_as_boolen =!!x;
11.1.3 从数字到字符串的转换
从数字到字符串转换在Javascript中是最常见的,虽然它通常都是自动发生的,但是有几种有用的方法可以用于显式
执行这一转换:
var string_value =String(number); //把String()构造函数用作函数
var string_value =number+"";// 与空串连接
把数字转换成字符串的另一种方法是用toString()方法
stirng_value =number.toString();
Javascript1.5 之前有一个缺陷,陷阱它没有一种内部的方式可以将数字转换成字符串,ECMAscriptv3和Javascript1.5
解决了这一问题,它们给number类添加了三种将数字转换面字符串方法
toFixed()将把数字转换成字符串并显示小数点后指定的小数
toExponential()
toPrecision()
11.1.4 从字符串到数字的转换
表示数字的字符串用于数字环境时会自动转换成真正数字,如前面所示,我们可以显式地进行这一转换
var number = number(string_value);
var number = string_value - 0;
我们可以使用parserint()和parsefloat()这个两个函数转换并返回一个字符串开头的所有数字,并忽略其后的所有非数字
后缀
注:其实我觉得对于这类问题,没有必要记住,只要了解一下就可以了
11.2 使用和使用引用
和其它语言一样,在Javascript中,可以采用三种重要的方式来操作一个数值,第一:可以复制它 第二:可以将它作为
参数传递给一个函数或方法 第三:可以把它和其它的值进行比较来看看两者是否相等,要理解任何一种程序设计语言
就必须理解在那种语言中这三种操作是如何被执行的
注:这里我想说的是我以前在其它语言也看到过,于是看了一下,觉得差别不是很大
对于它的使用可以见表11-2 使用值和使用引用
11.2.1 基本类型和引用类型
Javascript的基本原则是这样的:基本类型使用值来操作,引用类型,使用引用来操作,在Javascript中,数字和布尔值是基本类
型,这它们基本,是因为它们只是由小的,固定数量的字节构成的,这些字节是在Javascript解释器的低层进行操作的
另一方面:对象就是引用类型,作为特殊类型的数组和函数因此也是引用类型
那么字符串又是什么类型呢?由于字符串的长度是任意的,所以看起来它好像应试属于引用类型,但实际上在javascript中
它们通常被当作基本类型,因为它们并不是对象
注: 根据"引用比较"的原则,不同的对象不相等,对于两个变量即使它们的值不同,但是如果它们所引用的对象相同,它们也是相等的
我觉得这里还要注意的是,基本类型的值一般是不变的,而引用类型刚会根据引用的不同会有所变化,
变里书上有很好的例子可以见:Page:198 例:11-2
11.2.2 字符串的复制和传递
javascript的字符并不是非常适合基本类型,由于字符串不是对象,所以自然假定它们为基本类型,但是如果它们为基本
类型,那么根据上面给出的原则,应试使用值来操作它们,但是又因为字符串的长度是任意的,所以 字节地来复制,传递和比较
字符的效率很低,因此假定字符串是作为引用类型被操作的也很自然
注意虽然我们可以用charat()方法返回字符串位于指定位置的字符,但是却没有相应的setCharAt()方法,这并不是一个漏洞
jvascript的字符串是有意地被设为不可变的,也就是说,没有一种Javascript语法,方法或属性可以改变字符串的字符
注:这里注意字符串是不可以被修改的就可以了.
11.2.3 字符串比较
尽管我们不能确定复制或传递字符串时使用的是值还是引用,但是我们能够编写代码来判断字符串比较时使用的是值还是引用
例:11-4:字符串比较时使用的是值还是引用
//判断比较时使用的是值还是引用很容易,我们比较两个明显不同的字符串,它们恰好含有相等的字符
//如果用值来比较,它们就相等,但是如果用引用来比较,它们就不相等
var s1 ="hello";
var s2="hell"+"o";
if(s1==s2) document.write("string compared by value");
这个实验说明比较字符串时使用的是值,这也许会使,某些程序员感到吃惊,在c,c++,和Java中,字符串属于引用类,比较时
使用的是对它们的引用,如果你想比较两个字符串的实际内容,必须使用特殊的方法或函数,但是javascript是种更高级的
语言,它认为你在比较字符串时最想使用的它们的值,因此,尽管Javascript为了效率起见,复制和传递字符串时使用的是引用
,但是在比较它们时使用的却是值
11.2.4 使用值和使用引用:总结
在Page:200 表达式11-3 总结出了操作不同的jvascript类型时所采取的方式
11.3 无用存储单元收集
11.3.1 标记和清除的无用存取单元
11.3.3 采用引用计数的无用存取单元收集
注:这里讲的是Javascript使用无用存储单元收集的方法来回收那些由字符串,对象,数组或函数占用的而且不再使用的
内存.我觉得此知识点了解就可以了
11.4 function()构造函数和函数直接量
我们有二种方法可以创建函数:一种是使用构造函数function()来定义函数,另一种是使用函数的直接量来构造函数
这两种方法使用的是:构造函数的调用出现在一个循环中,或者出现在一个经常被调用的函数中,这种方法效率非常低
另一个方面,函数的直接量或出现在循环和函数中的嵌套函数不是在每次调用时都被重新编译,而且每当遇到一个函数直接
量时也不创建一个新的函数对象,还有使用构造函数Function()创建函数不使用词法作用域
浙公网安备 33010602011771号