一、引用类型
对象,在JS中被称为引用类型的值,它是引用类型的一个实例。引用类型是一种数据结构,用于将数据和功能组织在一起,也常被称为类。引用类型也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。
1、Object类型
(1)创建实例的方法:
-
new操作符 + Object构造函数:
var person = new Object();
person.name = “Nicholas”;
-
对象字面量(推荐):
var person = { name:“Nicholas" } ;
花括号{}内包含属性和方法,之间用逗号隔开,最后一个属性或方法后不加逗号或分号,另外花括号后边要有分号;
(2)访问对象属性:
-
点表示法(推荐):
person.name
-
方括号语法:
person["name"] //要将访问的属性以字符串的形式放在方括号中,或者通过变量来访问属性,变量就不用写字符串形式,如果属性名中包含非字母或非数字,则不可以点表示法。
2、Array类型
ECMAScript数组的每一项可以保存任何类型的数据,大小可动态调整。
(1)创建数组的方法:
-
Array构造函数
var colors = new Array(参数);//参数可为数组长度,可为所需包含的项。
-
数组字面量:
var colors = ["red", "blue"];//省略new操作符,将数组项放入方括号,用逗号隔开。
设置、替换、添加数组值,可通过索引来进行:
colors[2] = "black";//替换举例
数组的length属性不是只读的,可以通过设置该值移出或添加项,如果把一个值放到了超出当前数组大小的位置上时,数组就会重新计算其长度值,即长度值等于最后一项索引加1。
colors[99] = "black";//colors本身长度为2,当给其99位置插入值后,该数组长度变为100,中间位置2到98实际上是不存在的,将返回undefined。
(2)Array类型具有的方法
方法类型
|
方法
|
用途
|
检测数组
|
instanceof操作符
|
检测该值是什么类型的对象:if( value instanceof Array){//操作}
|
|
toLocaleString();
toString();
join();
| 前两个返回数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串; colors.toString(); colors.join("||");//自定义分隔符分离数组项 |
|
valueof();
| 返回数组 |
栈方法
|
push();
| 接收任意数量参数,逐个添加到数组末尾,并返回修改后数组的长度; var count = colors.push("red","green");//返回的是新数组的长度 |
|
pop();
|
接收任意数量参数,移除到
数组最后一项
,并
返回移除项
;
var iterm = colors.pop();//返回的是被移除的数组的最后一项
|
队列方法
| shift(); | 移除数组中的第一个项,并返回该项,同时数组长度减1; var iterm colors.shift();//返回移除项 |
|
unshift();
|
在数组
前端添加任意个项,并
返回数组长度;
var count = colors.unshift("red","green");//返回的是新数组的长度
|
重排序方法
| reverse(); | 反转数组项顺序 |
|
sort();
| 按升序排列数组项,即使每一项是数值,但该方法先将其转化为字符串,再比较。通常该方法接收一个比较函数作为参数,改善比较结果。 function compare(value1, value2){ return value2 - value1; } values.sort(compare); |
操作方法 |
contact();
| 创建当前数组的一个副本,然后将接收到的参数添加到副本的末尾,返回新数组。该方法不会改变现有数组。 var colors = ["red"]; var colors2 = colors.contact("yellow");//返回的数组是red , yellow |
|
slice();
| 接收一个或两个参数,即要返回项的起始和结束位置,包含起始位置,不包括结束位置项。(如果有一个负数,则用数组长度加上该数来确定相应的位置,若结束位置小于起始位置,则返回空数组) var colors = ["red", "green", "blue"]; var colors2 = colors.slicet(1,2);//返回的数组是green,blue |
|
splice();(重要)
| 插入——向数组的中部插入项,提供3个参数:起始位置,0(要删除的项数),要插入的项:splice(2,0,"red","green"); 删除——删除任意数量的项,提供2个参数:要删除的第一项的位置,要删除的项数:splice(0,2); 替换——向指定位置插入任意数量的项,且同时删除任意数量的项,提供3个参数:起始位置、要删除的项数、插入的项,其中删除的项数和插入的项数不一定相等:splice(2,1,"red","green"); 最终返回由删除项构成的数组,如果没有删除则返回空数组,它会改变原始数组。 |
位置方法
|
indexOf();
|
从数组头部向后查找,接收2个参数:要查找的项和(可选)表示查找起点位置的索引,返回要查找项在数组中的位置,为找到则返回-1,且要求
查找的项必须严格相等(===);
|
|
lastIndexOf();
|
从数组末尾向前查找,接收2个参数:要查找的项和(可选)表示查找起点位置的索引,返回要查找项在数组中的位置,为找到则返回-1,且要求
查找的项必须严格相等(===);
|
迭代方法
| every(); | 对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true; |
|
filter();
|
对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组;
|
|
forEach();
|
对数组中的每一项运行给定函数。该方法无返回值;
|
|
map();
| 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组; |
|
some();
| 对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true; |
|
以上五种方法的共同点:
|
接收两个参数:每一项上运行的函数,运行该函数的作用域对象——影响this的值;
不会改变原始数组;
|
归并方法
| reduce(); | 从第一项开始,向后遍历; |
| reduceRight(); | 从最后一项开始,向前遍历; |
|
两者共同点:
|
迭代所有项,构建一个最终的返回值;
接收两个参数:在每一项上调用的函数和(可选)归并基础的初始值;
调用的函数接收4个参数:前一个值,当前值,项的索引值,数组对象;
该函数返回的任何值都会作为第一个参数自动传给下一项,即上一次的结果作为前一个值参与当前的运算。
|
var person = { name: "Nicholas" };
var people = [{ name: "Nicholas" }];
var morePeople = [person];
alert(people.indexOf(person)); //-1
alert(morePeople.indexOf(person)); //0
这里查找的时候,所比较的是对象。
在 people 这个数组中的这个 {name:"Nicholas"} 和 person 并不是同一个对象,而 morepeole 中和 person 是同一个对象(因为直接引用了它)。因此第一个会返回 -1(无法找到),第二个是 0。
你可以直接进行测试,person == people[0] 或者 person === people[0] 都是不成立的(false),indexOf 的比较就是单纯的 ===。
问题简化一下,可以看下面的例子:
var x = {a:1}; var y = {a:1}; console.log(x === y); //输出false
因为x,y并不是同一个对象,只是恰好有一个同名属性,且值相同。(但两个对象在内存中不是同一个对象)
只要知道一个对象只等于它自己就好了。
3、Date类型
(1)创建Date类型方法:
-
new操作符+Date构造函数:
var now = new Date(参数); //返回相应日期的毫秒数
(2)常用方法
-
Date.parse():接收一个表示日期的字符串参数,返回该日期的毫秒数,会因为地区差异,参数的格式不同;
-
Date.UTC():同样返回毫秒数,但构建值时精确到毫秒数;
-
Date.now():返回调用该方法时的日期和时间的毫秒数;
var start = Date.now();
dosomething();
var stop = Date.now();
result = stop - start;//获取时间间隔