javascript 引用类型
javascript引用类型是一种描述数据结构,是数据和操作的集合,JS所有引用类型都源自Object,Object是所有引用类型的基类。引用类型类似高级语言中的“类”,但跟“类”不同,js中的“类”并没有严格的限制,所以不能严格称为类,通常称为对象定义。由于javascript是动态语言,其对象可随时动态添加属性,并且可随时更改属性类型,如下:
var o = new Object();
o.name = "andy";
alert(typeof(o.name)); // 输出 "string"
o.name = 12;
alert(typeof(o.name)); //输出number
一、Object
Object是javascript引用类型的根节点。语法声明有2种,分别是new操作符和对象字面量法。
1.new操作符
var o = new Object(); //直接用new对象,返回实例o
这种方法会调用Object构造函数,JS对象构造函数都是跟其类同名。
2.对象字面量
var o = { }; //声明空对象
var o = { name: "abc", age: 12 }; // 声明对象并初始化属性
注:使用对象字面量,早期的浏览器会调用Object构造函数,现在的浏览器不会调用。
如何判断对象属性是否有定义:
直接用typeof判断,如下:
alert(typeof(o.name1) == "undefined"); // undefined一定要用引号或双引号,因为typeof返回来的是字符串。如果name1未定义则返回true
上面代码等于:
o.name1;
alert(typeof(o.name1) == "undefined"); // 返回 true
如果需要精确到具体数据类型,可以这样:
alert(typeof(o.name1) == "string"); // 这样只有name1数据类型是字符串,才可执行。
访问对象属性,除了上述.+属性名外,还可用["属性名"],如o["name1"]。注:直接用.不允许属性名有空格,但此方法可以,如o["frist name"]。一般建议用.访问。
注:所有引用类型使用typeof都返回object字符串,如
var o = new Array();
alert(typeof o); // 输出“object”
二、Array
Array中文名称为数组。javascript数组,与其他语言一样,都是数据的有序列表,但跟其它语言不同,JS数组是动态数组,其元素可以包括任何数据类型,也就是说数组第1个位置可以是数字型,第2个位置可以是字符串型。
数组的声明有2种,new Array和数组字面量法。
1.new Array,如下:
var array = new Array(); // 声明1个长度为0的空数组对象
var array = new Array(20);// 声明1个长度为20的数组对象
var array = new Array(1, 2, "a", new Date()); // 声明1个数组并初始化4个元素,长度为4.
javascript的数组长度可以设置,如下:
array.length = 100;
array.push("cd"); // 将字符串“cd"添加数组最后位置+1,也就是100
2.数组字面量:
var array = []; // 声明1个长度为0的空数组对象
var array = [1, 20, "a"] ;// 声明1个数组并初始化3个元素,长度为3
跟对象一样,早期的浏览器用数组字面量会调用Array构造函数,现代浏览器则不会。
访问数组元素位置下标索引值。从0开始,如:array[1]; // 访问array第2个元素。
检测数组:
很多情况下,我们需要判断对象是否是数组,传统方法可以用如下方式:
if (array instanceof == Array) // 用instanceof 关键字判断array是否属于Array类型
ECMAScript5新定义一个检测数组的函数:
Array.isArray(); // 支持IE9+,chrome等。在现代浏览器中推荐使用。
数组的常用函数:
1. toString():
var o = new Array(1, 2, 3,-1, "a");
alert(o.toString()); 或 alert(o.valueOf()); // 输出 "1, 2, 3, -1, a "字符串,以,分隔。假设元素里含有null, undefined,一律以空字符代替。
2.join:
toString()只能返回以逗号分隔的字符串,假设要以其它分隔符,则使用join函数,如:
alert(o.join("|"));// 输出"1|2|3|-1|a"字符串
alert(o.join()); // 输出"1, 2, 3, -1, a ",join实质内部调用toString()
3.栈方法:
在高级语言中,通常都有带有栈函数,所谓栈,是指一组有序数据按照先进后出的原则。JS没有提供特定的栈类型,而是利用Array的push和pop两个方法实现栈过程。代码如下:
var array = [1, 2, -1, 3];
array.push(-3); // 将-3推到array最后位置中,长度+1,注意:push返回值为新数组长度。
array.pop(); // 输出-3,因为-3是数组中最后位置,从最后位置开始输出,长度-1; 如果长度为0了,再pop,返回undefined
4:队列方法:
队列是指一组在序数据按照先进先出的原则,JS利用push和shift两个方法实现队列过程。如下:
var array = ["a", "b", "c"];
array.push(1);
array.push(2);
alert(array.shift()); // 输出“a",因为a是第1个先进的元素,同时长度-1
alert(array.shift()); // 输出“b"
5:重排序:
排序是按照数组元素值从小到大或从大到小排队。JS提供2种方法进行升序和倒序,如下:
var o = [1, 3, 2, -1, 10, 9 };
alert(o.sort()); // 升序,输出 -1,1,10, 2, 3, 9
alert(o.toString()); // 输出-1,1,10, 2, 3, 9,因为是排序过后的顺序
alert(o.reverse()); // 倒序,输出9,3,2,10,1,-1
alert(o.toString()); // 输出9,3,2,10,1,-1
以上的排序如果是字符串,语义是没有问题,但如今是数值,如上升序,10排在9的前面,岂不是10<9?显然不对,这是因为sort默认将元素都转换为字符串再比较,”10“在ASCII码比”9“要小。如要排序数值型,则可在sort传入比较函数,如:
alert(o.sort(function (val1, val2) {
if (val1 < val2) {
return -1;
}
if (val1 > val2) {
return 1;
}
return 0;
})); // 输出-1,1,,2,3,9,10
这时就能正确排序了,而倒序方法也是一样。
6:位置方法:
如果通过一元素值查找数组所在的位置,可以通过indexOf和lastIndexOf方法查找。这2个方法区别:indexOf是从0开始查找,如果找到匹配,则停止查找返回位置。lastIndexOf则相反,从数组末尾往前查(length-1),如果查找到匹配则返回所在位置。如果都没有查找,则返回-1.
var array = [1, 2, 1, 4 };
alert(array.indexOf(1)); // 输出0
alert(array.lastIndexOf(1)); // 输出2
三、日期类型
javascript日期是源用java.util.Date对象构建的,所以使用UTC(国际协调时间)来保存日期,即从1970年1月1日零点开始到现在所经过的毫秒数,小于1970则为负数表示。日期值用Date对象,声明如下:
var date = new Date(); // 如果传入空参数,则创建当前日期和时间的日期对象
date.getFullYear(); // 返回日期年份
date.getMonth(); // 返回月份,注:JS月份是从0开始,0代表1月,2代表3月
date.getDate(); // 返回日
date.getDay(); // 返回星期几
date.getHours(); // 返回小时
date.getMinutes(); // 返回分钟
date.getSeconds(); // 返回秒数
date.getMilliseconds();// 返回毫秒
date.getTime(); // 返回1970到现在的毫秒数
如果需要设置日期,则用set,如
date.setMonth(2); // 设为3月份
日期解析:
var date = new Date("UTC毫秒数值");
var date = new Date(年,月,日);
var date = new Date(年,月,日,小时,分钟,秒,毫秒);
ECMA5新增了个now方法返回当前时间,如
Date.now(); // 返回当前时间(1970到现在的毫秒数)
new Date(Date.now()) - new Date(2000, 0); // 返回2000年到现在的毫秒数
浙公网安备 33010602011771号