JavaScript
五、引用类型
5.1 object类型
- 定义object类型
- 构造函数
- 对象字面量
是向函数传递大量可选参数的首选方式- 创建时不会调用构造函数
- 属性名可以使用字符串,数值属性名会自动转换为字符串
- var person ={} 相当于 var person =new Object()
- 访问对象中的属性
- 点表示法
- 方括号+属性名字符串
- 属性名可以是变量
- 属性名中可以包含非字母、非数字
//构造函数
var person=new Object();
person.name="Nicholas";
person.age=29;
//对象字面量
var person={
name:"Nicholas",
"age":29,
5:true
};
//传递可选参数
displayInfo({name:"Nicholas",age:"29"});
displayInfo({name:"Nicholas"});
//属性名为变量
var propertyName="name";
alert(person[propertyName]);
5.2 Array类型
- 数组每一项可以独立保存任意类型的数据
- 定义数组
- 构造函数
- var array=new Array( value1,value2 ,value3 );
- var array = new Array(3);
- new可以省略
- 数组字面量
- var array=[ value1,value2 ,value3 ];
- 构造函数
- 可以动态调整数组长度
- var array[array.length] = valueN; 在数组末尾追加数据
- length属性可写
- array.length=array.length-1; 去除数组末尾元素
5.2.1 检测数组
- instanceof
- 多个框架可能存在多个不同版本的Array构造函数
- Array.isArray()
- ECMAScript 5新增
- 解决多个框架间各自不同的实现方式的数组的判断
5.2.2 转换方法
- toString()
- 调用数组内部的每个元素的toString() 方法,并用逗号整体拼接成一个字符串
- valueOf()
- 返回原数组
- toLocaleString()
- 用数组内部的每个元素的toLocaleString() 方法,并用逗号整体拼接成一个字符串
- join()
- 与toString() 类似
- 可接收一个参数,用来设定拼接时用的分隔符
- 数组中的null、undefined在数组调用toString()、toLocaleString()、join() 方法返回的结果中以空字符串表示
5.2.3 栈方法
提供了让数组的行为类似于其他数据结构的方法
- push()
- 接收任意数量的参数并返回最终的数组长度
- 在数组尾部增加元素
- pop()
- 返回出栈的数据
- 删除尾部元素
5.2.3 队列方法
- 数组前端作为出口
- push()
- shift()
- 删除数组中的第一个元素,并返回该项
- 数组后端作为出口
- unshift()
- 将参数整体插入数组前端位置,参数在数组中的排序与参数自身的排序相同
- 返回新数组的长度
- pop()
- unshift()
5.2.4 重排序方法
- reverse()
- 反转数组项的顺序,不会重排列
- 直接改变原数组
- sort()
- 直接改变原数组
- 默认将数据项转化为string进行字符串比较排序,从小到大
- 可接收比较函数作为参数
function compare(value1,value2){
if(value1>value2){
return 1;
}else if(value1<value2){
return -1;
}else{
return 0;
}
}
var array=[0,10,5,15,1];
array.sort(compare);
alert(array);//0,1,5,10,15
5.2.5 操作方法
- concat()
- 产生一个原数组的副本,拼接,返回新数组
- slice( startIndex, endIndex )
- 提取指定序号以及指定序号范围的数据项生成新数组,序号范围为 [ start, end )
- 若参数中包含负数,则加上数组长度之后再确定序号
- splice( startIndex, delItemCount, InsetData )
- 参数
- 起始位置
- 要删除的项的数量
- 要插入的数据
- 插入的数据占据输入的起始位置
- 返回值
- 删除、插入的数据组成的新数组
- 参数
5.2.7 位置方法
- indexOf()
- 参数
- 要查找的项
- 查找的起始位置
- 返回索引值,没找到返回-1
- 全等比较
- 参数
- lastIndexOf()
- 参数
- 要查找的项
- 查找的起始位置
最后一项记为0
- 参数
5.2.8 迭代方法
- 接收参数
- 在每一项上运行的函数
- 数组项的值item
- 该项在数组中的位置index
- 数组对象本身array
- 运行该函数的作用域对象
- 在每一项上运行的函数
- 方法
- every()
函数执行结果都返回true,则返回true - filter()
返回函数执行结果返回true的数据项组成的数组 - forEach()
只进行操作,没有返回值 - map()
返回每次函数调用的结果组成的数组 - some()
函数执行结果有一项返回true,则返回true
- every()
var array=[1,2,3,4,5];
array.forEach(function(item,index){
alert(item);
});
5.2.9 缩小方法
- 参数
- 在每一项上调用的函数
- 参数
- 前一项的值
- 当前项的值
- 当前项的索引
- 数组对象
- 函数返回结果会作为函数的接收参数的第一项进行传递
- 参数
- 作为缩小基础的初始值
- 在每一项上调用的函数
- reduce()
- reduceRight()
从数组最后一项向前遍历
var array=[1,2,3,4,5];
var sum = array.reduce(function(prev,cur,index,array){
return prev+cur;
});
alert(sum);//15
5.3 Date类型
使用自1970年1月1日0时经过的毫秒数来表示日期
- 创建Date类型
- new Date()
- 默认为当前时间对应的Date对象
- 可接收特定日期和时间的毫秒值作为参数
- 若参数为字符串,自动调用Date.parse()
- 若参数为两个以上的数字,自动调用Date.UTC()
- new Date()
- 将日期转化为毫秒值
- Date.parse()
按字符串进行转化 - Date.UTC()
按数字进行转换,即年、月(从0开始)[、日、时、分、秒、毫秒]
- Date.parse()
- Date.now()
- 当前时间的毫秒值
- 与 +new Date() 效果相同,一元加操作符调用Number() 方法,Date类型对象触发valueOf()
5.3.1 继承的方法
- toLocaleString()
- 返回字符串
- toString()
- 返回字符串
- valueOf()
- 返回日期的毫秒值
5.3.2 日期格式化方法
- 星期、月、日、年组成的字符串
- toDateString()
- toLocaleDateString()
- 时、分、秒和时区组成的字符串
- toTimeString()
- toLocaleTimeString()
- 完整UTC日期的字符串
- toUTCString()
5.3.3 日期/时间组件方法
- 获取和设置特定数值
- 日期的毫秒值
- getTime() 类似valueOf()
- 年
- 月
- 月份中的天数
- getDate()
- 星期
- getDay()
- 时
- 分
- 秒
- 毫秒
- 日期的毫秒值
5.4 RegExp类型
- 定义方式
- 字面量形式
- var expression=/ pattern / flags
- pattern
正则表达式- 模式中使用的所有元字符都必须转义
- ( [ { \ ^ $ |) ? * + . ] }
- 模式中使用的所有元字符都必须转义
- flags
- g 对所有字符串进行匹配,而非在发现第一个匹配项时立即停止
- i 不区分大小写
- m 在到达一行文本末尾还会继续查找下一行
- pattern
- 在ECMAScript 3中共用同一个实例,之前的查找进度等状态也会保持
- ECMAScript 5每次都创建新实例
- var expression=/ pattern / flags
- 构造函数
- 接收参数
- 匹配的字符串模式
所有的元字符都必须双重转义,即 \\ 表示 \ - flags字符串
- 匹配的字符串模式
- 每次创建RegExp新实例
- 接收参数
- 字面量形式
5.4.1 RegExp实例属性
通过访问实例的下列属性,可以获得有关模式的各种信息
- global
是否设置g标志 - ignoreCase
- lastIndex
开始搜索下一个匹配项的字符位置,即最后一次匹配项的位置之后开始,从0算起 - multiline
- source
按字面量形式的pattern返回字符串
5.4.2 RegExp实例方法
- exec()
- 输入参数
要进行检索的字符串 - 返回值
返回第一个匹配项信息的数组- Array类型
- 第一项 与整个模式匹配的字符串
- 其他项 与模式中的捕获组匹配的字符串
- 额外属性
数组具有两个额外属性- index 匹配项所在字符串中的位置
- input 应用正则表达式的字符串
- Array类型
- flags
若使用global设置,则接着上一次的匹配进度继续匹配,lastIndex属性会增加,否则不增加
- 输入参数
- test()
判断是否匹配 - toString()、toLocaleString()返回正则表达式字面量的字符串
- valueOf()返回正则表达式本身
5.4.3 RegExp构造函数属性
通过构造函数名称调用的属性,类似于静态属性,适用于作用域中的所有正则表达式,且基于所执行的最后一次正则表达式操作而变化
- 可使用长属性名和短属性名进行访问
长属性名 | 短属性名 | 说明 |
---|---|---|
RegExp.input | RegExp.$_ | 最近一次要匹配的字符串 |
RegExp.lastMatch | RegExp["$&"] | 最近一次匹配的项 |
RegExp.lastParen | RegExp["$+"] | 最近一次匹配的捕获组 |
RegExp.leftContext | RegExp["$`"] | input字符串中lastMatch之前的文本 |
RegExp.multiline | RegExp["$*"] | 是否所有表达式都使用多行模式 |
RegExp.rightContext | RegExp["$‘"] | input字符串中lastMatch之后的文本 |
- RegExp.$1
第一个匹配的捕获组
5.4.4 模式的局限性
- 缺少某些语言所支持的高级正则表达式特性
5.5 Function类型
- 函数是对象,函数名是指向函数的指针
- 函数的定义方式
- 函数声明
- 函数表达式
- 构造函数
- 最后一个参数看作函数体,前面的看作函数的参数
var sum = new Function("num1","num2","return num1+num2");
5.5.1 没有重载(深入理解)
- 函数名对应的内存空间被重新写入新的值,指向了另一个函数对象
5.5.2 函数声明和函数表达式
- 函数声明
解析器率先读取函数声明,并使其在执行任何代码之前可用
function sum(num1,num2){
return num1+num2;
}
- 函数表达式
只有在执行到它所在的代码行才会被解释执行
var sum=function (num1,num2){
return num1+num2;
};
5.5.3 作为值的函数
- 将函数作为参数传递给另一个函数
- 将函数作为返回值
例如,通过属性创建数组的比较函数,即以某个属性作为对象数组的比较依据
function callSomeFunction(someFunction,someArgument){
return someFunction(someArgument);
}
function add10(num){
return num+10;
}
var result1=callSomeFunction(add10,20);//30
function getGreeting(name){
return "Hello,"+name;
}
var result2=callSomeFunction(getGreeting,"Nicholas");//"Hello,Nicholas"
//根据指定的属性名进行排序,返回实现该功能的函数
function createComparisonFunction(propertyName){
return function(object1,object2){
var value1=object1[propertyName];
var value2=object1[propertyName];
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else{
return 0;
}
};
}
5.5.4 函数内部属性
- arguments
- callee
返回指针,该指针指向拥有这个arguments对象的函数,使函数名与函数的执行解耦- 严格模式下会报错
- caller
- 在ECMAScript 5中定义
- 严格模式下会报错
- 非严格模式下始终未undefined
- callee
- this
返回函数据以执行的环境对象,即当在全局环境中调用函数时,则this指向全局环境,若函数为对象的一个方法,调用该方法时,this指向该对象 - 函数实例的属性caller
返回调用函数的函数的引用,在ECMAScript 5中规定- 全局作用域中调用函数则返回null
- 严格模式下,不能为caller赋值
function factorial(num){
if(num<=1){
return 1;
}else{
//return factorial(num-1);
//使函数名与函数的执行解耦
return arguments.callee(num-1);
}
}
window.color="red";
var o={ color :"blue"};
function sayColor(){
alert(this.color);
}
sayColor();//"red"
o.sayColor=sayColor;
o.sayColor();//"blue"
5.5.5 函数属性和方法
- 属性
- length
表示函数希望接收的命名参数的个数 - prototype
保存实例方法,例如toString()、valueOf()等,在ECMAScript 5中不可枚举
- length
- 方法
非继承而来的方法,作用是将方法和对象解耦- 设置作用域并在作用域中调用函数,实际上等于设置函数体内的this对象的值
- 严格模式下,未指定环境对象而调用函数,this值将是undefined
- 指定环境对象的方式
- 添加到某个对象
- apply()或者call()
- 指定环境对象的方式
- apply()
- 指定的作用域
- 参数数组
- Array实例
- arguments对象
- call()
- 指定的作用域
- 逐个参数
- bind()
- 设置作用域并返回一个新的函数实例,ECMAScript 5中定义的
- 严格模式下,未指定环境对象而调用函数,this值将是undefined
- 设置作用域并在作用域中调用函数,实际上等于设置函数体内的this对象的值
window.color="red";
var o={ color :"blue"};
function sayColor(){
alert(this.color);
}
sayColor();//"red"
//o.sayColor=sayColor;
//不需要将方法与对象绑定
sayColor.call(this);//"red"
sayColor.apply(o);//"blue"
var objectSayColor=sayColor.bind(o);
objectSayColor();//"blue"
- 继承方法
- toStrring()
- toLocaleString()
- valueOf()
- 以上方法的作用是返回函数代码
5.6 基本包装类型
引用类型:Boolean、Number和String
- 引用类型提供了相应值类型的便捷方法
- 基本类型变量在调用方法时,会自动创建一个相应的引用类型的实例,调用完方法后该实例会被销毁
- Object构造方法能根据传入值的类型返回相应的基本包装类型的实例
- 尽量不要显式使用引用类型
5.6.1 Boolean类型
- valueOf() 返回boolean
- toString()和toLocaleString() 返回 “true” 、“false” 字符串
5.6.2 Number类型
- valueOf() 返回数字
- toString()和toLocaleString() 返回字符串
- 数值格式化为字符串
- toFixed()
按照指定的小数位数返回数值的字符串表示,四舍五入 - toExponential()
返回以指数表示法表示的数值的字符串形式,可指定小数位数 - toPrecision()
得到表示某个数值的最合适的格式,可指定数值的所有数字的个数
- toFixed()
5.6.3 String类型
- length属性返回字符数量
- valueOf()、toString()、toLocaleString() 返回字符串
5.6.3.1 字符方法
- charAt() 返回给定位置的字符
- charCodeAt() 返回给定位置的字符编码
- 索引器 [ ]
- ECMAScript 5中定义
5.6.3.2 字符串操作方法
- concat() 拼接多个字符串
- 基于子字符串创建新字符串
- slice( startIndex, endIndex)
- 所有负值会自动加上字符串长度
- substr( startIndex, charCount )
- 第一个参数若为负值,则加上字符串长度
- 第二个参数为字符个数,若为负值,则转化为0
- substring( startIndex, endIndex )
- 将所有负值转化为0
- 参数中较小的值作为起始位置,较大的值作为结束位置
- slice( startIndex, endIndex)
5.6.3.3 字符串位置方法
- indexOf( text [,startIndex] )
- lastIndexOf( text [,startIndex] )
5.6.3.4 trim()方法
5.6.3.5 字符串大小写转换方法
- toUpperCase()
- toLocaleUpperCase()
- toLowerCase()
- toLocaleLowerCase()
5.6.3.6 字符串的模式匹配方法
- match()
- 接收正则表达式或者Regx类型对象
- 与调用Regx实例的exec()方法相同
- 返回Array对象
- 两个额外属性
- 返回Array对象
- search()
- 接收正则表达式或者单纯的字符串
- 返回匹配项的索引
- replace()
- 参数
- 正则表达式或者单纯的字符串
- 正则表达式可以实现全部替换,即使用g设置
- 字符串
- 字符串或者函数
- 字符串
- 可结合特殊的字符序列,将正则表达式的操作结果插入到结果字符串中
- 类似字符串插值
- 函数
- 参数
- 匹配项 match
- 匹配项在字符串中的位置 pos
- 原始字符串 originalText
- 返回要替换匹配项的字符串
- 参数
- 字符串
- 正则表达式或者单纯的字符串
- 参数
- split()
- 参数
- 字符串或正则表达式
- 指定返回的数组的大小
- 参数
5.6.3.7 localeCompare()方法
按字母表中的顺序对字符串的顺序进行比较,比参数大则返回正数
- 大小写字母的顺序按地区语言决定
5.6.3.8 fromCharCode()方法
静态方法,将字符编码转换为字符串
5.6.3.9 HTML方法
- 快捷生成HTML的方法,例如anchor(name);
5.7 单体内置对象
- 由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了
5.7.1 Global对象
不属于任何其他对象的属性和方法,都是Global对象的属性和方法
5.7.1.1 URI编码方法
- 编码
- encodeURI()
不会对本身属于URI的特殊字符进行编码,如冒号、正斜杠、问号和井字号 - encodeURIComponent()
所有非标准字符,通常在对附加在现有URI后面的字符串使用
- encodeURI()
- 解码
- decodeURI()
- decodeURIComponent()
- 所有特殊字符
5.7.1.2 eval()方法
- 将字符串解析为javascript脚本代码
- eval()中执行的代码具有与eval()的执行环境相同的作用域链
- 在严格模式下,外部访问不到eval()中创建的任何变量或函数
- 在eval()中创建的任何变量或函数都不会被提升,这些变量或函数只在eval()执行时创建
5.7.1.3 Global对象的属性
- undefined、NaN、Infinity等
- 所有原生引用类型的构造函数
5.7.1.4 window
- 获取Global对象的方式
- ECMAScript未明确指出如何访问Global对象,但Web浏览器都将其作为window对象的一部分
- var global = function(){ return this; }();
5.7.2 Math对象
5.7.2.1 Math对象的属性
- Math.PI等
5.7.2.2 min()和max()方法
- 接收任意多个数值参数
- 处理数组
- Math.max.apply( Math, array)
5.7.2.3 舍入方法
- Math.ceil()
- Math.floor()
- Math.round()
5.7.2.4 random()方法
- 返回介于0和1之间的一个随机数,不包括0和1
- 从某个整数范围内随机选择一个值
- Math.floor( Math.random * 可能值的总数 + 第一个可能的值 )
- 2到10
- Math.floor( Math.random * 9 + 2 )
- 2到10
- Math.floor( Math.random * 可能值的总数 + 第一个可能的值 )
5.7.2.5 其他方法
- Math.sin(x)等