Skip to content

Instantly share code, notes, and snippets.

@hjzheng
Last active March 14, 2016 09:00
Show Gist options
  • Save hjzheng/bb6a83ca2fd68a584698 to your computer and use it in GitHub Desktop.
Save hjzheng/bb6a83ca2fd68a584698 to your computer and use it in GitHub Desktop.

数组

创建数组的方式

  • 字面量方式
  • Array类方式

注意一下数组创建产生的结果:

var count = [1,,3]; //数组有3个元素,中间的元素值是undefined 这个书上描述是错误的,中间元素,是一个空的位置
var undefs = [,,]; //数组有2个元素,都是undefined 原因:数组字面量的语法允许有可选的结尾逗号 书上描述是错误的 是两个空位置
var a = new Array(3); 

//用来预先分配一个数组空间.注意,数组中没有存储值,甚至索引的属性0 和 1 都未定义
//在chrome dev tools下通过 1 in a 验证,返回false 说明只分配了空间,没有定义索引
//同样的count 和 undefs两个数组中未显示定义的元素,依然没有定义索引, 只分配空间

0 in undefs; //false
1 in count; //false

//除非显示定义
var newCount = [1, undefined, 3];
1 in newCount; // true

//还有一种Case, 删除,数组的该索引和它的值都被删除掉了,但是length 没有变化
var delArr = [1,2,3];
delete delArr[1];
delArr[1];
1 in delArr; //false
delArr;

总结: 数组在定义中会存在以下情况, 尤其使用字面量方式定义时,为显示定义元素,只分配空间 和 使用构造函数定义时,只传一个数字参数情况一样。

数组元素的读和写

数组也是对象,数组在使用非负整数作为属性名时,数组会自动维护length 以下情况也会按索引处理

a[1.000] //和a[1]一样
a["1000"] //length会变成1001

稀疏数组

稀疏数组是包含从0开始的不连续索引的数组。通常,数组的length属性值代表数组中的元素个数

创建稀疏数组的方式

//第一种方式
var a = new Array(5);
//第二种方式
a = [];a[1000] = 1;
//第三种方式
//可以通过delete方式
a = [1,2,3];
delete a[1];

数组的长度

我们可以利用数组的length属性去创建稀疏元素或者删除数组末尾的元素

var a = [1,2,3,4];
a.length = 100; 
a.length = 0; //a变成一个[]

数组元素的添加和删除

  • 添加方式

    • 直接赋值 例如 a[2] = 1
    • 使用push unshift方法
  • 删除

    • 使用delete运算符
    • 使用pop shit slice方法
  • splice 添加删除替换都有

数组遍历

Object.keys方法

Object.keys([,,,]) //返回 [],该方法会过滤掉不存在的元素

for循环,将长度存放在一个变量里

for(var i=0, len=arr.length; i<len; i++){
}

for(var i=0, len=arr.length; i<len; i++){
  if(!a[i]) continue; //跳过不存在 undefined 和 null
}

for(var i=0, len=arr.length; i<len; i++){
  if(a[i] === undefined) continue; //跳过不存在的元素和undefined
}

for(var i=0, len=arr.length; i<len; i++){
  if(!(i in a)) continue; //跳过不存在的元素
}

ES5 forEach

多维数组

数组方法

join方法 将数组中所有的元素都转化成字符串并连接在一起,返回生成的字符串,可以指定一个连接符,默认是,

var a = [1,2,3];
a.join(); //"1,2,3"
a.join(""); //"123"
a.join("-");// 1-2-3
var b = new Array(5);
b.join("-");//-----

join方法是String的split方法的逆向操作

reverse()方法将数组中的元素颠倒顺序,返回逆序数组,它会改变原来的数组

var a = [1,2,3];
a.reverse().join() //"3,2,1" a现在等于 [3,2,1]

sort()方法 将数组中的元素排序并返回排序后的数组,它会改变原来的数组。 当不带参数调用sort的时候,数组会以字母顺序排序(如有必要会转化成字符串进行比较)

var a = new Array('banana', "cherry", "apple");
a.sort() //["apple", "banana", "cherry"];
//不区分大小写的排序
var a = ['ant', 'Bug', 'cat', 'Dog'];
a.sort(); //区分大小写
a.sort(function(s, t){
  var x = s.toLowerCase();
  var y = t.toLowerCase();
  if(x > y) return 1;
  if(x < y) return -1;
  return 0;
});

concat 方法 创建并返回一个新数组,它不会修改原数组 它会扁平数组,但不会递归扁平。

var a = [1,2];
a.concat(4,5); //[1,2,4,5]
a.concat([4,5]); //[1,2,4,5]
a.concat([4,5],[6,7]); //[1,2,4,5,6,7]
a.concat(4, [5,[6,7]]); //[1,2,4,5,[6,7]]

slice 方法 返回指定数组的一个片段或子数组 slice不会改变原数组 两个参数 片段的开始和结束 返回数组包含第一个参数指定的位置和所有但不包含第二个参数指定的位置之间的所有数组元素

var a = [1,2,3,4,5];
a.slice(0,3); //[1,2,3]
a.slice(3); //返回 [4, 5]
a.slice(1, -1); //返回 [2, 3, 4] 

splice() 插入删除和替换的通用方法,会改变原数组

//语法
//arrayObject.splice(index,howmany,item1,.....,itemX)
//index	必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
//howmany	必需。要删除的项目数量。如果设置为 0,则不会删除项目。
//item1, ..., itemX	可选。向数组添加的新项目。

var a = [1,2,,4,5];
a.splice(1, 2); //a 变成 [1, 4, 5]

a = [1,2,,4,5];
a.splice(1, 2, "*"); //a 变成 [1, "*", 4, 5]

push pop shift 和 unshift

ES5 中数组方法

forEach方法 遍历数组

var data = [1,2,3,4];
data.forEach(function(value, i, arr){
  console.log(value);
})

map方法

var a = [1, 2, 3];
var b = a.map(function(x){
  return x*x;
}); //b是[1, 4, 9]

filter方法

  var a = [5, 4, 3];
  var small = a.filter(function(x){ return x < 3;});
  
  //利用filter 干掉稀疏数组不存在元素
  var b = [1,,,,2,,,5];
  var f = b.filter(function(x){return true;}); //f是 [1, 2, 5]

every() and some() 注意一旦 every 或 some确认到返回什么值时,它们就会停止遍历数组元素

var a = [1,2,3,4];
a.every(function(x){return x>3}); //false
a.some(function(x){return x>3}); //true

reduce and reduceRight

indexOf and lastIndexOf

数组类型

Array.isArray([])//true
Array.isArray({})//false

//P161 代码错误,重新纠正
var isArray = Array.isArray || function(o){
  return typeof o === "object" && Object.prototype.toString.call(o) === "[object Array]";
};

Array-like Object

像 arguments 和 document.getElementByTagName() 返回值 都是Array-like对象。

作为数组的字符串

字符串是不可变的,因此把它们当做字符串看的时候,它们是只读的,一些改变数组本身的方法(sort splice)是不可以使用的

var s = "Angular";
Array.prototype.join.call(s, "-"); //A-n-g-u-l-a-r
Array.prototype.filter.call(s, function(){
  return x > 109;
}).join("");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment