引用类型
NO.1 Object类型
最常用的引用类型是Object类型
创建Object实例的两种方法:
方法一:new+构造函数
var person = new Object();
person.name = "yzq"
person.age = 18;
方法二:使用对象字面量表示法
var person = {
name: "yzq",
age: 18
}
使用对象字面量表示法时,属性名称也可以使用字符串并且数字会自动转换为字符串:
var person = {
"name": "yzq",
"age": 18,
5:true
}
一般来说,对象的属性访问都是用点表示法,但是在JS中也可以用[]来表示
person["name"] 等价于person.name
用[]的好处是可以通过变量来访问属性或者在点用不了的情况下使用,例如:
var person = {
"first name": "dada"
}
var a = "first name"
person[a]
NO.2 Array类型
其次常用的引用类型是Array类型,JS的数组也和其他语言有很大的区别,JS的数组的每一项都可以保存任何类型的数据,且JS的数组大小是可以动态调整的,可以随着数据添加自己增长
创建数组的方法:
- var colors = new Array(); 使用Array构造函数;
- var colors = ["red","green"] 使用字面量方法;
数组的长度保存在length属性中,这个属性始终会返回0或者更大的值。
length属性有一个很大的特点,它不是只读的,所以通过这只这个属性,可以从数组的末尾移除项或者添加新项。例如:
var colors = ["red","green","blue"]
colors.length = 2
console.log(colors[2]) //结果为undefined
所以利用length属性可以方便的在数组尾末添加新项,例如:
var colors = ["red","green","blue"]
colors[colors.length]= "black"
colors[colors.length]= "brown"
console.log(colors.length)
检测数组:
对于全局的作用域来说,用instanceof就能检测,但是它的问题在与如果网页中有多个框架,instanceof会由于全局环境不一样出现问题,于是还有一个新的方法Array.isArray(),用法如下:
if(Array.isArray(value)){
//对数组进行操作
}
转化方法:
1.显示的调用toString方法,会直接将数组返回字符串的表示
2.alert(数组),因为alert只接收字符串参数,所以它会在后台调用toString方法,当数组方法只接受字符串的方法里,后台会自动去转换
转化后都默认用逗号去间隔,如果想要用别的符号,需要用join()方法,join方法只接收一个参数,就是分隔符。
colors.join("||") // red || green || blue
栈方法(后进先出):
js为数组提供了push()和pop()方法。以便实现类似栈的功能;
push()方法接收任意数量的参数,把他们逐个加到数组末尾,并返回修改后的数组的长度
pop方法从数组末尾移除最后一项,减少数组的length值,并且返回移除的项
push():
var colors = ["red","green","blue"]
var count = colors.push("1","2")
console.log(count) //5
pop():
var colors = ["red","green","blue"]
var count = colors.pop("blue")
console.log(count) // blue
队列方法(先进先出):
js为数组提供了shift()和unshift()方法。以便实现类似队列的功能;
shift()移除数组中的第一个项并返回该项,同时将数组长度减一。结合shift()和push()可以像使用队列一样使用数组
unshift()在数组前端添加任意个项并返回数组长度。结合unshift()和pop()可以像使用队列一样使用数组
重排序方法:
reverse()和sort()
reverse()方法的功能是反转数组的顺序
sort()方法是按升序排列数组项,但是sort方法会调用每个数组项的toString()的转型方法。于是比较的都是字符串的大小。例如:
var values = [0,1,5,10,15]
values.sort(); // [0,1,10,15,5]
因为sort是转化为字符串比较,所以看起来不是升序排列。
正确的做法是先定义一个比较函数:
function compare(value1,value2){
if(value1>value2) {
return 1;
} else if (value1<value2){
return -1;
} else{
return 0;
}
}
var values = [0,1,5,10,15]
values.sort(compare);
console.log(values)
这个的做法就会让数组里面的值按值比较。
操作方法:
concat()
concat()方法可以基于当前数组中的所有项创建一个新数组,这个方法会先创建当前数组的一个副本,然后将接收到的参数添加到副本的末尾。例如:
var a = ["a","b","c"]
var b = a.concat("d",[5,6])
console.log(b) // ["a", "b", "c", "d", 5, 6]
slice()
slice()方法可以基于当前数组中的某几个项创建一个新数组,可以接收一个或两个参数,接收一个参数的时候,表示返回该参数的位置到数组末尾的所有项,接收两个参数的时候,表示返回这两个参数之间的项:
var a = ["a","b","c","d","e"]
var b = a.slice(1)
console.log(b) // ["b", "c", "d", "e"]
var a = ["a","b","c","d","e"]
var b = a.slice(1,4) //注意,起始位置从1开始,而不是从0开始
console.log(b) //["b", "c", "d"]
splice()最强大的数组方法!,并不是创建数组,而是直接操作数组
1.传入两个参数:表示删除数组的项,第一个参数表示要删除的第一项的位置,第二个是要删除的数量
splice(0,2)删除数组中的前两项
2.传入三个参数:可以向指定位置插入任意数量的项,第一个参数表示起始位置,0(要删除的项目),第三个是要插入的项,如果要插入多个项,可以传入任意个的参数
splice(2,0,"red","blue")表示从数组的位置2开始插入字符串"red"和"blue"
3.传入三个参数(第二个参数不为0),替换数组中的指定项
splice(2,1,"red","blue")表示在位置2,删除1项,然后插入2个字符串"red"和"blue"
位置方法:
indexOf()和lastindexOf() 这两个方法都返回查找的项在数组中的位置,一个是从前往后查找,一个是从后往前查找
var numbers = [1,2,3,4,5,6]
numbers.indexOf(4); //3
迭代方法:
every() 对于数组的每一项运行给定函数,如果该函数对每一项都返回true,则返回true
filrer() 对于数组的每一项运行给定函数,返回该函数返回true的项组成的数组
forEach() 对于数组的每一项运行给定函数,没有返回值
map() 对于数组的每一项运行给定函数,返回每次函数调用的结果组成的数组
some() 对于数组的每一项运行给定函数,如果该函数有任何项返回true,则返回true
以上五个函数都能接受两个参数:
1.要在数组的每一项上运行的函数
2.运行该函数的作用域(可选)
归并方法:
reduce()和reduceRight()
reduce()方法从数组的第一项开始,逐个遍历到最后;
reduceRight()从数组的最后一项开始,向前遍历到第一项;
他们的函数都可以接收四个参数,前一个值,当前值,项的索引和数组对象。
var values = [1,2,3,4,5]
var sum = values.reduce(function(prev,cur,index,array){
return prev+ cur;
});
console.log(sum); //15
这个函数返回的任何值都会当做为第一个参数传给下一项,例如1+2之后,变成3传给下一项,3+3在传递给下一项,所以结果为15。
网友评论