引用类型是一种数据结构,用于将数据和功能组织在一起,将其称之为类却并不妥当,因为它不具备传统面向对象所支持的累和接口等基本结构。
5.1 Object类型
两种创建方式
var person = new Object();
person.name="jack";
person.age=18;
var anotherPerson = {
name:"jack",
age:22
}
通过字面量定义对象时实际不会调用Object对象。
除了通过点语法,也可以使用方括号访问属性。
alert(anotherPerson["name"]);
5.2 Array类型
js中的数组中的每一项可以是任何类型的数据。
var colors= new Array("blue","red");
var persons = new Array(3);//如果参数是一个数值,那么会创建给定项数的数组,这里创建了长度为3的数组
数组的length属性不是只读的,通过设置这个属性可以给数组的末尾添加和移除元素。如果将length属性设置大于数组项数的值,则新增项被设为undefined。
alert(Array.isArray(persons));//检测变量是不是Array
调用toString方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。实际是调用数组每一项的toString方法,而toLocaleString方法实际是调用数组每一项的toLocaleString方法
alert(colors.toString());
join方法可以使用不同的分隔符来构建字符串。
alert(colors.join('--'))
调用valueOf方法返回数组。
栈方法
push方法接受任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度,而pop方法移除数组最后一项,并返回该项。
队列方法
shift能够移除数组的第一个项并返回该项,同时将数组长度减1。
unshift能够在数组前端添加任意个项并返回新数组的长度并返回新数组的长度。
重排序方法
reverse 反转数组项的顺序
sort 调用每个项的toString方法,得到字符串然后排序,即使每一项都是数值,sort比较的也是字符串。
sort方法可以接受一个比较参数。比较函数接受两个参数,如果第一个参数在前面,应该返回负数。相等返回0,反之返回正数。
var values=[0,12,2,23,44,5];
function compare(pre,next){
return pre-next;
}
alert(values.sort(compare));
操作方法
contact方法创建原数组的副本,然后接收到的参数添加到这个副本的末尾,最后返回新创建的数组。
alert(colors.concat("green"));
slice 一个参数,返回从参数指定位置开始到数组末尾的新数组,两个参数,返回从开始位置到结束位置之间的项,但不包括结束位置。
var values=[0,12,2,23,44,5];
alert(values.slice(1));//12 2 23 44 5
alert(values.slice(1,3));//12 2 23
如果slice方法的参数中有一个负数,则用数组长度加上该数来确定位置。
splice方法
删除,指定两个参数,要删除的第一项的位置和要删除的项数。
插入,三个参数,起始位置,0,要插入的项
-
替换,三个参数,起始位置,要删除的项数,和要插入的任意数量的项。插入的项数和删除的项数不必相等。
var values=[0,12,2,23,44,5]; values.splice(2,1,13,14);//0 12 13 14 23 44 5 alert(values);
位置方法
indexOf lastIndexOf(从后向前找)查找给定项在数组中的位置
还可以接受一个可选参数,表示要开始找的位置
values.splice(4,0,12);//0 12 13 14 12 23 44 5
alert(values.indexOf(12));//1
alert(values.indexOf(12,3));//4
迭代方法
- every 对数组每一项运行给定方法,每一项都是true则返回true
- filter 对数组每一项运行给定方法,返回true项组成的数组
- map 对数组每一项运行给定方法,返回函数操作结果组成的数组
- forEach 对数组每一项运行给定方法,不返回结果。
- some 对数组每一项运行给定方法,有一项是true则返回true
归并方法
reduce reduceRight 迭代数组的所有项,构建一个最终的返回值。reduce 从头开始 reduceRight从数组末尾开始。
这两个方法接受两个两个参数:一个在每一项上调用的函数,和作为归并基础的初始值。调用的函数接受4个参数:前一个值,当前值,项的索引和数组对象。这个函数的返回值会作为第一个参数传给下一项。
var numbers=[1,2,3,4,5];
var sum=numbers.reduce(function(pre,cur,index,array){
return pre+=cur;
})
alert(sum);
5.3 Date类型
var now= new Date();
alert(now);//Mon Aug 01 2016 11:36:11 GMT+0800 (CST)
var someDate=new Date("8/1/2016");
alert(someDate);//Mon Aug 01 2016 11:39:23 GMT+0800 (CST)
var date2 = new Date(Date.UTC(2016,7,1,11,41));
alert(date2);
5.4 RegExp类型
var expressions = /pattern/flags;
pattern表示正则表达式,flags标志正则表达式的行为。
g 全局模式,应用与所有字符串,而非发现第一个匹配项立即停止。
i 不区分大小写模式
-
m 多行模式 到达一行末尾时还会继续查找下一行。
还可以使用RegExp构造函数:var pattern3=/.at/gi; var pattern2= new RegExp(".at");
5中规定,字面量和构造函数一样,每次都创建新的RegExp实例。
exec()接受要应用的模式的字符串,返回包含第一个匹配项信息的数组;没有返回null。数组里还有两个额外的属性:index和input index表示匹配项在字符串的位置,input表示应用正则表达式的字符串。
exex()即使设置了g,每次也只会返回一个匹配项。
test() 有匹配返回true。
5.5 Function
函数实际上是对象,每个函数都是Function类型的实例
两种方式
function sum(number1,number2){
return number1+number2;
}//函数声明 推荐
var sum=function(number1,number2){
return number1+number2;
}//函数表达式
解析器在向执行环境加载数据时,会率先读取函数声明,并使其在执行任何代码之前可访问。函数表达式则必须等到解析器执行到它所在的行,才会真正被执行。
即使声明函数的代码在调用之后,它也能被提升到顶部。
函数内部有两个特殊的对象,arguments和this,arguments有一个callee的属性,指向拥有这个arguments的函数。
function factorial(num){
if(num<1){
return 1
}else{
return num*arguments.callee(num-1);
}
}
this引用的是函数据以执行的环境对象。
caller保存着调用当前函数的函数的引用。
对于引用类型而言,prototype是保存它们所有实例方法的真正所在。
每个函数都包含两个非继承而来的方法,apply和call。
apply接收两个参数,一是在其中运行函数的作用域,另一个是参数数组。call类似,第二个参数数组里的参数必须逐个列举出来。
apply和call真正强大的方法是能够扩充函数赖以运行的作用域。
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor();//red
sayColor.apply(o)//blue
bind 创建一个函数实例,其this值会被绑定到bind的参数。
5.6 基本包装类型
Boolean Number String
每当读取一个基本类型的值的时候,后台就会创建一个对应的基本包装类型的对象。
var s1="hello";
var s2=s1.toLocaleUpperCase();//创建实例 调用实例方法 销毁实例
var num=10;
alert(num.toFixed(2));//10.00 按照指定的小数位返回数值的字符串表示
String
字符方法
alert(name.charAt(1));//a
alert(name.charCodeAt(1));//97
alert(name[1]);//a
字符串操作方法
slice substring substr 这三个方法都会返回一个新的字符串,第一个参数代表起始位置,第二个参数不传默认到结尾,传的话slice和substring是结束位置的后一个位置,substr是返回的字符串长度。
alert(name.slice(2));//jackson
alert(name.substring(2));//jackson
alert(name.substr(2));//jackson
alert(name.slice(2,3));//c
alert(name.substring(2,3));//c
alert(name.substr(2,3));//cks
位置方法
alert(name.indexOf("k"));//3
alert(name.lastIndexOf("c"))//2
alert(name.indexOf("x"))//-1 找不到返回-1
trim 创建个新串,删除前面和后面的空格。
大小写转换
toLocaleUpperCase toLocaleLowerCase
alert(name.toLocaleUpperCase())//JACKSON
字符串的模式匹配
var matches=content.match(pattern);
alert(matches.index);
alert(matches[0]);
alert(content.search(matches));//返回字符串中第一个匹配项的索引,没有返回-1
替换字符串
replace方法 第一个参数是reg对象或者字符串,第二个参数是一个字符串或者函数,如果第一个参数是字符串,只会替换第一个子字符串,如果想替换所有,就要提供正则表达式,并且指定g。
alert(content.replace("at","ad"));//cad,bat,sat,fat
alert(content.replace(/at/g,"ad"));//cad,bad,sad,fad
5.7 单体内置对象
Global 不属于任何其他对象的属性和方法,最终都是它的属性和方法。所有在全局作用域中定义的属性和函数,都是Global对象的属性。
encodeURI encodeURIComponent 对URI进行编码以便发送给浏览器。
eval方法接受一个字符串,即要执行的js代码。
Math对象
var max=Math.max(3,71,22,14);
var max=Math.min(3,71,22,14);
var values=[22,1,44,5];
var max=Math.max.apply(Math,values);
alert(Math.ceil(25.9));//向上
alert(Math.round(25.9));//四舍五入
alert(Math.floor(25.1));//向下
值=Math.floor(Math.random()*可能值的总数+第一个可能的值)