记着来上第三篇javascript的笔记,也是红宝书的最后一篇笔记。笔记内容只到书的大半部分,不是完整的笔记。
附上evernote的公开链接。
-
Object类型
- 引用类型的值(对象)是引用类型的一个实例。引用类型是一种数据结构,用于将数据和功能组织在一起。
- 引用类型也称对象定义,描述的是一类对象所具有的属性和方法。
- 对象是某个特定引用类型的实例,新对象用new后跟一个构造函数来创建。
- 创建Object实例的方式有二:
- 构造函数
- new操作符后面跟Object构造函数
- 对象字面量
- 目的是简化创建含有大量属性的对象的过程 eg: var car={ ID:"123",Color:"red"} 或者 var person={"name":"jason","age":"22"} 或者 var boy = { age: 10};
- 属性名可以是字符串!
- 使用对象字面量是,除了Firefox其他浏览器不会调用Object构造函数
- 构造函数
- 访问对象
- 点表示法 eg: person.age
- 方括号表示法
- 注意:把访问的属性以字符串的形式放在方括号里面,不是字符串则报错! eg: person["age"]
- 方括号中可以传入变量来访问该属性 eg:var proertyName = "name"; alert(person[proertyName]);
-
Function类型
- 含义:函数实际上是对象,函数名实际上是指针。
- 声明函数的三种方法:函数声明语法定义、函数表达式、Function构造函数方式。
-
函数没有重载。
- 根本原因是:函数名只是一个指向某函数的一个指针而已,如果“重载”函数,相当于把函数名变量的指针更改了,函数名变量指向新的函数。
- 函数名其实是一个变量。
- 作为值的函数。
- 可以像传递参数一样把一个函数传递给另一个函数,同时可以将一个函数作为另一个函数的结果返回。(红皮书P95)
- 函数内部属性。函数内部有两个特殊的对象。
-
arguments对象。为一个类数组对象,包含传入函数的所有参数。
- arguments的callee属性,argument.callee指向拥有该argument属性的函数,在阶乘函数中使用。
- 不完美的重载:根据arguments判断传入参数的类型和数量而做出不同反应,此达到重载。
- 没有函数签名,不能实现真正重载。
- 没有传值的命名参数自动赋予undefined值
- 所有参数传递都是值传递,不存在引用传递。注意:传递对象时,依然是值传递,但传递对象时,函数会修改对象,表现得像引用传递一样。
- 未指定返回值的函数,返回一个特殊的undefined值
- this对象。this是函数在执行时所在的作用域。
-
arguments对象。为一个类数组对象,包含传入函数的所有参数。
- 函数的属性和方法。
- 属性:
- length。函数名.length(add.length)即命名参数的个数。
- prototype。保存所有实例方法的所在。
- 方法(每个函数都包含非继承而来的两个方法):
- apply()
- call()
- 两者都是在特定的作用域中调用函数。
- 最大的用途:扩大作用域。
- 属性:
-
Array类型
- Array数组的每一项可以保存任何类型的数据。
- 数组的大小可以动态调整,即可以随数据的添加而自动增长容纳新的数据。
- 创建数据的方式:
- Array构造函数:
- var array = new Array();
- var array = new Array(5);
- var array = new Array("red","blue","black",true,1);
- 字面量:
- var array = ["red","blue","black"];
- Array构造函数:
- length属性:数组的长度
- 数组长度不是只读,也可以写
- 通过length属性,可以从数组末尾移除或者增加新项
- 把数组长度设置为比当前长度小,就可以实现移除数组的项
- 把数组长度设置为比当前长度大,则实现增加新项
- 实现push(),var array = [1,2,"blue"]; array[array.length] = "newData"; // array = [1,2,"blue","newData"];
- 增加多项,var array = [1,2]; array.length = 100; 则array有100项,后98项为undefined
- 转换方法:
- toLocalString()、toString()、valueOf()
都返回数组中每个值的字符串形式拼接而来的一个以逗号分隔的字符串,不管每一项是什么数据类型,都转换为字符串输出
- eg: var array = [1,2,3,true,"value"]; alert(array.toString()); // 1,2,3,true,value 的一个字符串
- join()方法:
- 指定使用不同分隔符来构建输出的字符串
- 接收作为分隔符字符串的参数,eg: array.join("-"); // 1-2-3 [1,2,""].join("-") // 1-2-
- 如果某一项为null或者undefied,调用以上转换方法,该项输出都为空字符串
- toLocalString()、toString()、valueOf()
都返回数组中每个值的字符串形式拼接而来的一个以逗号分隔的字符串,不管每一项是什么数据类型,都转换为字符串输出
- 栈方法:
- 栈:LIFO(last-in-first-out)后进先出。
- 操作:推入和弹出,都在栈的顶部进行。
-
push()推入,接收任意数量的参数,把他们逐个添加到数组尾部,并返回修改后数组长度
- var l = array.push("blue","red",1,2); // l = array.length();
- pop()弹出,不接收参数,移除数组最后一项,减少数组长度,并返回移除的项
-
push()推入,接收任意数量的参数,把他们逐个添加到数组尾部,并返回修改后数组长度
- 队列方法:
- 队列:FIFO(first-in-first-out)先进先出。
- 操作,队列在列表的末端添加项,在列表前端移除项。故结合push()和shift()方法即可形成队列操作。
- shift()移除数组第一项,减少数组长度,并返回移除的项。
- var array = [1,2,3]; var firstElement = array.shift(); //firstElement为移除的第一项
- unshift()在数组前端添加任意项并返回数组长度。故同时使用unshift()和pop()可以从反方向模拟队列,即在前端添加项,在末端移除项。
- 重排序方法:
- reverse()倒序方法,即反转数组
-
sort()方法
- 默认情况下,调用sort()会按照升序排列数组,并且按照词法的顺序来进行排序
- sort()排序时,先把每一项调用toString()方法把每一项都变成字符串,然后再作字符串的比较。其中大写字母排在小写字母前。故[1,100,10,2,5].sort();直接调用sort()时,返回结果是[1,10,100,2,5]
- 给sort()传入比较函数作为参数。
- 比较函数 function compare(value1,value2){if(value1<value2){return -1;} if(value1>value2) return 1; if(value1==value2){return 0;}} if(value1>value2){return 1;}} 即:第一个参数应该位于第二个参数前,返回一个负数;两个参数相等,返回0;第一个参数应该位于第二个参数的后面,返回正数。
- eg: var a = [10,1,5]; alert(a.sort(compare)); // 返回[1,5,10]
- 注意:reverse()和sort()方法返回值的都是经过排序之后的数组,同时原数组也修改了!
- 比较函数的简单用法:返回用第一个数减去第二个数的值(升序排序);放回第二个数减去第一个数的值(降序排序) eg: function(value1,value2){return value1 - value2;} // 升序排序
- 操作方法:
-
concat()方法:
- 总是基于当前数组中的所有项创建一个新数组。
- 不传入参数,返回数组的一份副本,即复制数组。区别于直接变量赋值,变量赋值只能复制指针!
- 接受任意个参数,如果是数组,则把数组的每一项都添加进当前数组中;如果传递的不是数组,在把这些值简单地添加到数组中 eg: var a = [1,2]; var result = a.concat(8,[3,4],[5,6]); // result: [1,2,8,3,4,5,6]的一个新数组 a仍然是[1,2]的数组
- 用途:连接(合并)两个或者多个数组甚至是非数组,也可用于扁平化一个多维数组(即变成一维数组)
- slice()方法:即部分方法。
- 总是基于当前数组中的一项或者多项创建新的数组。
- 接受一个或者两个参数,即要返回数组项的开始和结束位置,即哪里到哪里,注意结束位置不包含在返回的结果中。
-
splice()方法:即拼接方法,总是返回从原数组中被删除的项,若无则返回空字符串,注意:会修改原数组
- 删除:传入两个参数,第一个参数指定开始位置,第二个参数指定删除的项数。
- eg: var a = [1,2,3]; alert( a.splice(1,1)); // [1,3]
- 如果只传入一个参数,则删除从指定位置到结束的项
- 插入:传入三个参数,第一个指定开始位置,第二个参数为0(即删除0项),第三个参数为插入的项如果要插入对个项,则传入任意多个项,故本方法可以传入多于三个参数
- eg: var a = [1,5]; alert( a.splice(1,0,2,3,4)); alert(a) // 第一个alert的结果是空字符串,a值变成[1,2,3,4,5]
- 注意:第一个参数指定了插入项的位置,例子中,指定了在数组位置1处插入三项,故原数组项a[1]往后挪动3个位置,在数组位置1出开始插入数组项2,3,4。
- 替换:传入三个参数,第一个指定开始位置,第二个指定删除的项数,第三个可以传入要在指定位置插入的项,可以为多项,故才方法可以传入多于三个参数
- eg: var a = [1,"s","b",4,5]; alert( a.splice(1,2,2,3)) alert(a); // s,b [1,2,3,4,5]
- eg: var a = [1,"s","b",4,5]; alert( a.splice(1,2,[2,3])) alert(a); // s,b [1,2,3,4,5]
- 替换在以上例子中,等于先执行删除操作,后执行插入操作
- splice()方法多用于向数组中部插入项
- 删除:传入两个参数,第一个参数指定开始位置,第二个参数指定删除的项数。
- 小结:concat()和slice()方法都是基于当前数组创建新的数组,都可以用于复制数组的用途!splice()方法会修改当前数组!
- concat() eg: var newArray = oldArray.concat();
- slice() eg: var newArray = oldArray.slice() 或者 var newArray = oldArray.slice(0); 或者 var newArray = oldArray.slice(0,oldArray.length)
- 复制数组还有用for……in 或者 for循环的方式进行,不过不够优雅
-
concat()方法:
-
Date类型
- Date()构造函数
- Date使用1970年1月1日零时零分开始到当前经过的毫秒数来保存时间
- 不传入参数,新创建的对象自动获得当前日期和时间,即返回一个表示当前时间的对象
- eg: var ms = new Date(); console.log(ms); // Date {Wed Sep 19 2012 21:47:24 GMT+0800} 返回一个Date对象
- 传入表示日期的字符串,相当于调用Date.parse()处理该表示日期的字符串
- eg: var date = new Date("9/19/2012"); 返回一个Date对象
- 注意字符串是月/日/年,年/月/日 也可以
- 传入表示日期的数值,相当于调用Date.UTC()方法来处理该表示日期的数值
- 注意:Date.UTC()的月份是以0月开始
- eg: var date = new Date(2012,8,19); 返回一个Date对象
- 注意:数值是年/月/日
- Date.parse()方法
- 接收一个表示日期的字符串,然后放回相应的毫秒数
- 这个方法返回的结果因实现而异
- eg: var someDate = new Date(Date.parse("9/25/2012"));
- Date.UTC()方法
- 接收一个表示日期的数字,其中年月是必须参数,若没提供天数,默认为1,其他参数默认为0
- 注意:月份是从0开始计算,并且日期和时间是基于本地时区而非GMT来创建
- eg: var someDate = new Date(Date.UTC(2012,8,25)); // 表示2012年9月25日,0时0分0秒
- value()方法
- 返回日期的毫秒数表示,注意,并不是返回表示日期的字符串
- 故,可以直接比较日期的大小
- eg: var date1 = new Date(2012,8,25); var date2 = new Date(1990,6,11); console.log(date1>date2); // true
- toUTCString()方法
- 返回UTC即世界时间、格林威治时间的字符
- eg: var today = new Date(); console.log( today.toUTCString() ); // 返回世界时间 Wed, 03 Oct 2012 08:13:05 GMT,实际上本地时间为Wed Oct 03 2012 16:16:03 GMT+0800
- get方法和set方法
- getMonth() 从0~11月,故注意要自增1
- getFullYear()等
- Date支持的运行
- 只有对两个Date进行相减才有意义
- 其他+、-、*、/运算也支持,但无意义
- Date()构造函数
-
RegExp类型
- 创建正则表达式
- 字面量创建 var pattern = /a/g
- 构造函数,new RegExp(),接收两个参数,注意:由于构造函数模式的参数都是字符串,故所有元字符都要进行双重转义!
- var pattern = /\.\[bc\]at/i; 字面量 var pattern = new RegExp("\\.\[bc\]","i");
- 正则表达式标志:
- i 不区分大小写
- g 全局模式,匹配所以字符串,而不是匹配到第一个就停止
- 注意:g全局模式用于替换所有指定的字符串很有效果,但想要输出某字符串中所有匹配的字符串,必须使用全局模式加上循环输出才能达到目的
- m 多行模式,到达一行文本的末尾时继续查找下一行
- 注意:标志可以同时使用eg: var pattern = /a/gi
- RegExp实例属性
- global 布尔值,表示是否设置了g标志
- ignreCase 布尔值,表示是否设置了i标志
- lastIndex 整数,表示开始搜索下一个匹配项的字符位置,从0开始
- 注意:在全局模式下,每次调用exec()后,lastIndex都会增加,而非全局模式下始终不变(红皮书90)
- multiline 布尔值,是否设置了m标志
- source 正则表达式的字符串表示,注意,是按照字面量的方式返回,即使是用构造函数的方式来构造正则表达式
- RegExp实例方法
-
exec()方法
- 接受一个要应用模式的字符串
- 返回包含第一个匹配项信息的数组,若没有匹配项时返回null
-
在返回的匹配项数组中,有额外的两个属性
- index属性,表示匹配项在字符串中的位置
- input属性,表示应用正则表达式的字符串
- [0],匹配值
- [1],……,[n] 带圆括号的子字符串匹配,注意是捕获组下标是从1开始
- eg: var str = "a b c"; var pattern = new RegExp( "a" , "g" ); var result = pattern.exec(str); console.log( result.index); console.log( result[0]); // result.index 返回0,表示匹配项在字符串中的位置 result[0]是匹配到的字符串
-
test()方法
- 同样是接受一个要应用模式的字符串
- 返回true或者false,多用在if判断中
- toString()和toLocaleString(),返回正则表达式的字面量,即使是用构造函数方式创建
-
exec()方法
- 创建正则表达式
-
基本包装类型
- 基本知识
- 为了方便操作基本类型值,ECMAScript提供3个特殊的引用类型:Boolean类型,Number类型和String类型
- 实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能调用一些方法来操作这些基本类型。
- 在读模式中,后台会经历下面三个步骤:
- 按照基本类型的值创建对应包装类型的一个实例
- 在实例上调用指定的方法
- 销毁这个实例
- eg: var str1 = "123"; var str2 = str1.subString(1); 后台的做法
- var str1 = new String("123"); var str2 = str1.subString(); str1 = null;
- 引用类型和基本包装类型的区别:对象的生存期
- 使用new创建的引用类型的实例,在执行流离开当前作用域之前一直保存在内存中
- 而自动创建的基本包装类型的对象,则只保存在一行代码的执行瞬间,然后立即销毁。而这意味着不能在运行时为基本类型值添加属性和方法,添加后也会立即销毁。
- 对基本包装类型的实例调用typeof会返回"Object",由此,基本包装类型的对象(实例)在布尔环境下都会转换为布尔值true。
- 对基本类型的值调用typeof返回对于的类型值的字符串
-
Boolean类型
- eg: var falseObject = new Boolean("false"); var result = falseObject && true; // result为true
- eg: var falseValue = false; var resut = falseValue && true; // result为false
- eg: alert(falseObject instanceOf Boolean); // result为Object
- eg: alert(falseValue instanceOf Boolean); // result为false
- 基本类型和引用类型(基本包装类型)的区别
- typeOf操作符对基本类型返回该基本类型的类型,如"Boolean",typeOf操作符对引用类型返回的是"object"
- 由于Boolean对象是Boolean类型的实例,故使用instanceOf操作符返回true,而对基本类型返回false
-
Number类型
- toFixed()方法
- 按照指定的小数位返回数值的字符串表示,参数为保留小数的位数
- toFixed()方法有自动舍入的特性,四舍五入
- eg: var num = 10.206;alert(num.toFixed(2)); // "10.21"
- toExponential()方法
- 返回指数表示法(科学计数法)表示的数值的字符串形式,参数为保留的小数位的位数
- eg:var num = 10; alert(num.toExponential(2)); // "1.00e+1"
- toPrecision()方法
- 可能返回指数格式(Exponential)或者固定格式(Fixed),实际上是调用以上两个方法的其中一个,具体规则要看哪一种格式更合适
- 接收一个参数,表示数值的所有数字的位数,注意,值所有位数
- eg: var num = 99; alert(num.toPrecision(1)); // "1e+2" 即100,发生自动舍入
- eg: var num = 99; alert(num.toPrecision(2)); // "99"
- eg: var num = 99; alert(num.toPrecision(3)); // "99.0"
- toFixed()方法
-
String类型
- length属性,表示字符串中字符的个数,注意:一个中文字尽管占用2个字节(UTF-8中占用3个字节),但是在length属性中一个中午还是一个字符。
- 字符方法:
-
charAt():
- 接收一个指定字符串中字符位置的整数参数,从0开始,返回指定位置的字符
- eg: var string = "hello"; alert(string.charAt(1)); // "e"
- charCodeAt():
- 接收一个指定字符串中字符位置的整数参数,从0开始,返回指定位置字符的字符编码
- eg: var string = "hello"; alert(string.charCodeAt(1)); // "101"
- 除IE外,还可以这样访问字符串的某个字符 eg: var string = "hello"; alert(string[1]); // "e"
-
charAt():
- 字符串操作:
- concat():
- 将一个或者多个字符串拼接起来,接受多个参数,即可以任意拼接多个字符串
- eg: var str = "hello "; alert(str.concat("world"," !")); // "hello word !"
- 在实践中,完全可以用”+“操作符来代替concat()方法
-
slice()与subString():
- 返回指定部分字符串
- 接受一个或者两个参数,接受一个参数,返回指定参数表示位置到最后一个字符的字符串;接受两个字符串,返回指定的开始位置字符串到指定的结束位置的字符串,放回指定开始位置和指定结束位置的字符串,即返回哪里到哪里。(与数组操作中的slice()方法类似)
- 其中,slice()传入负数的参数时,会把所有负数的参数与字符串长度相加
- subString()传入负数的参数时,把所有负参数转换为0
-
subStr():
- 返回指定部分字符串
- 接受一个或者两个参数,接受一个参数,放回指定位置到结束的字符串;接受两个字符串,返回指定字符串。
- 注意:subStr()区别于上面两个方法,substr()第二个参数指放回开始位置后的多个个字符。即哪里到哪里的后几位字符串。
- 如果subStr()传入负参数,把第一个参数加上字符串长度,则把第二个负参数都转换成0。则两个参数都为负数时,返回空字符串
- concat():
- 字符串位置方法:
- 从字符串中查找子字符串的方法,返回子字符串的位置
- indexOf()与lastIndexOf(),接受要查找的子字符串为参数,返回子字符串的位置(开始位置)。查到不到返回-1
- 区别:前者从字符串开头查找,后者从字符串末尾开始查找,注意,返回的始终是从查找的方向来算,字符串的第一次出现的位置。
- 两者都接受一个或者两个参数,接受两个参数时,表示从指定的哪个位置开始搜索。
- 用indexOf()来找出字符串中所有指定的子字符串,即找出所有指定子字符串
- var stringValue = "Lorem ipsum dolor sit amet.";
- var pos = stringValue.indexOf("e");
- var position = new Array();
- while(pos > -1) {
- position.push(pos);
- pos = stringValue.indexOf("e",pos+1);
- }
- console.log(position); // [3,24]
- 从字符串中查找子字符串的方法,返回子字符串的位置
- 大小写转换方法:
- toLowerCase()与toLocaleLowerCase():
- 返回字符串小写形式
- 区别:后者根据特定地区(当地)来转换字符串小写,推荐使用
- toUpperCase()与toLocaleUpperCase():
- 返回字符串大写形式
- 区别:后者根据特定地区(当地)转换大写,推荐使用
- toLowerCase()与toLocaleLowerCase():
- 字符串的模式匹配方法:
-
match()
- 与RegExp对象的exec()方法类似,接受RegExp对象或者正则表达式字面量
- 返回捕获组字符串数组,结果与exec()方法一样
-
search()
- 与RegExp对象的test()方法类似,接受RegExp对象或者正则表达式字面量
- 返回第一个匹配项的位置,若匹配不到则返回-1
-
replace()
- 替换子字符串,参数接受一个RegExp对象或者一个字符串(不会转化成正则字面量),第二个参数是一个字符串或者一个函数
- 如果第一个参数是字符串,那只会替换第一个字符串;如果想替换全部子字符串,则为提供一个正则表达式,而且指定全局标志g
- eg: var string = "abcabc"; var newStr = string.replace(/a/g,"o"); // newStr = "obcobc";
- 如果第二个参数是字符串,可以使用一些特殊的字符序列,将正则表达式操作得到的结果插入到结果字符串中。(红皮书106)。同时,第二个参数可以为函数,该函数的俄第一个参数为模式匹配项。
-
split()
- 基于指定的分隔符把字符串分隔成多个子字符串,并将结果放到一个数组中,即返回的是数组。
- 此方法与Array对象的join()方法是相逆的方法
- 第一个参数是分隔符,分隔符可以是字符串,也可以是RegExp对象。第二个参数可选,指定返回数组的大小,确保数组不会超过指定大小。
- eg: var color = "red,blue,black"; console.log(color.split(",")); // ["red","blue","black"]
-
match()
- localeCompare()方法
- 比较两个字符串,返回-1、0、1,表示参数中的字符串应该位于该对象的前后位置关系
- eg: var string = "yellow"; alert(string.localeCompare("black")); // 1 表示参数字符串应该在前面,即要调换
- 注意:返回值取决于浏览器的实现方式,故最好判断返回值是否小于0、等于0、大于0
- fromCharCode()方法
- String构造函数的静态方法:fromCharCode()
- 接受一或者多个字符编码作为参数,然后把他们转换成一个字符串,与charCodeAt()是相反的操作
- eg: alert( String.fromCharCode( 104 , 101 , 108 , 111 ) ); // "hello"
-
内置对象
- Global对象
- URL编码方法
- 用UTF-8编码替换所有无效的字符,从而让浏览器能够接受和理解
-
encodeURI(param)
- 用于对整个URI进行编码
-
encodeURIComponent(param)
- 用于对URI后面的字符(查询字符)进行编码
- 区别:前者不会对本事属于URI的特殊字符进行编码,例如冒号、正斜杠、问好和井号;而后在会对任何非标准字符进行编码,包括上面举例列出的额字符。故前者只能用于对整个URI编码,后在只能用于对URI后面的字符进行编码
- decodeURI()与decodeURIComponent(),前者只能对用encodeURI编码的字符进行解码,后在则能对所有已编码的字符进行解码。
- eg: var urlString = "http://www.baidu.com?keyword=你好"; var encodeRerult = encodeURI(urlString);
-
eval()方法
- eval()方法就是一个完整的ECMAScript解析器,接受一个参数,即要执行的ECMAScript字符串 eg: eval("alert(‘hello")");
- 通过eval()执行的代码被认为包该次调用的执行环境的一部分,可以与被执行的代码具有改执行环境的相同的作用域链 eg: var msg = "hello"; eval("alert(msg)");
- 同样,我们可以通过在eval()中定义一个函数,然后再调用的外部代码中引用这个函数,不过必须先执行eval(),再调用函数
- URL编码方法
- Global对象
- 基本知识