var date1=new Date("2/27/2014"); alert(date1); //Thu Feb 27 2014 00:00:00 GMT+0800var date2=new Date("February 27,2014");alert(date2); //Thu Feb 27 2014 00:00:00 GMT+0800var date3=new Date(2014,1,27,11,24,0);alert(date3); //Thu Feb 27 2014 11:24:00 GMT+0800var date4=new Date(2014,1,27);alert(date4); //Thu Feb 27 2014 00:00:00 GMT+0800var date5=new Date("2014,1,27,11,24,0");alert(date5); //Invalid Date通过上面的例子,大家可能会注意到它们之间的区别:

Javascript引用类型之数组Array

[数组的22种方法概述]
javaScript中的数组与其他多数语言中的数组有着相当大的区别。虽然JavaScript数组与其他语言中的数组都是数据的有序列表,但与其他语言不同的是,JavaScript数组的每一项可以保持任何类型的数据。也就是说,可以用数组的第一个位置来保存字符串,用第二个位置来保存数值,用第三个位置来保存对象。而且,JavaScript数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。
Array:数组中的每一项可以保存任何类型的数据,且数组的大小是动态调整的(最多可包含4294967295项,大约43亿项)
[1.1]数组创建:
[1.1.1]使用Array构造函数(在使用Array构造函数时,也可以省略New操作符)
e.g. var colors = new Array();var colors = new Array(20);var colors = new Array("red","blue","green");var colors = Array(3);[注意]若传递的是数值,则会按照该数值创建包含给定项数的数组;
e.g. var colors = new Array(3);//包含三项的数组var colors = new Array("Greg");//包含一项,且该项为"Greg"的数组[1.1.2]使用数组字面量表示法(用该方法不会调用Array构造函数)
e.g. var colors = ["red","blue","green"];var colors = [];[不可用] var colors = [1,2,];//在IE8及以前中会包含一个三个项目,且每个项目为1、2和undefined的数组。在其他浏览器中为只包含1和2的数组
e.g. var colors = ["red","blue","green"];colors.length = 2;alert(colors[2]);//undefinedcolors.length = 4;alert(colors[3]);//undefined[1.2.3]利用length属性可以方便地在数组末尾添加新项
e.g. colors[colors.length] = "black";[1.2.4]当把一个值放在超出数组大小的位置上时,数组就会重新计算其长度值,即长度值等于最后一项的索引加1
e.g. var colors = ["red","blue","green"];colors[99] = "black";alert(colors.length);//100[1.3]数组检测
e.g. var colors = ["red","blue","green"]; console.log(colors.valueOf());//["red","blue","green"]alert(colors.valueOf());//"red,blue,green"alert(colors.toString());//"red,blue,green"alert(colors);//"red,blue,green"[注意]由于alert()要接收字符串参数,它会在后台调用toString()方法,会得到与toString()方法相同的结果
var person1 = { toLocaleString: function(){ return "Nikolaos"; }, toString: function(){ return "Nicholas"; }};var person2 = { toLocaleString: function(){ return "Grigorios"; }, toString: function(){ return "Greg"; }};var people = [person1,person2];alert(people);//Nicholas,Gregalert(people.toString());//Nicholas,Gregalert(people.toLocaleString());//Nikolaos,Grigorios[1.4.4]join:可以使用不同的分隔符来构建这个字符串,join只接收一个字符,用作分隔符的字符串,然后返回包含所有数组项的字符串e.g. var colors = ["red","green","blue"];alert(colors.join(","));//"red,green,blue"alert(colors.join("||"));//"red||green||blue"alert(colors.join());//"red,green,blue"alert(colors.join(undefined));//"red,green,blue"[注意]在IE7及以前会使用undefined作为分隔符
function compare(value1,value2){ if(value1 < value2){ return -1; }else if(value1 > value2){ return 1; }else{ return 0; }}对于数值类型或valueOf()方法会返回数值类型的对象类型,比较函数可以简化为:function compare(value1,value2){return value2 - value1;}[tips]:常用以下方法来创建一个随机数组function compare(){return Math.random() - 0.5;}[1.5.4]操作方法(切开、连接、插入、删除、替换):e.g. var numbers = [1,2];console.log(numbers.concat());//[1,2]console.log(numbers.concat([5,4,3],[3,4,5],1,2));//[1,2,5,4,3,3,4,5,1,2];[1.5.4.2]slice():基于当前数组中的一个或多个项创建一个新数组,接受一个或两个参数,即要返回项的起始和结束位置 ,最后返回新数组(slice()不影响原数组)
var numbers = [1,2,3,4,5];console.log(numbers.slice());//[1,2,3,4,5]console.log(numbers.slice(2));//[3,4,5]console.log(numbers.slice(2,3));//[3]console.log(numbers.slice(-3));//-3+5=2 -> [3,4,5]console.log(numbers.slice(2,1));//[][1.5.4.3]splice():原数组变为修改后的数组,而splice()返回从原数组中删除的项组成的数组,若无删除项则返回空数组
var numbers = [1,2,3,4,5];console.log(numbers.splice(0,2),numbers);//[1,2] [3,4,5]var numbers = [1,2,3,4,5];console.log(numbers.splice(1,0,11,12),numbers);//[] [1,11,12,2,3,4,5]var numbers = [1,2,3,4,5];console.log(numbers.splice(1,3,11,12),numbers);//[2,3,4] [1,11,12,5]var numbers = [1,2,3,4,5];console.log(numbers.splice(-4,3,11,12),numbers);//-4+5=1 -> [2,3,4] [1,11,12,5]var numbers = [1,2,3,4,5];console.log(numbers.splice(-4,-3,11,12),numbers);//-4+5=1 -> [] [1,11,12,2,3,4,5][1.5.5]位置方法(ECMAScript5):两个参数:要查找的项、表示查找起点位置的索引(可选)。返回第一个满足条件的查找项在数组中的位置,如果没有找到则返回-1(位置方法不会影响原数组)
var person = {name: "Nicholas"};var people = [{name: "Nicholas"}];var morePeople = [person];alert(people.indexOf(person));//-1,因为person和people[0]虽然值相同,但是是两个引用alert(morePeople.indexOf(person));//0,因为person和morepeople[0]是同一个引用alert(morePeople.indexOf({name: "Nicholas"}));//-1,因为不是同一个引用[tips]若返回满足条件的项的所有索引值function allIndexOf(array,value){ var result = []; var pos = array.indexOf(value); if(pos === -1){return -1; } while(pos > -1){result.push(pos);pos = array.indexOf(value,pos+1); } return result;} var array = [1,2,3,3,2,1]; console.log(allIndexOf(array,1));//[0,5][1.5.6]迭代方法(ECMAScript5):两个参数:要在每一项上运行的函数、运行该函数作用域对象——影响this的值(可选)。传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置、数组对象本身(迭代方法不会影响原数组) var numbers = [1,2,3,4,5,6,7,8,9,0]; var sum = 0; var everyResult = numbers.every(function(item,index,array){return (item>2); }); var filterResult = numbers.filter(function(item,index,array){return (item>2) }); var forEachResult = numbers.forEach(function(item,index,array){sum += item;return (item>2) }); var mapResult = numbers.map(function(item,index,array){return (item*2) });var som =numbers.some(function(item,index,array){return (item>2) });console.log(everyResult);//false console.log(filterResult);//[3,4,5,6,7,8,9] console.log(forEachResult,sum);//undefined 45console.log(mapResult);//[2,4,6,8,10,12,14,16,18,0] console.log(someResult);//true [tips] function logArray(value,index,array){ console.log(value);}[2,5,,,,,9].forEach(logArray)//2 5 9[1.5.7]归并方法(ECMAScript5):迭代数组的所有项,构建一个最终返回的值。接收两个参数:一个在每一项上调用的函数、作为归并基础的初始值(可选)。传给reduce()和reduceRight()的函数接受4个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上。因此,第一个参数是数组第一项,第二个参数是数组第二项(归并方法不会影响原数组)var sum = values.reduce(function(prev,cur,index,array){return prev+cur; }) alert(sum);//15