JavaScript高级程序设计(第3版)第五章读书笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript高级程序设计(第3版)第五章读书笔记相关的知识,希望对你有一定的参考价值。
第五章 引用类型
- 创建Object实例的方式有两种,第一种是使用new操作符后跟Object构造函数,例如:
var person = new Object( );
person.name = “Nicholas”;
person.age=29;
第二种是使用对象字面量表示法。如:
var person = {
name : “Nicholas”,
age : 29
};
在最后一个属性后面添加逗号,会在IE7及更早版本和Opera中导致错误。
- 两种访问对象属性的方法,一是方括号语法,例如person[“name”],而另一种是点表示法,例如person.name。方括号语法的主要优点是可以通过变量来访问属性。如果属性名中包含会导致语法错误的字符(属性名中包含非字母非数字的),或者属性名使用的是关键字或保留字,也可以使用方括号表示法。通常,更建议用点表示法。
- 不同于其他语言,ECMAScript数组的每一项可以保存任何类型的数据,而且ECMAScript数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。
- 创建数组的基本方式有两种:一是使用Array构造函数,如 var colors = new Array( );第二种方式是使用数组字面量表示法。如 var colors = [“red”, “blue”, “green”];不要以逗号结尾,以免产生混淆。如 var values = [1,2,] ,会创建一个包含2或3项的数组。
- 数组的length属性不是只读的,可以自定义,即可以从数组的末尾移除项或向数组中添加新项。
- 对于一个网页,或者一个全局作用域而言,使用instanceof操作符就能得到满意的结果。但instanceof操作符的问题在于,它假定只有一个全局执行环境。因此,ECMAScript5新增了Array.isArray( )方法。此方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。支持Array.isArray( )方法的浏览器有IE9+、Firefox4+、Safari5+、Opera10.5+和Chrome。
- 所有数组对象都具有toLocaleString( )、toString( )和valueOf( )方法。其中调用数组的toString( )方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。而valueO( )返回的还是数组。注意:alert()接收字符串参数,所以它会在后台调用toString( )方法。
- join( )方法可以使用不同的分隔符来构建这个字符串。Join( )方法只接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串。
如 var colors = [“yellow”,”red”,”green”];
alert(colors.join(“|”)); //yellow|red|green
如果不给join( )方法传入任何值,或者给它传入undefined,则使用逗号作为分隔符。IE7及更早版本会错误的使用字符串“undefined”作为分隔符。
- 数组的栈方法(后进先出)的数据结构。push( )方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。而pop( )方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。
- 数组的队列方法(先进先出)。队列在列表的末端添加项,从列表的前端移除项。仍然使用push( )向数组末端添加项,使用shift( )从数组前端取得第一项并返回该项,同时将数组长度减1。Unshift( )方法与shift( )的用途相反,它能在数组前端添加任意个项并返回新数组的长度。
- 数组的两个重排序方法:reverse( )方法会翻转数组想的顺序,sort( )按升序排列数组项,sort( )方法会调用每个数组项的toString( )转型方法,然后比较得到的字符串,以确定如何排序。因此,sort( )方法可以接收一个比较函数作为参数,以便指定哪个值位于哪个值的前面。
- 数组的concat( )方法可以基于当前数组中的所有创建的一个新数组,创建当前数组的一个副本,然后将接收到到的参数添加到这个副本的末尾。
var colors = ["red", "green", "blue"];
var colors2 = colors.concat("yellow",["black","brown"]);
colors //["red", "green", "blue"]
colors2 //["red", "green", "blue", "yellow", "black", "brown"]
- 数组的slice( )方法,基于当前数组中的一或多个项创建一个新数组。接收一个到两个参数,即返回项的起始和结束为止,但不返回结束位置的项。
var colors3=colors2.slice(1); //["green", "blue", "yellow", "black", "brown"]
var colors4 = colors2.slice(1,4); // ["green", "blue", "yellow"]
slice()方法的参数中有一个附属,则用数组长度加上该数来确定相应的位置。
var colors5 = colors2.slice(-2,-1); // ["black"]
- 数组的splice( )方法是最强大的数组方法,主要用途是向数组的中部插入项。
删除:可以或删除任意数量的项,只需指定2个参数:要删除的第一项的位置,和要删除的项数;
插入:可以向指定位置插入任意数量的项,需指定3个参数:起始位置、0(要删除的项数)、要插入的项数。
替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,需指定3个参数:起始位置,要删除的项数、要插入的任意数量的项。
Splice( )方法始终都会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何项,则范湖一个空数组)。
var colors = ["red","green","blue"];
var removed = colors.splice(0,2);
colors //["blue"]
removed //["red", "green"]
removed = colors.splice(0,0,"yellow","orange"); //[]
colors //["yellow", "orange", "blue"]
removed = colors.splice(1,3,"red","pink"); //["orange", "blue", "yellow"]
colors //["yellow", "red", "pink", "orange"]
var colors = ["yellow", "orange", "blue"];
removed = colors.splice(1,2,"red","pink"); //["orange", "blue"]
colors //["yellow", "red", "pink"]
- 数组位置查找方法:indexOf( )和lastIndexOf( )。这两个方法都接收两个参数:要查找的项和(可选的)表示查找起点位置的索引。成功则返回查找的项在数组中的第一次出现的位置,否则返回-1.在比较过程中,将使用全等操作符。
var numbers = [1,2,3,4,5,4,3,2,1];
numbers.indexOf(4); //3
numbers.indexOf("4"); //-1
numbers.lastIndexOf("4"); //-1
numbers.lastIndexOf(4); //5
numbers.indexOf(4,4); //从起始位置向后找
numbers.lastIndexOf(4,4) //3 从起始位置向前找
numbers.lastIndexOf(4,5) //5从起始位置向前找
var person ={name:"Nicholas"};
var people=[{name:"Nicholas"}];
var morePeople = [person];
people.indexOf(person); //-1
morePeople.indexOf(person); //0
- ECMAScript 5为数组定义了5个迭代方法。每个方法要接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响this的值。传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。
every( ):对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true;
filter( ): 对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组;
forEach( ):对数组中的每一项运行给定函数,无返回值;
map( ):对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组;
some( ):对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。
以上方法都不会修改数组中的包含的值。
- 数组归并方法:reduce( )和reduceRight( )。这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。reduce( )方法从数组的第一项开始,逐个遍历到最后,而reduceRight( )则从数组的最后一项开始,向前遍历到第一项。
- Date类型,创建方法: var now = new Date( );
Date.parse( )方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。如果该字符串不能表示日期,则会返回NaN。
Date.UTC( )返回日期的毫秒数,但与Date.parse( )在构建时使用不同的信息。
ECMAScript 5添加了Date.now( )方法,返回表示调用这个方法时的日期和时间的毫秒数。
- Date类型的toLocaleString( )和toString( )方法,返回的日期格式不同,valueOf( )方法,返回日期的毫秒表示。
- 日期格式化方法:
toDateString( )——以特定于实现的格式显示星期几、月、日和年;
toTimeString( )——以特定于实现的格式显示时、分、秒和时区;
toLocaleDateString( )——以特定于地区的格式显示星期几、月、日和年;
toLocaleTimeString( )——以特定于实现的格式显示时、分、秒;
toUTCString( )——以特定于实现的格式完整的UTC日期。
没有一个方法能够用来在用户界面中显示一致的日期信息。
- 日期/时间组件方法,见书102页。
- RegExp类型,字面量形式语法为: var expression = /pattern/ flag; 模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。
g: 表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
i : 表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写;
m:表示多行模式,即在到达一行文本末尾时还未继续查找下一行中,是否存在于模式匹配的项。记住:不往前找。
模式中使用的所有元字符都必须转义,正则表达式中的元字符包括:
( [ { \ ^ $ | } ? * + . ] }
使用RegExp构造函数创建正则表达式,两个参数:一个是要匹配的字符串模式,一个是可选的标志字符串。这两个参数都是字符串!
使用正则表达式字面量和使用RegExp构造函数创建的正则表达式不一样。在ECMAScript 3中,正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例。但在ECMAScript5中,两者都会创建新的RegExp实例。
- RegExp实例属性:
global:布尔值,表示是否设置了g标志;
ignoreCase: 布尔值,表示是否设置了i标志;
lastIndex : 整数,表示开始搜索下一个匹配项的字符位置,从0算起;
multiline: 布尔值,表示是否设置了m标志;
source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
- RegExp实例方法:
主要方法是exec( ),该方法是专门为捕获组而设计的。exec( )接收一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组,若无匹配项,则返回null。返回的数组是Array的实例,但包含两个额外的属性:index和input。对于exec( )方法而言,不设置全局标志的情况下,在同一个字符串中多次调用exec( )将始终返回第一个匹配项的信息,而在设置全局标志的情况下,每次调用exec( )则都会在字符串中继续查找新匹配项。
test( )方法接收一个字符串参数,在模式与该参数匹配的情况下返回true,否则返回false。
正则表达式的valueOf( )方法返回正则表达式本身。
- 使用函数表达式定义函数时,function关键字后面没有函数名,且函数末尾必须有分号。函数名仅仅是指向函数的指针,因此一个函数可能会有多个名字。注意,使用不带圆括号的函数名是访问函数指针,而非调用函数。
- 函数声明和函数表达式的区别:解析器会先解析函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码航,才会真正被解释执行。
- 函数内部,两个特殊的对象:arguments和this。arguments的主要用途是保存函数参数,但它还有个名为callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。this对象引用的是函数据以执行的环境对象。ECMASCript5中定义了另一个函数对象的属性:caller。这个属性中保存着调用当前函数的函数的引用。严格模式下,访问arguments.caller属性会导致错误,另外不能为函数的caller属性赋值,否则会导致错误。
- 每个函数都包含两个属性:length和prototype,其中,length属性表示函数希望接收的命名参数的个数。对于ECMAScript中的引用各类型而言,protorype是保存它们所有实例方法的真正所在。在ECMAScript5中,prototype属性石不可枚举的,因此使用for-in无法发现。
- 每个函数都包含两个非继承而来的方法:apply( )和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
apply( )方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中第二个参数可以是Array的实例,也可以是arguments对象。
call( )方法与apply( )方法的作用个相同,它们的区别仅在于接收参数的方式不同。对于call( )方法而言,第一个参数是this值没有变化,变化的是其余参数都直接传递给函数。换句话说,在使用call( )时,传递给函数的参数必须逐个列举出来。
apply( )和call()最强大的地方在于能够扩充函数赖以运行的作用域。好处是对象不需要与方法有任何耦合关系。
ECMAScript 5 还定义了一个方法:bind( )。这个方法会创建一个函数的实例,其this值会被绑定到传给bind( )函数的值。
- 3个特殊的引用类型:Boolean、Number和String。引用类型有基本包装类型的主要区别就是对象的生存期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直被保存在内存中个,而自动创建的基本包装类型的对象,则值存在于一行代码的执行瞬间。对基本包装类型的实例调用typeof会返回”object”,而且所有基本包装类型的对象都会被转换成布尔值true。注意:使用new调用基本包装类型的构造函数,与直接调用同名的转型函数时不一样的(见书119页示例)。
- Number类型提供了将数值格式化为字符串的方法:toFix( ),会按照指定的小数位返回数值的字符串表示,且有四舍五入规则。用于格式化数值的方法是toExponential( ),该方法返回以指定表示法(e表示法)表示的数值的字符串形式,接收参数,指定输出结果中的小数位数。对于一个数值而言,toPrecision( )方法可能会返回固定大小(fixed)格式,或者指数格式,此方法也接收一个参数,即表示数值的所有数字位数(不包括指数部分)。这三个方法都可以通过向上或向下舍入,做到以最准确的形式来表示带有正确小数位的值。
- String类型的方法
- 字符方法 charAt( )和charCodeAt( ),都接收一个参数,即基于0的字符位置。一份返回指定位置的字符,另一个返回指定位置字符的字符编码;
- 字符串操作方式: concat( ),用于将一或多个字符串拼接起来,返回拼接得到的新字符串。
|
slice( ) |
substring( ) |
substr( ) |
||
第一个参数 |
指定字符串的开始位置 |
||||
第二个参数 |
指定子字符串最后一个字符后面的位置,若无则到结尾 |
指定返回字符的个数,若无则到结尾 |
|||
是否修改字符串本身的值 |
否 |
||||
参数为负值 |
将传入的负值与字符串的长度想家 |
把所有的负值参数转换为0 |
将负的第一个参数加上字符串的长度,将负的第二参数转换为0 |
||
- 字符串的位置方法:
|
indexOf( ) |
lastIndexOf( ) |
功能 |
从一个字符串中搜索给定的字符串,然后返字符串的位置,如果没有找到,则返回-1 |
|
区别 |
从字符串的开头向后搜索子字符串 |
从字符串的末尾向前搜索子字符串 |
- trim( )方法,ECMAScript5中定义,此方法会创建一个字符串的副本,删除前置及后缀的所有空格,然后返回结果,不影响原字符串。
- 字符串大小写转换方法:toLowerCase( )、toLocaleCase( )、toUpperCase( )和toLocaleUpperCase( )。
- 字符串的模式匹配方法
match( )方法只接受一个参数,要么是一个正则表达式,要么是一个RegExp对象。返回一个数组,数组的第一项是与整个模式匹配的字符串,之后的每一项(如果有)保存着与正则表达式中的捕获组匹配的字符串。
search( )方法只接收一个参数,要么是一个正则表达式,要么是一个RegExp对象。返回字符串中第一个匹配项的索引,若无匹配项,则返回-1.该方法始终是从字符串开头向后查找模式。
replace( )方法接受两个参数:第一个参数可以是一个RegExp对象或者一个字符串(这个字符串不会被转换成正则表达式),第二个参数可以是一个字符串或者一个函数,此时函数接受3个参数:模式的匹配项、模式匹配项在字符串中的位置和原始字符串。
split( )可以基于指定的分隔符将一个字符串分割成多个子字符串,并将结果放在一组数组中,分隔符可以是字符串,也可以是一个RegExp对象(这个字符串不会被转换成正则表达式)。split( )方法可以接收可选的第二个参数,用于指定数组的大小,以确保返回的数组不会超过既定大小。
- localeCompare( )方法比较两个字符串,并返回下列值中的而一个:
如果字符串在字母表中应该排在字符串参数之前,则返回一个负数(大多数情况下是-1,视情况而定);
如果字符串等于字符串参数,返回0;
如果字符串在字母表中应该排在字符串参数之后,则返回一个整数(大多数情况下是1,视情况而定)。
- fromCharCode( )方法,是String构造函数本身的静态方法,接受一或多个字符编码,然后将它们转换成一个字符串。从本质上看,此方法与实例方法charCodeAt( )执行的是相反的操作。
- 两大单体内置对象:Global和Math
Global(全局)对象,不属于任何其他对象的属性和方法,最终都是它的属性和方法。Global对象的encodeURI( )和encodeURIComponent( )方法可以对URI( Uniform Resource Identifiers,通用资源标识符)进行编码,以便发给浏览器。其中,encodeURI( )主要用于整个URI,而encodeURIComponent( )主要用于对URI中的某一段进行编码。区别在于,encodeURI( )不会对本身属于URI的特殊字符进行编码,例如冒号、正斜杠、问号和井字号,而encodeURIComponent( )则会对它发现的任何非标准字符进行编码。encodeURI( )和encodeURIComponent( )对应的两个方法分别是decodeURI( )和decodeURIComponent( ),其中decodeURI( )只能对使用encodeURI( )替换的字符进行解码,同理,decodeURIComponent( )只能替换encodeURIComponent( )编码,即可以解码任何特殊字符的编码。
eval( )方法是ECMAScript语言中最强大的一个方法,就像一个完整的ECMAScript解析器,它只接收一个参数,即要执行的ECMAScript(或javascript)字符串。严格模式下,在外部访问不到eval( )中创建的任何变量或函数。
Math对象的属性见书134页。
Math对象的min( )和max( )方法。可接收任意多个数值参数。
舍入方法:Math.ceil( )向上舍入成最接近的整数;Math.floor( )向下舍入为最接近的整数,Math.round( )执行标准舍入,四舍五入为最接近的整数。
Random( )方法返回大于等于0小于1的一个随机数。
以上是关于JavaScript高级程序设计(第3版)第五章读书笔记的主要内容,如果未能解决你的问题,请参考以下文章