创建Object实例的方式(P83)
A(使用new操作符后跟Object构造函数): var person=new Object(); person.name="Nicholas"; person.age=29; B(使用对象字面量表示法): var person={ name:"Nicholas", age:29 }; C(使用对象字面量表示法,但留空花括号的内容): var person={}; //与new Ogject()相同 person.name="Nicholas"; person.age=29;
使用对象字面量向函数传参(P84)
对象字面量是向函数传递大量可选参数的首选方式:
//先定义一个函数 function displayinfo(args){ var output=""; if(typyof args.name=="string"){ output+="Nmae:"+args.name+"\n"; } if(typyof args.age=="number"){ output+="Age:"+args.age+"\n"; } alert(output); } displayInfo({ name:"Nicholas", age:29 }); displayInfo({ name:"Greg" }); 第二次的参数只有一个,函数也正常执行,一般来说函数的明明参数多的话总不够灵活,最好的做法是对那些必须的不可缺少的参数使用明明参数,而对于那些可以缺少的参数通过对象字面量封装为多个可选参数。
Array类型(P86)
检测数组(P88):
if(value instanceof Array){ //对数组执行某些操作 } 如果网页不是单一的全局执行的环境,而是包含多个框架的话,instanceof操作符可能有问题 if(Array.isArray(value)){ //对数组执行某些操作 } Array.isArray()方法可以确定某个值是不是数组,而不管它是在哪个全局执行环境中创建的
转换方法(P89): 转换方法有toString()、valueOf()和toLocaleString()
栈方法&队列方法(P90): push()、pop()、shift()和unshift()
重排序方法(P92):
有reverse()、sort()方法
sort()可以接受一个比较函数作为参数:function compare(value1,value2){ if(value1<value2){ return -1; }else if(value2>value1){ return 1; }else{ return 0; } } var values={0、1、5、10、15}; values.sort(compare); alert(values);//0、1、5、10、15
简化比较函数:
function compare(value1,value2){ return value2-value1; }
操作方法(P94):contact()和slice()
位置方法(P95):indexOf()和lastIndexOf()
迭代方法(P96):every()、filter()、forEach()、map()、some()
缩小方法(P97):reduce()、reducrRight()Date类型(P98)
创建一个日期对象:
var now=new Date(); 新创建的对象自动获取当前的时间和日期,如果要创建特定的日期和时间,则需要传参; 简化传递参数过程的两个方法:Date.parse()和Date.UTC() 下面两种方式等价 var someDate=new Date(Date.parse("May 25,2005")); var someDate=New Date("May 25,2005"); var someDate=new Date(Date.UTC(2005,4,5,17,55,55));//定义的是GMT时间 var someDate=new Date(2005,4,5,17,55,55);//定义的是本地时间 Date.now()方法表示调用这个方法时的日期和时间的毫秒数
日期格式化(P101):
toDateString()---以特定于实现的格式显示星期几、年月日; toTimeString()---以特定于实现的格式显示时分秒和时区; toLocaleDateString()---以特定于地区的格式显示星期几、月、日和年; toLocaleTimeString()---以特定于实现的格式显示时分秒; toUTCString()---以特定于实现的格式完整的UTC日期;
Date的其他方法(P102)
RegExp类型(P103)
定义正则表达式的两种方式:
var pattern1=/[bc]at/i;//以字面量形式定义正则表达式 var pattern2=new RegExp("[bc]at","i");//使用构造函数创建的正则表达式 (因为RedExp构造函数的模式参数是字符串,某些情况下要对字符进行双重转义(P104))
两种定义正则表达式的区别(P105)
规定使用正则表达式字面量必须像直接调用RegExp构造函数一样,每次都创建新的RegExp实例 var re=null,i; //第二次循环会返回false for(i=0;i<10;i++){ re=/cat/g;//只创建了一个实例,实例在循环中不会重置 re.test("catastrophe"); } //一直返回true for(i=0;i<10;i++){ re=new RegExp("cat","g");//使用构造函数在每次循环中创建正则表达式(创建实例) re.test("catastrophe"); }
RegExp实例属性(P105)
global:布尔值,表示是否设置了g标志; ignorecase:布尔值,表示是否设置了i标志; lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起; multiline:布尔值,表示是否设置了m标志; source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回;
RegExp实例方法(P106)
//RegExp的主要方法是exec(),专门为捕获组而设计,exec()接受一个参数,即要应用模式的字符串,然后返回包含第一匹配项信息的数组。模式中为设置全局标志(g),则时钟返回第一个哦哦诶想的信息,设置了全局标志,则在每次调用exec()时,会继续查找新匹配项。 var text="mom and dad and baby"; var pattern=/mom(and dad( and baby)?)?/gi; var matches=pattern.exec(text); alert(matches.index); //0 alert(matches.input); //"mom and dad and baby" alert(matches[0]); //"mom and dad and baby" alert(matches[1]); //" and dad and baby" alert(matches[2]); //" and baby" 第二个方法是test(),检测字符串参数是否与正则表达式的模式一致
RegExp构造函数属性(P108)
input:最近一次要匹配的字符串 lastmatch:最近一次的匹配项 lastParent:最近一次匹配的捕获组 leftContext:input字符串中lastmatch之前的文本 multiline:布尔值,表示是否所有表达式都使用多行模式 rightcontext:input字符串中lastMatch之后的文本
Function类型(P110)
函数的声明
通过函数声明语法定义: function sum(num1,num2){ return num1+num2; } 通过函数表达式定义(声明)函数://没有函数名,也没有必要要有函数名 var sum=function(num1,num2){ return num1+num2; };//这种方式后面要加分号(与声明变量一样) 使用function构造函数声明函数(可以接受任意数量的参数,最后一个参数被看成函数体) var sum=new Function("num1","num2","return num1+num2");//不推荐
理解函数名是指针的概念:
function sun(num1,num2){ return num1+num2; } alert(sum(10,10)); //20 var anotherSum=sum; alert(anotherSum(10,10)); //20 sum=null; alert(anotherSum(10,10)); //20
函数声明与函数表达式的区别(P111):
//解析器会率先读取函数声明,并使其在执行任何代码前可用 //函数表达式需要等到解析器执行到它所在的代码航,才会被解析执行 //以下代码可以正常执行 alert(sum(10,10)); function sum(num1,num2){ return num1+num2; //以下代码会产生错误 alert(sum(10,10)); var sum=function(num1,num2){ return num1+num2; } //有时候函数表达式后面需要跟()才生效 var result = new Array(); for(var i=0;i<10;i++){ result[i]=function(){ return i; }; } alert(result);
作为值的函数(P112)(经测试无效)
function add10(num){ return num+10; } var result=callSomeFunction(add10,15); alert(result); //25
从一个函数中返回另一个函数(假设有一个对象数组,需要根据对象的某种属性对数组排序(属性设置为易于选择))(P113)
function createComparisonFunction(propertyName){ return function(object1,object2){ var value1=object1[propertyName]; var value2=object2[propertyName]; if(value1<value2){ return -1; }else if(value1>value2){ return 1; }else{ return 0; } } }
函数内部属性(P113)
arguments对象:function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1)//使用arguments.callee代表函数名本身,不用担心函数名的变化 } }
this对象(this引用的是函数据以执行的环境对象,在全局中,this代表window):
window.color="red"; var o={color:"blue"}; function sayColor(){ alert(this.color); } sayColor(); //"red" o.sayColor=sayColor; o.sayColor(); //"blue"
caller属性(为了防止第三方代码在相同的环境窥视其他代码)
function outer(){ inner(); } function inner(){ alert(inner.caller);//用alert(arguments.callee.caller);更好 } outer(); //出现警告框并显示outer()函数的源代码
函数属性和方法(P116)
函数都有非继承而来的方法:apply()和call(),用途都是在特定的作用域调用函数(能够扩充函数来一运行的作用域): window.color="red"; var o={color:"blue"}; function sayColor(){ alert(this.color); } sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue bind()方法(P118) window.color="red" var o={color:"blue"}; function sayColor(){ alert(this.color); } var objectSayColor=sayColor.bind(o); objectSayColor(); //blue
基本包装类型(P118)
基本包装类型有Boolean、Number和String,这些本是基本类型,但在某些应用中与其它引用类型相似
引用类型与基本包装类型的区别:
引用类型与基本包装类型的区别就是对象的生存期,引用类型在执行流离开当前作用域之前一直都保存在内存当中,而自动创建的基本包装类型的对象,只存在于代码执行的瞬间,然后立即销毁:var s1="some text"; s1.color="red"; alert(s1.color); //undefind
Object构造函数可以根据传入值的类型返回相应的基本包装类型的实例:
var obj=new Object("some text"); alert(obj instanceof String); //true
使用new调用基本包装类型的构造函数,与直接调用同名的转型函数不一样:
var value="25"; var number=Numbert(value); //转型函数 alert(typyof number); //"number" var obj=new Number(value); //构造函数 alert(typeof obj); //"object"
Boolean类型(P120)
创建Boolean对象(引用类型):var booleanObject=new Boolean(true); //在布尔表达式中使用Boolean对象: var falseObject=new Boolean(false); var result=falseObject && true; alert(result); //true alert(falseObject instanceof Boolean); //true var falseValue=false; result=falseValue&&true; alert(result); //false alert(falseValue instanceof Boolean); //true
Number类型(P120)
创建Number对象(引用类型):var numberObject=new Number(10); toFixed() //按照指定小数位返回数值的字符串表示 toExponnential() //返回以指数表示法表示的数值的字符串 tpPrecision() //返回合适的格式
String类型(P122)
创建String对象(引用类型):var stringObject=new String("hello world"); charAt() //以单字符字符串的形式返回给定位置的字符 charCodeAt() //以字符编码的形式返回给定位置的字符的编码 stringVlue[1] //与charAt()作用类似? contact() //拼接字符串 slice()//返回被操作字符串的一个子字符串 substring() //返回被操作字符串的一个子字符串 substr() //返回被操作字符串的一个子字符串 trim() //创建一个字符串的副本,删除前置和后置的空格,然后返回结果 toLowerCase() // toLocaleLowerCase() // toUpperCase() // toLocaleUpperCase() // match() //与RegExp的exec()方法相同,字符串中模式匹配 search() // 返回字符串中第一个匹配项的索引 split()方法可以给予分隔符讲一个字符串分割为多个子字符串 localeCompare() //比较两个字符串,并返回比较的结果 reomCharCode()//接受字符编码,并转换成字符串 indexOf() // 从字符串的开头搜索给定的子字符串并返回其位置 lastIndexOf() //从字符串的末尾搜索给定的子字符串并返回其位置
可以通过循环调用indexOf()和lastIndexdOf()来找到所有匹配的子字符串:
var stringValue="lorem ipsum dolor sit amet,consectetur adipisicing elit"; var positions=new Array(); var pos=stringValue.indexOf("e"); while(pos>-1){ position.push(pos); pos=stringValue.indexOf("e",pos+1); } alert(position); //"3,24,32,35,52"
简化替换子字符串的replace()方法(P127)
var text="cat,bat,sat,fat"; var result=text.replace("at","ond"); alert(result); //"cond,bat,sat,fat" result=text.replace(/at/g,"ond"); alert(result); //"aond,bond,sond,fond" //repace()方法的第二个参数也可以是函数 function htmlEscape(text){ return text.replace{/[<>"&]/g,function(match,pos,originalText){ switch(match){ case "<" return "<" case ">" return ">" case "&" return "&"; case "\"" return """; } }}; } alert(htmlEscape("<p class=\"greeting\">Hello world!</p>")); //<p class="greeting">Hello world!</p>
单体内置对象(P130)
单体内置对象的特点是不依赖于宿主环境,所以开发者不必再去实例化这些对象
Global(全局)对象(P131):
URI编码方法: encodeURI()和encodeURIComponent();//解码方法decodeURI()和decodeURIComponent() encodeURI()主要用于整个URI,encodeURIComponent()主要用于URI中的某一段; var uri="http://www.wrox.com/illegal value.htm#start"; alert(encodeURI(uri)); //"http://www.wrox.com/illegal%20value.htm#start" alert(encodeURIComponent(uri)); //"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"
eval()方法
通过eval()执行的代码被认为是包含盖茨调用的执行环境的一部分: var msg="hello world"; eval("alert(msg)"); //"hello world" eval("function sayHi(){alert('hi');}"); sayHi(); //"Hi"
Global对象的属性(P133)
取得Global对象的方法:A: window对象扮演了JS规定的Global对象的角色 B: var somfun=function(){ return this;//函数没有明确规定this值的时候,this值等于Global对象 }();
Math对象
max()和min()方法 舍入方法:ceil()(向上舍入)、floor()(向下舍入)、round()(标准舍入) random() //返回结余0-1之间的一个随机数 其它方法.......