『Week NO.2』
由于本章内容篇幅较长故拆分成引用类型Ⅰ和 引用类型Ⅱ两部分。
引用类型的值(对象)是引用类型的一个实例。引用类型是一种数据结构,将数据和功能组织在一起。引用类型有时也称对象定义,因为它们描述的是一类对象所具有的属性和方法。
对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数来创建的,构造函数本身就是一个函数。
var person = new Object();
这行代码创建Object引用类型的一个新实例,然后把实例保存在person中。
5.1 object类型
大多数引用类型都是object类型的实例,object类型也是使用最多的一个类型。
创建object实例的方式有两种:
a. 使用new操作符后跟object构造函数
var person = new Object();
person.name = "meiyzeng";
person.age = 26
b. 使用 对象字面量表示法。 (代码量少 ,封装数据感觉 ,推荐首选)
var person = {
name : "meiyzeng",
age : 26 //数值属性会自动转化成字符串
}
c.(不推荐)
var person = {}
person.name = "meiyzeng";
person.age = 26
一般来说 访问对象属性时使用都是点表示法,在js也可以使用方括号表示法来访问对象的属性。 除非使用变量来访问属性,否则建议点表示法。
person.name //点表示法
person["name"] //方括号表示法
方括号表示法 优点: 可通过变量访问属性 :
如:person["first name"] = "meiyzeng"
由于“first name”中包含一个空格,所以不能用点访问,而属性中是可以包含非字母非数字的。
5.2 Array类型
js里数组可以保存任何类型的数据,也可动态调整大小。
创建数组的两种基本方式
a. 使用Array()构造函数 :var colors = new Array(3); //创建一个包含3项的数组
在使用Array构造函数也可以省略new操作符
b.使用数组字面量表示法 由一对包含数组项的方括号表示,数组项用逗号间隔 :var colors = ["red","blue"]
在读取和设置数组时,使用方括号并提供相应值基于0的数字索引
var colors = ["a","b","c"];
colors[5] = "f";
alert(colors.length) //6
console.log(colors) //["a", "b", "c", undefined, undefined, "f"]
colors.length = 3;
alert(color[2]) // undefined
5.2.1检测数组
单一的全局执行环境中使用instanceof操作符检测:如下:
if (value instanceof Array){
//
}
解决方法Array.isArray() (存在低版本浏览器不兼容问题)
if(Array.isArray(value)){
//
}
5.2.2 转换方法
var colors = ["a","b","c"];
alert(colors) //由于alert()要接收字符串参数,所以会在后台调用toString()方法
valueOf的优先级本来就比toString的高。
在 默认情况会以 逗号分隔字符串返回数组项,使用join()方法可以使用不同的分隔符来构建
var colors = ["a","b","c"];
alert(color.join("||")) // a || b || c
alert(color.join("")) //a,b,c (ie7及更早版本会使用undefined作为分隔符)
5.2.3 栈方法
栈( 后进先出)是一种可以限制插入和删除项的数据结构。其插入移除只发生在 栈的顶部
push()和pop()是数组默认方法。
var colors = new Array();
var count = colors.push("red","green")
alert(count) //2
count = colors.push("black");
alert(count) //3
var item = colors.pop(); //取得最后一项
alert(item); //black
alert(color.length) //2
-------------------------------------------
这里要注意一点比如push()方法返回的是一个长度值 如下:
var colors = new Array();
var count = colors.push("red","green")
console.log(colors) //["red", "green"]
console.log(count) //2
alert(count);
-------------------------------------------
栈方法可以与其他数值方法连用。
5.2.4 队列方法
队列( 先进先出)在列表末端添加项,从前端移除。push()是项末端添加,而shift()方法能够将第一项 移除。
结合push()和shift()方法,可以像队列一样使用数值
var colors = new Array();
var count = colors.push("red","green")
alert(count) //2
count = colors.push("black");
alert(count) //3
var item = colors.shift(); //取得第一项
alert(item); //"red"
alert(color.length) //2
unshift()方法则可以从前端 添加任意个项并返回新数组长度(ie7中返回undefined而不是数组新长度)
5.2.5 重排序方法
数组中存在两个可以直接用来重排序的方法:reverse()和sort()
reverse()方法会 反序数组 如:
var values = [1,2,3,4,5]
values.reverse();
alert(values); // 5,4,3,2,1
sort() 默认按 升序排列,会 调用每个数组项的toSring()转型方法 如:
var values = [0,1,5,20,25,3]
values.sort();
alert(values); // 0,1,20,25,3,5
于是有了比较函数:(下面的是升序,降序同理可得)
function compare(varl,val2){
if(val1 < val2){
return -1;
}else if (val1 > val2){
return 1;
}else{
return 0;
}
}
var values = [0,1,5,20,25,3]
values.sort(compare);
alert(values); // 0,1,3,5,20,25
(对于 数值类型或者 valuesOf()方法返回数值类型的对象类型可以使用下面简单的方法比较)
function compare(val1,val2){
return val2 - val1; //降序
}
如果想要升级排序 则return语句应该返回 val1-val2 ( 此处书本有误)
5.2.6 操作方法
concat()方法新构建一个数组
var c1 = ["1","2","3"]
var c2 = c1.concat("num","num1")
alert(c2) // 1,2,3,num,num1
slice()方法 (不会影响原始数组),可以接受一个或两个参数,即返回项的起始和结束位置。
a. 一个参数情况下 返回该参数指定位置开始到数组末尾的所有项。
b. 两个参数 情况下则返回 起始和 结束位置之间的项( 不包括结束位置的项)
var c1 = ["1","2","3","4"]
var c2 = c1.slice(1); // 2,3,4
var c3 = c1.slice(1,3); // 2,3 不包括位置3的值4
*如果slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位置。
如在一个包含5项的数组slice(-3,-1)和slice(2,4)是等同的。如果结束位置小于起始位置,则返回空数组。
splice()方法
主要用途向数组中的中部插入项
删除:(2个参数)可以删除任意数量的项,指定两个参数,要删除第一项的位置和要删除的项数
如:splice(0,3)会删除数组中前三项
插入:(3个参数)起始位置、0(要删除的项数)和要插入的项数
如:splice(3,0,"1","2") //位置3开始插入字符串"1","2"
替换:(3个参数)起始位置,要删除的项数和要插入的项数
如:splice(3,1,"1","2") //删除当前数组2的项然后再插入
5.2.7 位置方法
两个方法:indexOf()和lastIndexOf(),两个方法都接受两个参数:要查找的项和(可选的)表示查找起点位置的索引。
其中indexOf()从开头开始查找,而lastIndexOf()从数组末尾开始查找。返回位置,没找到则返回-1;查找过程使用全等操作符,必须严格相等。
5.2.8 迭代方法
5种迭代方法,每个接收两个参数:要子每一项上运行的函数和(可选的)运行改函数的作用域对象--影响this的值。
every(): 对数组中每项运行给定函数,如果该函数对每一项都返回true,则返回true。
filter(): 对数组中每项运行给定函数,返回函数会返回true的项组成的数组 //对于查询符合条件的所有数组非常有用
forEach(): 对数组中每项运行给定函数,该方法无返回值
map(): 对数组中每项运行给定函数,返回每次函数调用的结果组成的数组。
some(): 对数组中每项运行给定函数,任意一项返回true,则返回true;
5.2.9 缩小方法
reduce()和reduceRight()两个方法都会迭代数组的所有项,然后构建一个最终返回的值。reduce()从头开始,reduceRight()则从末端开始。
这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为缩小基础的初始值
reduce()和reduceRight()的函数接收4个参数 (前一个值、当前值、项的索引和数组对象)如:
使用reduce()方法可以执行求数组中所有值之和的操作
var val = [1,2,3,4,5]
var sum = val.reduce(function(prev,cur,index,array){
return prev + cur;
})
alert(sum); // 15
5.3 Date类型
Date类型保存的日期能够精确到1970年1月1日之前或之后285616年
创建日期对象:
var now = new Date();
在调用Date构造函数而不传递参数的情况下,新创建的对象自动获得当前日期和时间。如果想根据特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数。为了简化这一计算过程,JavaScript提供了两个方法:Date.parse()和Date.UTC()。
其中,Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。JavaScript没有定义Date.parse()应该支持哪种格式,因此这个方法的行为因实现而异,而且通常是因地区而异。将地区设置为美国的浏览器通常都接受下列日期格式:
Date类型还有一些专门用于将日期格式化为字符串的方法,这些方法如下:
toDateString()——以特定于实现的格式显示星期几、月、日和年
toTimeString()——以特定于实现的格式显示时、分、秒和时区
toLocaleDateString()——以特定于地区的格式显示星期几、月、日和年
toLocaleTimeString()——以特定于实现的格式显示时、分、秒
toUTCString()——以特定于实现的格式完整的UTC日期