一、与其他语言数据的比较
二、数组创建的两种方法
三、数组的length属性
var names = ["red","green","blue"];
names.length = 4;
alert(names[3]);//undefined names.length = 2; //截断数字
alert(names[2]);//undefined names[names.length]="black";
alert(names);//red,green,blue,black names[99]="yellow";
alert(names.length);//
四、数组方法
五、数组的判别方法
5.1 JavaScript的数据类型
JavaScript共有六种数据类型,分别是:number、string、object、Boolean、null、undefined
5.2 类型判断方法
使用typeof可以判断大部分数据类型,使用方法为:
var a = "abc";
console.log(typeof a); //string var a = 123;
console.log(typeof a); //number var a = false;
console.log(typeof a); //boolean var a;
console.log(typeof a); //false var a = null;
console.log(typeof a); //object var a = document;
console.log(typeof a); //object var a = [];
console.log(typeof a); //object var a = function(){};
console.log(typeof a) //function 除了可以判断数据类型还可以判断function类型
可以发现object、null、undefined返回的都是object,而函数返回的类型是function。今天就先来看下如何判断给定数据是否是数组类型吧。
5.3 数组类型判断
(1)使用instanceof运算符判断
var arr=[];
console.log(arr instanceof Array) //返回true
(2)使用constructor判断
constructor属性是返回对创建此对象的函数的引用,举个栗子说明constructor的使用吧:
function employee(name,job,born) {
this.name=name;
this.job=job;
this.born=born;
} var bill=new employee("Bill Gates","Engineer",1985);
console.log(bill.constructor);
/* 输出结果:
function employee(name,job,born) {
this.name=name;
this.job=job;
this.born=born;
}
*/
so,使用constructor属性判断数组的使用方式就是:
console.log([].constructor == Array);
(3)使用constructor判断的增强方式
function isArray(object){
return object && typeof object==='object' &&
Array == object.constructor;
}
使用这种方式有一点是需要注意的:
使用instaceof和construcor,被判断的array必须是在当前页面声明的!比如,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个array,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor;会返回false。
原因:
a) array属于引用型数据,在传递过程中,仅仅是引用地址的传递。
b) 每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array所对应的构造函数是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array;切记,不然很难跟踪问题!
(4)最复杂的判断方式
function isArray(object){
return object && typeof object==='object' &&
typeof object.length==='number' &&
typeof object.splice==='function' &&
//判断length属性是否是可枚举的 对于数组 将得到false
!(object.propertyIsEnumerable('length'));
}
有length和splice并不一定是数组,因为可以为对象添加属性,而不能枚举length属性,才是最重要的判断因子。
大家可能对propertyIsEnumerable 方法不太熟悉,该方法是用来判断指定的属性是否可列举:
object. propertyIsEnumerable(proName)
如果 proName 存在于 object 中且可以使用一个 for…in 循环穷举出来,那么propertyIsEnumerable属性返回 true。如果 object 不具有所指定的属性或者所指定的属性不是可列举的,那么propertyIsEnumerable 属性返回 false。propertyIsEnumerable 属性不考虑原型链中的对象。
(5)最简单的判断方式
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}
var arr = [1,2,3];
console.log(isArray(arr));
六、面试常考的数组的题型
//排序算法
window.onload = function(){
var array = [0,1,2,44,4,
324,5,65,6,6,
34,4,5,6,2,
43,5,6,62,43,
5,1,4,51,56,
76,7,7,2,1,
45,4,6,7,8];
//var array = [4,2,5,1,0,3];
array = sorting.shellSort(array);
alert(array);
} var sorting = {
//利用sort方法进行排序
systemSort: function(arr){
return arr.sort(function(a,b){
return a-b;
});
}, //冒泡排序
bubbleSort: function(arr){
var len=arr.length, tmp;
for(var i=0;i<len-1;i++){
for(var j=0;j<len-1-i;j++){
if(arr[j]>arr[j+1]){
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
return arr;
}, //快速排序
quickSort: function(arr){
var low=0, high=arr.length-1;
sort(low,high);
function sort(low, high){
if(low<high){
var mid = (function(low, high){
var tmp = arr[low];
while(low<high){
while(low<high&&arr[high]>=tmp){
high--;
}
arr[low] = arr[high];
while(low<high&&arr[low]<=tmp){
low++;
}
arr[high] = arr[low];
}
arr[low] = tmp;
return low;
})(low, high);
sort(low, mid-1);
sort(mid+1,high);
}
}
return arr;
}, //插入排序
insertSort: function(arr){
var len = arr.length;
for(var i=1;i<len;i++){
var tmp = arr[i];
for(var j=i-1;j>=0;j--){
if(tmp<arr[j]){
arr[j+1] = arr[j];
}else{
arr[j+1] = tmp;
break;
}
}
}
return arr;
}, //希尔排序
shellSort: function(arr){
console.log(arr);
var h = 1;
while(h<=arr.length/3){
h = h*3+1; //O(n^(3/2))by Knuth,1973
}
for( ;h>=1;h=Math.floor(h/3)){
for(var k=0;k<h;k++){
for(var i=h+k;i<arr.length;i+=h){
for(var j=i;j>=h&&arr[j]<arr[j-h];j-=h){
var tmp = arr[j];
arr[j] = arr[j-h];
arr[j-h] = tmp;
}
}
}
}
return arr;
}
}