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年到现在的毫秒数

 

  

 

    

posted @ 2015-08-19 14:21  司马逍遥  阅读(143)  评论(0)    收藏  举报