数组 (属于对象)---其能够实现的功能都是由函数方法写的
1、定义:<1>可以记录一组数据 <2>编号从零开始
1. var array = [1,2,3]; /*变量声明式定义*/
2. var array=new Array(1,2,3); /*对象的形式来定义*/
3. var array=[]; array[0] =1; array["name"] ="王五"; /*参数定义法*/
第1、2种定义方式有区别 方法2效率高 原因:第1种方法是先检测类型 帮助我们创建new Array(1,2,3)对象;
数组是隶属于Object类型对象 如果不new先检测 然后自动帮助我们创建数组对象
string为基本类型 string类型 所以 它只检测 不过不创建String对象
2、Delete Push Unshift三个属性的功能
1.delete arry[0]; 稀疏数组 中间开头 数组中可能存在没有值 或者为null的情况
2.arry.push(); 往数组的末尾添加元素
3.arry.unshift(); 往数组的开头添加元素
4.arry.length -= 1; 第二种删除方式 删除最后一个数组值
3、 输出数组:
1. for循环输出数组
<1>for(var i=0;i<n;i++){ console.log(arr[i]); }
<2>for(var i in Array){ console.log(arr[i]); }
<3>简单的for循环只能循环出来 数组里面的值 包含稀疏数组 但循环不出对象属性
for...in 循环能够循环出来对象属性 可循环不出来稀疏数组
4、Prototype 就是指在 原型链 上存在的 对象属性
1. 给指定数组直接添加对象属性 var array = {}; array.prototype.x = type;(type可以是数字 也可以是字符串)
2. 直接给数组添加方法 Array.prototype.name = function name(){};
数组也是由一个个方法组合而成,利用prototype可以自己组建想要方法来 规定 数组 的功能
5、数组的浅度拷贝 和 深度拷贝------- 栈===>>堆
1. 如果要对象不能相互影响,那么不能用等号 因为会指向同一个堆,导致改变一个的同时会影响另一个
<1> 如果数组想要解决这个问题 加一个concat可以解决
数组1 = 数组2.concat();
<2> 如果对象想要解决这个问题 因为对象没有concat属性 那么我们通过Object.assign来重新创建一个对象
var arry = Object.assign([],hero) ----- 拷贝数组
var arry = Object.assign({},hero) ----- 拷贝对象
6、稀疏数组
1. 稀疏数组 真实存在的值 要比索引值小
[empty,5,empty]
2. 当创建组的时候 给出一个参数 那么 就是说 目前数组长度为5
var new_arry=new Array(5);
3. 通过in参数 可以来判断 这个索引 是否有值
console.log(5 in new_arry);
7、二维数组:var db_arry = new Array(1,2,3,new Array(1,2,3));
调用:db_arry[3][1];一般由双重for循环
8、数组的方法
//join 将一个数组转换为字符串
var arry = [1,2,3,4]; console.log(arry); var str = arry.join(); console.log(str);
//eval 把一个字符串转换为数组
var arry = "[1,2,3,4]";
console.log(arry[0]); //报错
console.log(eval(arry)[0]);
//concat 拼接数组 不会改变原数组
var ay1=[1,2,3];
var new_a = ay1.concat[[3,4,5],[7,9,8]];
console.log(new_a);
//reverse 反转 会改变原数组
var a = [1,2,3];
console.log(a.reverse());
console.log(a);
//sort 排序 默认是从小到大来进行排序 会改变原数组
var b = [4,5,2,3,1];
console.log(b.sort());
console.log(b);
//如何从大到小排序
1.方法里面会有两个参数a ,b a代表后面的数,b代表前面的数 a-b>0 升序、a-b<0 降序 改变原数组
2. 如果数组中含有汉字或者字母 按照 阿斯克码表排序
b.sort( function(a,b){ return a-b<0; } )
//slice 切片里面接的索引值 (开始索引值,结尾索引值) 不会改变原数组
var ay=[1,2,3,4,5,6,7,8,9,10]; var y=ay.slice(5); //从第五个开始往后 console.log(ay.slice(6,9); // [6,9) console.log(ay.slice(-1); console.log(y.slice(-3,3); // 无交集 切出来为null
//获取第一个元素和最后一个元素
console.log(y.slice(0,1);
console.log(y.slice(-1);
//splice 高级数组功能 对数组进行增、删 改变原始数组
1.如果splice给出一个参数 那么就能 获取数组中 从0到指定索引值内的数组
2.如果splice给出两个参数 那么就相当于将指定位置切除(索引开始,数量)
3.如果splice给出三个参数 将第一参数到第二参数的数组值 替换成 第三个参数
[索引开始,索引闭合] 皆闭合
var ay=[1,2,3,4,5,6,8,7]; ay.splice(5); //从0到指定索引值内的数组 ay.splice(1,2); //那么就相当于将指定位置切除 ay.splice(1,2,"a"); //将第一参数到第二参数的数组值 替换成 第三个参数 ay.splice(0,1); //截取出去第一个元素 ay.splice(0,1,100); //截取出去第一个元素,并替换为100 ay.splice(-5); //从0到-5对应的值的数组 console.log(ay); //原数组改变后的 var aty= ay.splice(1,2,"a","b"); //将第一参数到第二参数的数组值 替换成 第三个参数 console.log(aty); //改变的值
1、为什么字符串创建时,不需要new String;而一般 数组创建的时候需要new Array();?
因为数组是隶属于Object类型对象 如果不new先检测 然后自动帮助我们创建数组对象
不顾string为基本类型 string类型 所以 他只检测 不过不创建String对象
一般 数组new的过程 是提高效率的过程
字符串类型转化为 "字符串对象"的情况 可以使用new String;
2、begin = begin || 0; 如果begin未赋值,则begin为0;
3、对象冻结:this在函数中可以调用 但不能赋值