JavaScript权威指南之学习笔记第六版.docx
- 文档编号:7161560
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:32
- 大小:40.13KB
JavaScript权威指南之学习笔记第六版.docx
《JavaScript权威指南之学习笔记第六版.docx》由会员分享,可在线阅读,更多相关《JavaScript权威指南之学习笔记第六版.docx(32页珍藏版)》请在冰豆网上搜索。
JavaScript权威指南之学习笔记第六版
JavaScript权威指南之学习笔记(第六版)核心笔记
一、说明
JS权威指南文字用红色标出;
JS高级程序设计用橙色标出;
自己加上的文字用粉红色标出;
其
(一)-(九)为JS权指南,(十)为JS高级程序设计
二、记法结构
2.1字符集
Javascript程序用的是Unicode字符集编码。
2.2大小写敏感
Javascript是一种区分大小写的语言,但是注意HTML是不区分大小写的(尽管XHTML区分大小写的)。
也即在HTML中这些标记和属性名可以任意的大小写方式输入,但是在Javascript中它们通常都是小写的。
2.4可选的分号
尽管理论上说来JS允许在任意两个标识符之间放置换行符,但是实际上JS会自动插入分号。
例:
Return
True;
JS会假定你的意图是:
Return;
True;
2.7标识符
第一个字母必须是字母、下划线或美元符号($)!
三、数据类型和值
3.1数字
Javascript不区整型值和浮点型数值。
在Javascript中,所有的数字都是由浮点型表示的。
3.1.1,3.1.2整型直接量、八进制和十六进制的直接量
十六进制直接量是以”0x”或”0X”开头,而八进制是以数字0开头。
在ECMAScript标准中不支持八进制的直接量,但是Javascript的某些实现是允许八进制格式的整型直接量的。
所以一般最好不要使用以0开头的整型直接量。
3.1.3浮点直接量
例如
3.14
234.342
.342424
2.32e23
1.23424E-32
3.1.6特殊的数值
当一个算术运算(如0除0)产生了未定义的结果或错误时,就会返回一个特殊的非数字的值,为NaN。
这个数字值和任何数值都不相等,包括它自己在内,所以需要一个专门的数字来检测IsNaN()来检测这个值。
特殊数值常量
NAN
Infinity无穷大
Number.MAX_VALUE
Number.MIN_VALUE
Number.NaN
Number.POSITIVE_INFIITY
Number.NEGATIVE_INFITY
这是特殊的常量都是在运算时可能产生的,用IsNaN()或isFinite()等函数来检测。
3.2字符串
3.2.1字符串直接量
字符串是由单引号或双引号括起来的Unicode字符.在单引号可以含有双引号,双引号可以含有单引号。
3.2.2字符串直接量中的转义序列
\0\b\t\n\r\v\f\’\”\\\uXXXX(四位十六进制的Unicode字符)\xXX由两位十六进制指定的latin-1字符
3.2.3字符串使用
可以用(+)来连接字符串。
3.2.4数字转换为字符串
Varnumber=100;
Vars=number.toString();
还可以指定转换的基数,
Vars=number.toString(16);
还有三个函数可以精确指定转换后的数字格式,toFixed(),toExponential(),toPrecision();
3.2.5字符串转换为数字
当把一个字符串用于数字环境中,它也会自动地转换为一个数字,
Vart=”21”*“2”;
利用这一优点,只要把一个字符串减去0就可以将其转换为一个数字。
Vart=string_value-0;
ParseInt()和ParseFloat(),这两个函数可以从字符串开始处转换和返回任何的数字,忽略或舍去非数字部分。
ParseInt()甚至可以接受另一个参数来指定要解析的数字的基数。
合法的范围在2至36之间。
ParseInt(“012”,2);
ParseInt(“0x23”);//默认返回10进制
这两个函数不能把指定的字符串转换为数字,它们会返回NaN.
ParseInt(“ele”);//返回NaN
3.7Null
Null被看作对象类型的一个特殊值,即代表“无对象”的值。
3.8undefined
使用了已经声明但还没有赋值的变量时,又或者使用了一个并不存在的对象属性时,返回的就是这个值。
注意这个特殊的undefined值不同于null。
但是==运算符却将两者相等的。
3.11Error对象
当运行发生错误时,Js会抛出某个类的对象。
3.12类型转换小结
不同的值在不同的环境运行时所转换成的值
值字符串数字布尔对象
未定义的值“undefined”NaNfalseError
Null“null”0falseError
非空字符串不变字符串中的数字值或NaNtrueString
空字符串不变0falseString
0“0”不变falseNumber
NaN“NaN”不变falseNumber
无穷“InFinity”不变trueNumber
负无穷“-InFinity”不变trueNumber
任意其他的数字数字字符串值不变trueNumber
True“true”1不变Boolean
False“false”0不变Boolean
对象toString()valueOf(),toString(),或NaNtrue不变
注:
对于对象的转换,当在一个数字环境时JS首先调用该对象的ValueOf()方法,如果这个方法返回一个基本类型的值,这个值会被使用,然而在大多数情况下,valueOf()方法返回的是对象自己,在这种情况下,JS先使用toString()方法把对象转换为一个字符串,然后再试图把该字符串转换为一个数字。
3.13,3.14基本数据类型的包装对象
跟C#或JAVA里的包装对象是一样的,比如用一个字符串变量时使用了一个字符串对象的方法或属性,JS会为这个字符串值内部创建一个String包装对象.String对象替代了原始的字符串值。
注意,这个对象中只是瞬时存在的,在用完以后就没有用了,系统会把它丢弃。
Vars=”asdf”;
Varlen=s.length;//用长度属性。
注意:
JS中函数的方法call(),apply(),可能还有其它的方法能被字符串常量,数字,布尔类型甚至null,undfined调用,为什么?
因为包装对象啊!
!
!
在这两个函数里面需要对象所以就把常量包装成对象了来调用对象,用完就丢掉!
!
jQuery中的的each方法循环对象的属性时就是用的这个特性。
3.15传值和传址
基本类型为Null,Undefinded,布尔型,数字。
引用类型为数组、函数、对象。
JS字符串是通过传址来复制和传递的,而它们是通过传值来比较的。
可以说是既能是基本类型又是引用类型!
四、变量
4.1变量类型
JS是非类型的,也即变量可以存放任意类型的值。
4.2变量的声明
重复的声明和遗漏的声明
可以使用VAR语句重复声明一个变量不仅是合法的,而且也不会造成任何错误。
如果尝试读一个未声明的变量的值,JS会生成一个错误。
如果尝试给一个用VAR语句的变量赋值,JS会隐式声明这个变量,但注意,隐式声明的变量总是被创建一个全局变量,即使该变量只是一个函数体内使用。
4.3变量的作用域
如果一个局部变量或函数的参数声明的名字与某个全局变量的名字相同,那么就有效地隐藏了这个全局变量。
局部变量必须是用var语句,否则就是全局变量了。
4.3.1没有块级作用域
JS中没有块级作用域的概念,函数中声明的所有变量无论是在哪里声明的,在整个函数中它们都是有定义的。
实际这个说法对全局变量也是起作用的,例
Varscope=”global”
Functionf(){
Alert(scope);//displays“undefined”,notglobal
Varscope=”local”;
Alert(scope);//displays“local”
}
F();
局部变量在整个函数体内部都是有定义的,这就意味着在整个函数体中会隐藏了同名的全局变量。
虽然局部变量在整个函数体中是有定义的,但是在执行var语句之前,它是不会被初始化的。
这个例子说明了把有的变量集中起来放置在函数的开头是一个好的编程习惯。
4.3.2未定义变量和未赋值变量
未定义变量就是没有被告声明过的,无论是显示声明不是隐式声明,读取这样的变量会出错.
未赋值的变量是虽已经声明了,但是没有给它赋值!
4.6作为属性的变量
4.6.1全局对象
JS解释器开始运行时,它首先要做的事情之一就是在执行任何JS代码之前,创建一个全局对象,这个对象的属性就是JS程序的全局变量。
当声明一个JS的全局变量或函数时,实际上所做的是定义了那全局对象的一个属性。
或者说用一个同名的属性来存储全局变量和全局函数。
此外,JS解释器还会用预定义的值和函数来初始化全局对象的许多属性,如Infinity,parseInt,Math分别引用了数值infinity,预定义函数ParseInt()和预定义对象Math.
在程序的顶层代码(不是函数中的代码)可以用this关键字来引用这个全局对象。
在客户端JS中,Window对象代表浏览器窗口,它是包含在该窗口中的所有JS代码的全局对象,这个全局对象具有自我引用的window属性,它代替了this属性,可以用来引用全局对象。
4.6.2局部变量:
调用对象
内嵌的函数、函数的参数和局部变量是调用对象的属性。
调用对象是在函数运行时创建的!
一般用完就释放,除非产生了闭包!
4.7深入理解变量作用域
在JS的顶层代码中,作用域链只由一个对象构成,那就是全局对象。
所有的变量都是在这一对象中查询的。
如果一个变量存在,那么这个变量的值就是未定义的。
在一个函数(非嵌套)中,作用域链由两个对象构成,第一个函数的调用对象,第二个就是全局对象。
当函数引用一个变量时,首先检查的是调用对象,其次才检查全局对象。
在嵌套函数的作用域链中可以后在三个或更多的对象,查找方式以此类推。
以上所说也就是一个函数在运行的时候的查询变量的情况的流程!
这在闭包中也是这样的一个查找过程!
五、表达式和运算符
5.3算术运算符
1.除法运算符
在js中,由于所有的数字都是浮点型的,所以除法的结果也是浮点型的(不像C++或C#中的那种除出来是整形!
),除数是0的结果为正无穷大或负无穷,而0/0的结果则是NaN.
2.模运算符
取模操作的运算数通常都是整数,但它也适用于浮点数,如-4.3%2.1=-0.1;
除了加号比较特殊外,其它减、除、模、一元减(-)、一元加(-)、递增运算符(++)、递减运算符(--)都会把非数字变成数字的!
5.4相等运算符
5.4.1相等运算符和等同运算符
判定==运算符比较的两个值是否相等。
如果两个值具有相同的类型,那么就检测它们的等同性。
如果两个值的类型不同,它们仍然可能相等,用下面的规则和类型转换来检测它们的相等性。
(数字有最高的优先级)
1)如果一个值是Null,另一个值是Undefined,则它们相等。
2)如果一个值是字符串,另一个值是数字,那么字符串先转化为数字再进行比较
3)如果一个值是布尔值,另一个值为数字或字符串,布尔值和字符串都先转化为数字再进行比较,true为1,false为0.
4)如果一个值是对象,别一个是数字或字符串,则对象转换为相应的原始类型的值。
5)其它组合的值不等的。
5.5关系运算符
5.5.1比较运算符(<,>,<=,=>)
这些比较运算符的运算数可以是任意类型的。
但是比较运算只能在数字和字符串上执行,所以不是数字或字符串的运算数将被转换为数字或字符串。
1) 字符串和数字比较,转换为数字再进行比较。
2)操作数不能转换为数字或字符串时,比较结果为false。
3)若一个操作数为NAN或转换为了NAN,比较结果为false。
5.5.2In运算符
In运算符要求左边的运算数是一个字符串,或可以被转换为字符串,右边的运算数是一个对象或数组或函数。
如果该运算符左边的值是其右边对象的一个属性名,它返回true。
例
Varpoint={x:
1,y:
2};
Varhas_x_record=”x”inpoint;//returntrue
Varhas_z_record=”z”inpoint;//returnfalse
函数之所以可以由此运算符来检测属性,因为函数也可以有属性,并且本身就是特殊的对象(或叫类更好些),所以由推开去,很多对象有的功能,函数和数组也有
5.5.3instanceof运算符(跟C#的is关键字类似)
Instanceof运算符要求左边的运算数是一个对象,右边的运算数是对象类型的名字。
注意,所有对象都是类object类的实例。
例:
Vard=newDate();
dinstanceofDate;//returntrue
dinstanceofObject;//returntrue
dinstanceofNumber//returnfalse
vara=[1,2,3];
ainstanceofArray;//returntrue
ainstanceofObject;//returntrue\
5.6字符串运算符
字符串算符“+“中,字符串的优先级最高。
如:
1+”2”=”12”,”2”+1=”21”.
5.7逻辑运算符
5.7.1逻辑与运算符(&&)
先计算左边表达式的值,如果左边表达式值可以转换为false,那么返回的是左边表达式的值,否则,它将计算右边的表达式的值,并且返回这个表达式的值。
5.7.2逻辑或运算符(||)
原理同逻辑与运算符,先计算左边表达式的值,如果左边表达式的值可以转换为true,则返回这个表达式的值,否则,它将计算右边表达式的值,并且返回该表达式的值。
5.7.3逻辑非运算符(!
)
在对操作数取反之前,!
运算符先把它的运算数转换为一个布尔类型的值,这意味着,对任何值x应用两次运算符(即!
!
x)都可以将它转换成一个布尔值。
第一次为了使操作数在布尔环境中取得操作数的相反的布尔值,而第二次就是使取得操作数的正确的布尔值!
!
5.10其它运算符
5.10.2typeof运算符(与C#的typeof()运算符一样的)
它测试一个操作数,返回一个字符串来表式一个操作数的类型。
对数字、字符串或布尔值,返回”number”、”string“、”boolean”,而对数组、对象和Null,它返回的是”object”,而对函数运算数,返回的是”function”,如果运算数是未定义的,它将返回”Undefined”.
5.10.4delete运算符
它将删除运数所指定的对象的属性、数组元素或变量或函数的属性。
如果删除成功返回true,若不能删除,返回false。
并非所有的属性和变量都是可以删除的,某些内部的核心和客户端属性不能删除,用var语句声明的用户定义变量也不能被删除。
注意,删除属性、变量(数组不一样)不只是把它们的值设置为undefined,当删除它们后,它们全部变成未定义的,也即不存在的,再次尝试读取它们时会出错。
Delete所能影响的只是属性值,并不能影响被这些属性引用的对象,即这些对象只要用其它属性引用就还存在!
5.10.5void运算符
它可以出现在任何类型操作数之前,它总是舍弃运算数的值,然后返回undefined.这种运算符通常用在客户端的javascript:
Url中,在这里可以计算表式的值,但是不会显示出这个值。
voidwindow.open();”>openawidnow 六、语句 6.1switch语句 ECMAScriptv3标准允许case语句扣跟随任意的表达式。 例如: Case60*60: CaseMath.pi; Casen+1; 注意: 由于匹配的case表达式是用===等同运算符判定的,而不是用==运算符判定的,所以表达式必须在没有类型转换的情况下进行匹配。 6.9for/in语句 For(variableinobject) {statement } Variable应该是一个变量名,声明一个变量的var语句,数组的一个元素或者是对象的一个属性。 Object是一个对象名。 在循环体执行之前,对象的一个属性名会被作为字符串赋给变量variable。 在循环体中可以使用这个变量和[]运算符查询该对象属性的值。 注意,for/in循环中的variable可以是任意的表达式,只要它们的值适用于赋值表达式的的左边即可。 JS的数组是一种特殊的对象,因此可以像循环对象属性那样枚举数组下标。 如果for/in循环的主体删除了一个还没有枚举出的属性,那么该属性就不再枚举,如果循环主体定义了新属性,那么循环是否枚举该属性则由JS的实现决定。 For/in循环并不会遍历所有对象的所有可能的属性,那些被标记为只读的、永久的或不可列举的(继承的也不可以),这些属性使用此语句是枚举不出来的,所有用户自定义的属性可以枚举的! 6.14function语句 函数定义可以嵌套在其它函数定义中,但是只能嵌套在那些函数顶层中,也就是说,函数定义不能出现在IF语句,while语句或其它任何语句中。 在技术上说,function语句并非是一个语句.JS中语句会引发动态的行为,但是函数定义描述的却是静态的程序结构。 语句是在运行时执行的,而函数则是实际运行之前,当JS代码被解析或被编译时定义的。 当JS解析程序遇到一个函数定义时,它就解析并存储构成函数主休的语句,然后定义一个和该函数同名的属性(如果函数定义在其它的函数中,那么就在调用对象中定义这个属性,否则在全局对象中定义这个属性)以保存它。 这会产生一些奇怪的行为。 例: Alert(f(4));//displays16 Varf=0; Functionf(x); { Reutrnx*x; } Alert(f);displays0.f()hasbeenoverwrittenbythevariablef 出现这种情况是由于函数定义和变量定义出现在不同的时刻。 6.15return语句 如果一个函数执行了一个不带expression的return语句,或者因为它执行到了函数的尾部而返回,那么这个函数的表达式的值就是undefined。 6.16throw语句 Throwexpression Expression的值可以是任何类型的值,但通常它是一个Error对象或Error子类的一个实例。 6.17try/catch/finally语句 这个语句的使用和c#的使用差不多。 Try{}catch(e){}finally{} 七、对象和数组 7.1对象 包含在一个花括号中,每个属性名可以是一个JS标识符或一个字符串或一个字符串,而每个属性值可以是一个常量或任意的JS表达式。 例: Varempty={}; Varpoint={x: 0,y: 0}; Varhomer={“name”: ”homer”,”age”: 34}; (2)new创建对象 Vard=newDate(); Varreg=newRegExp(); 7.2对象属性 对象的属性和变量工作方式相似,即可以把值存储其中,也可以从中读取值。 一旦通过给属性赋值创建了该属性,就可以在任何时刻修改这个属性的值。 可以通过把一个值赋给对象的一个新属性来创建它。 Varbook={}; Bool.widht=20//create 7.2.1属性的枚举 For/in语句枚举属性。 JS权威指南中说,for/in循环枚举列出的属性并没有特定顺序,其它细节见6.9.但是,我做了一个示例它是按属性的定义来枚举的,那会在什么情况下的顺序会不定呢? varobj={ t1: 1, t2: 2, t3: 3, t4: 4 }; for(oinobj) { alert(obj[o]);//output1,2,3,4 } 7.2.2检查属性的存在 In运算符可以用来测试一属性的存在,详见5.5.2 7.2.3删除属性delete运算符 删除属性并不是仅仅把属性设置为undefined,它实际上从对象中移除了属性,在删除之后,for/in将不会枚举该属性。 详见5.10.4 7.3作为关联数组的对象 就是用像读取数组的方式来读取属性值。 其实对象的属性也可以是数字的,类数组的对象! ! Obj.propery; Obj[“property”]//关联数组 7.4通用ojbect属性和方法 7.4.1.constructor属性 每个对象都有一个constructor属性,它引用了初始化这个对象的构造函数。 例: Vard=newDate(); d.constructor==Date//returntrue 7.4.3.hasOwnProperty()方法 如果此方法中指定的参数属性来自本地定义的一个非继承的属性,此方法返回true。 Varo={}; O.hasOwnProperty(“unde”);//returnfalse,thepropertyisnotdefined O.hasOwnProperty(“toString”);//false,toStringisanihheritedproperty Math.hasOwnProperty(“cos”);//true: theMathobjecthasacosproperty 7.4.6.propertyIsEnumeralbe()方法 如果此方法中指定的参数属性来自本地定义的一个非继承的属性,并且如果这个属性可以在一个for/in循环中枚举,此方法返回true。 注意,一个对象的所有用户定义的属性都是可以枚举的,不能枚举的属性通常是继承的属性,因此这个方法几乎总是会和hasOwnProperty()返回相同的值。 7.4.7.isPrototypeOf()方法 如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JavaScript 权威 指南 学习 笔记 第六