JavaScript高程学习笔记之引用类型(5)
1.object类型
创建object实例有两种
第一种:new操作符后跟Object构造函数var person = new Object();
第二种:对象字面量
var person = {
name = "yohann";
age = 22;
};
使用对象字面量语法,属性名也可以用字符串
开发人员更青睐对象字面量语法
alert(person["name"]);
alert(person.name);
方括号语法的优点可以通过变量名来访问属性
如果属性包含导致语法错误的字符,或者属性名是关键字或保留字,可以使用方括号法
通常,除非必须使用变量来访问属性,建议使用点表示法
2.Array类型
- 每一项都可以保存任何类型的数据
- 数组的大小是动态调整的
创建数组的两种方法
第一种:使用Array构造函数var colors = new Array();
第二种:使用数组字面量var colors = ["red", "blue", "green"];
数组length属性不是只读的,可以对其读写
2.1 检测数组
确定某个对象是否为数组,可以用Array.isArray()
方法,不用管是哪个全局环境中创建的
兼容IE9+,Firefox4+,Safari 5+,Opera 10.5+,Chrome
2.2 转换方法
数组的toString方法会返回有数组中每个值字符串拼接而成的以一个逗号分开的字符串
valueOf方法,toLocaleString方法
调用数组的toLocaleString方法会创建一个以逗号分开的字符串
使用join()方法,可以使用不同的分隔符来构建这个字符串
2.3 栈方法
ECMAScript为数组提供push()方法和pop()方法,实现类似栈的行为
push()方法接收任意数量的形参,逐个添加到数组末尾,并返回修改后的长度
pop()方法从数组移出最后一项,减少数组length值,然后返回移出的项
2.4 队列方法
队列的访问规则是先进先出
shift()
方法,移除数组的第一个项并返回该项,同时数组长度减一。
unshift()
方法,在数组前端添加任意个项,并返回数组的长度
用unshift方法和pop方法可以相反的模拟队列
2.5 重排序方法
数组中存在两个直接用来重排序的方法:reverse(
)和sort()
reverse()方法
:反转数组项的顺序
sort()方法可以接收一个比较函数作为参数值,以便我们指定哪个值在哪个值前面
比较函数通过返回一个小于零,等于零或大于零的值来影响排序结果
2.6 操作方法
concat()
方法:基于当前数组中的所有项,创建一个数组。传递给该方法是一个或多个数组,则将每一项添加到结果数组中
slice()
方法: 基于当前数组中的一个或多个项创建数组。接收一个或者两个参数。一个参数返回从这个参数开始到数组末尾的数组。两个参数返回起始和结束位置的项,但不包含结束位置项
splice()
方法:向数组中部插入项
- 删除:可以删除任意数量的项,指定两个参数,删除第一项的位置和要删除的项数
- 插入:指定位置插入任意数量的项。提供三个参数,起始位置,0(要删除的项数)和要插入的项
- 替换:指定位置插入任意数量的项。提供三个参数,起始位置,要删除的项数和要插入任意数量的项数
2.7 位置方法
indexOf方法和lastIndexOf方法
两个方法都接收两个参数:要查找的项和表示查找起点位置的索引
前者从数组的开头位置(0)开始向后查找,后者从数组的末尾开始向前查找
要查找的项必须严格相等
2.8 迭代方法
every()
: 对数组中的每一项运行给定函数,如果函数对每一项都返回true,则返回truefilter()
: 对数组的每一项运行给定函数,返回给函数会返回true的项组成的数组forEach()
: 对数组中的每一项运行给定函数,没有返回值map()
: 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组some()
: 对数组中的每一项运行给定函数,如果函数对任一项返回true,则返true
2.9 归并方法
reduce()和reduceRight()。迭代数组的所有项,构建一个最终的返回值。
reduce()
方法从数组的第一项开始,reduceRight()
则从数组的最后一项开始
接收两个参数:一个在每一项调用的函和(可选的)作为归并基础的初始值
传递的函数接收四个参数:前一个值,当前值,项的索引和数组对象
例如用此方法执行求数组中所有值之和操作
3.Data类型
创建日期对象,使用new操作符和Data构造函数即可
不传递参数,自动获得当前的日期和时间。
若根据特定的日期和时间创建时间,必须传入表示该日期的毫秒数
简化这一计算过程提供了两个方法:Data.parse()
和Data.UTC()
前者接收一个表示日期的字符串参数,根据这个字符串参数返回相应日期的毫秒数
Data.parse()
日期格式:
- “月/日/年”,如6/13/2014
- “英文月名 日,年”,如January 12,2014
- “英文星期几 英文月名 日 年 时:分:秒 时区”,如Tue May 25 2004 00:00:00 GMT-0700.
- ISO 8601扩展格式
Data.UTC()
方法同样返回日期的毫秒数,不同的是Data.UTC()
的参数分别是年份,基于0的月份(一月是0,二月是1),月中的那一天(1到31),小时数(0到23),分钟,秒以及毫秒数
例:var allFIves = new Data(Data.UTC(2005, 4, 5, 17, 55, 55));
Data构造函数会模仿Data.UTC()
,有一点明显不同,日期和时间丢失基于本地时间而非GMT创建
ECMAScript5添加了Date.now()
方法,返回表示调用这个方法时的日期和时间的毫秒数
3.1 继承的方法
Data类型也重写了toLocaleString(),toString()和valueOf()方法
前两个方法在不同的浏览器中返回的日期和时间格式大相径庭
3.2 日期格式化方法
Data类型有专门用于将日期格式化为字符串的方法
- toDataString ()
- toTimeString ()
- toLocaleDataString ()
- toLocaleTimeString ()
- toUTCString ()
3.3 日期/时间组件方法
直接取得和设置日期值中特定部分的方法
4. RegExp类型
ECMAScript通过RegExp类型来支持正则表达式
var expression = /pattern/flags ;
正则表达式的匹配模式支持下列的3个标志
- g: 表示全局模式,即模式将被应用于所有字符
- i: 表示不区分大小写模式
- m: 表示多行模式
使用正则表达式字面量和使用RegExp构造函数创建的正则表达式不一样
4.1 RegExp实例属性
- global:布尔值,是否设置了g标志
- ignoreCase:布尔值,是否设置了i标志
- lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起
- multiline:布尔值,是否设置了m标志
- source:正则表达式的字符串表示
4.2 RegExp实例方法
RegExp的主要方法是exec(),专门为捕获组而设计的。exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。返回的数组包含两个额外的属性:index和input。
index表示匹配项在字符串的位置,input表示应用正则表达式的字符串
RegExp的第二个方法是tes(),它接受一个字符串参数,在模式与该参数匹配的情况下返回true,否则返回false
RegExp实例继承的toString
和toLocaleString
方法都会返回正则表达式的字面量
4.3 RegExp构造函数属性
构造函数包含一些属性,基于所执行的最近一次正则表达式操作而变化。这些属性分别有一个长属性名和短属性名
- input $_
- lastMatch $&
- lastParen $+
- leftContext $`
- multiline $*
- rightContext $'
4.4 模式的局限性
ECMAScript正则表达式有一些不支持的特性
5. Function类型
每个函数都是Function类型的实例。
使用函数表达式定义函数,没必要使用函数名
5.1 没有重载
创建第二个函数会覆盖引用第一个函数变量
5.2 函数声明与函数表达式
函数声明和函数表达式并非完全一致,
alert(sum (10, 10));
function sum(num1 + num2) {
return num1 + num2;
}
alert (sum (10,10));
var sum = function (num1, num2) {
return num1 + num2;
};
第一个代码不会出错,第二个代码就会出错
5.3 作为值的函数
可以将一个函数作为另一个函数的结果返回
function callSomeFunction (someFunction, someArgument) {
return someFunction (someArgument);
}
5.4 函数内部属性
函数内部有两个特殊的对象,就是arguments和this。arguments主要用途是保存函数参数,它有一个名叫callee的属性,该属性是一个指针,指向拥有arguments对象的函数
function factorial (num) {
if (num < 1) {
return 1;
} else {
return num * factorial (num - 1);
}
}
函数执行与函数名紧紧耦合在一起,为了消除这种紧密耦合现象可以使用arguments.callee
function factorial (num) {
if (num < 1) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}
this引用的是函数执行的环境对象
函数的名字是一个包含指针的变量
5.5 函数属性和方法
每个函数都包含两个属性:length和prototype。
在创建自定义引用类型和实现继承是,prototype属性极为重要
每个函数都包含两个非继承而来的方法:apply()
和call()
,实际上等于设置函数体内this对象的值
apply()方法接收两个参数:一个是运行函数的作用域,另一个是参数数组
function sum(num1, num2) {
return num1 + num2;
}
function callsum (num1, num2){
return sum.apply(this, arguments);
}
call方法和apply方法相同。第一个参数没有变化,不过第二个参数要逐个枚举出来
它们真正强大的地方在于能够扩充函数赖以运行的作用域
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()
这个方法会创建一个实例,其中this的值会被绑定传给bind()函数的值
window.color = "red";
var o = { color: "blue"};
function sayColor(){
alert (this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
6. 基本包装类型
ECMAScript提供三个特殊的引用类:Boolean、Number、String.
每读取一个基本类型值,后台会创建一个对应的基本包装类型的对象
基本类型值不是对象,因而不该有方法,其实后台会自动进行处理,定义对象
引用类型与基本包装类的主要区别在于对象的生存周期
new操作符创建的引用类型实例,在离开当前作用域前会一直保存在内存里。而自动创建的基本包装类型的对象,只存在于代码的执行瞬间,然后立即被销毁
使用new调用基本包装类型的构造函数与直接调用同名的转型函数是不一样的
例如:
var value = "25";
var number = Number(value); //转型函数
alert (typeof number); //number
var obj = new Number(value); //构造函数
alert (typeof obj); //object
6.1 Boolean类型
基本类型与引用类型的布尔值有很大的区别。
建议永远不要使用Boolean对象
6.2 Number类型
此类型提供了一些用于将数值格式化为字符串的方法
toFixed()
按照指定的小数位返回字符串
toExponential()
返回以指数表示法
toPrecision()
可能返回固定大小(fixed)格式,也可能返回指数格式(Exponential)
6.3 String类型
- 字符方法
用于访问字符串中特定字符的方法:charAt()
和charCodeAt()
其中charCodeAt()
会返回特定位置的字符编码
ECMAScript5提供一种用方括号加数字索引来访问字符串中特定字符 - 字符串操作方法
concat()
方法:将一个或多个字符串拼接,返回拼接得到的新字符串
但实践中使用最多的还是加号操作符
三个基于字符串创建新字符串的方法:slice()
、substr()
和substring()
slice和substring第一个参数指定字符串开始的位置,第二个参数指定字符串最后一个字符后面的位置。
substr第二个参数值指定返回的字符个数
若给定参数是负数,它们的行为不尽相同
slice()
方法会将传入的负值与字符串长度相加,substr()
会将负的第一个参数加上字符串的长度,第二个负的参数转化为0,substring()
方法会将所有负值转化为0 - 字符串位置方法
从字符串中查找子字符串的方法:indexOf()
和lastIndexOf()
方法
其中indexOf是从前向后查找。lastIndexOf是从后向前查找。
都可以接收可选的第二个参数,表示从那个位置开始查找
将返回的位置保存在数组positions中,以便将来调用 - trim()方法
创建一个副本,删除前置及后缀的所有空格,然后返回结果 - 字符串大小写转换方法
toLowerCase()
、toUpperCase()
和toLocaleLowerCase()
、toLocaleUpperCase()
后二是针对特定地区实现 - 字符串模式的匹配方法
match()
方法,只接受一个参数,要么是一个正则表达式,要么是一个RegExp对象
search()
方法,参数与match相同。此方法返回字符串第一个匹配项的索引;如果没有匹配项,则返回-1
replace()
方法,替换字符串
split()
方法,基于指定的分隔符将一个字符串分割成多个字符串 - localeCompare()方法
比较两个字符串的值,并返回下列值中的一个
- 如果字符串在字母表中排在字符串参数之前,则返回一个负数
- 如果字符串等于字符参数,则返回0
- 如果字符串在字母表排在字符参数之后,则返回一个正数
- fromCharCode()方法
接收一或多个字符编码,然后将他们转换为一个字符串 - HTML方法
简化常见HTML格式化任务的方法
详见JavaScript高程p130
7. 单体内置对象
ECMA-262定义了两个单体内置对象
7.1 Global对象
所有在全局作用域中定义的属性和函数都是Global对象的属性
- URI编码方法
Global对象的encodeURI方法和encodeURIComponent方法可以对URI(通用资源标识符)进行编码,以便发送给浏览器。
encodeURI()
主要用于整个URI,encodeURIComponent()
用于URI的某一段
encodeURI()
不会对本身属于URI的特殊字符进行编码,而encodeURIComponent()
对任何非标准字符进行编码
与二者对应的解码分别是decodeURI()
和decodeURIComnent()
- eval()方法
此方法就像一个完整的ECMAScript解析器,只接受一个参数,即要执行的ECMAScript字符串
eval()执行的代码可以引用在包含环境中定义的变量
严格模式下,在外部访问不到eval()中创建的变量或函数 - Global属性
所有原生引用类型的构造函数项Object和Function,都是Global对象的属性 - window对象
Web浏览器是将这个全局变量作为window对象的一部分加以实现
7.2 Math对象
- math对象属性
大都是可能在计算中用到的特殊值,例如Math.E、Math.LN10等 - min()和max()方法
确定一组数值的最大值和最小值 - 舍入方法
- Math.ceil
- Math.floor
- Math.round
- random()方法
返回一个大于等于0小于1的一个随机数 - 其他方法
详见JavaScript高程p136