Array是什么?

Array是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组。

var arr = new Array(2);
arr.length // 2
arr // [ empty x 2 ]

上面代码中,Array()构造函数的参数2,表示生成一个两个成员的数组,每个位置都是空值。

如果没有使用new关键字,运行结果也是一样的。

var arr = Array(2);
// 等同于
var arr = new Array(2);

考虑到语义性,以及与其他构造函数用法保持一致,建议总是加上new

Array()构造函数有一个很大的缺陷,不同的参数个数会导致不一致的行为。

// 无参数时,返回一个空数组
new Array() // []// 单个正整数参数,表示返回的新数组的长度
new Array(1) // [ empty ]
new Array(2) // [ empty x 2 ]// 非正整数的数值作为参数,会报错
new Array(3.2) // RangeError: Invalid array length
new Array(-3) // RangeError: Invalid array length// 单个非数值(比如字符串、布尔值、对象等)作为参数,
// 则该参数是返回的新数组的成员
new Array('abc') // ['abc']
new Array([1]) // [Array[1]]// 多参数时,所有参数都是返回的新数组的成员
new Array(1, 2) // [1, 2]
new Array('a', 'b', 'c') // ['a', 'b', 'c']

可以看到,Array()作为构造函数,行为很不一致。因此,不建议使用它生成新数组,直接使用数组字面量是更好的做法。

// bad
var arr = new Array(1, 2);// good
var arr = [1, 2];

注意,如果参数是一个正整数,返回数组的成员都是空位。虽然读取的时候返回undefined,但实际上该位置没有任何值。虽然这时可以读取到length属性,但是取不到键名。

var a = new Array(3);
var b = [undefined, undefined, undefined];a.length // 3
b.length // 3a[0] // undefined
b[0] // undefined0 in a // false
0 in b // true

上面代码中,aArray()生成的一个长度为3的空数组,b是一个三个成员都是undefined的数组,这两个数组是不一样的。读取键值的时候,ab都返回undefined,但是a的键名(成员的序号)都是空的,b的键名是有值的。


Array的静态方法

Array.isArray()

Array.isArray方法返回一个布尔值,表示参数是否为数组。它可以弥补typeof运算符的不足。

var arr = [1, 2, 3];typeof arr // "object"
Array.isArray(arr) // true

上面代码中,typeof运算符只能显示数组的类型是Object,而Array.isArray方法可以识别数组。


Array的实例方法

valueOf(),toString()

valueOf方法是一个所有对象都拥有的方法,表示对该对象求值。不同对象的valueOf方法不尽一致,数组的valueOf方法返回数组本身。

var arr = [1, 2, 3];
arr.valueOf() // [1, 2, 3]

toString方法也是对象的通用方法,数组的toString方法返回数组的字符串形式。

var arr = [1, 2, 3];
arr.toString() // "1,2,3"var arr = [1, 2, 3, [4, 5, 6]];
arr.toString() // "1,2,3,4,5,6"

push(),pop()

push方法用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度。注意,该方法会改变原数组。

var arr = [];arr.push(1) // 1
arr.push('a') // 2
arr.push(true, {}) // 4
arr // [1, 'a', true, {}]

上面代码使用push方法,往数组中添加了四个成员。

pop方法用于删除数组的最后一个元素,并返回该元素。注意,该方法会改变原数组。

var arr = ['a', 'b', 'c'];arr.pop() // 'c'
arr // ['a', 'b']

对空数组使用pop方法,不会报错,而是返回undefined

[].pop() // undefined

pushpop结合使用,就构成了“后进先出”的栈结构(stack)。

var arr = [];
arr.push(1, 2);
arr.push(3);
arr.pop();
arr // [1, 2]

上面代码中,3是最后进入数组的,但是最早离开数组。

shift(),unshift()

shift()方法用于删除数组的第一个元素,并返回该元素。注意,该方法会改变原数组。

var a = ['a', 'b', 'c'];a.shift() // 'a'
a // ['b', 'c']

上面代码中,使用shift()方法以后,原数组就变了。

shift()方法可以遍历并清空一个数组。

var list = [1, 2, 3, 4];
var item;while (item = list.shift()) {console.log(item);
}list // []

上面代码通过list.shift()方法每次取出一个元素,从而遍历数组。它的前提是数组元素不能是0或任何布尔值等于false的元素,因此这样的遍历不是很可靠。

push()shift()结合使用,就构成了“先进先出”的队列结构(queue)。

unshift()方法用于在数组的第一个位置添加元素,并返回添加新元素后的数组长度。注意,该方法会改变原数组。

var a = ['a', 'b', 'c'];a.unshift('x'); // 4
a // ['x', 'a', 'b', 'c']

unshift()方法可以接受多个参数,这些参数都会添加到目标数组头部。

var arr = [ 'c', 'd' ];
arr.unshift('a', 'b') // 4
arr // [ 'a', 'b', 'c', 'd' ]

join()

join()方法以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔。

var a = [1, 2, 3, 4];a.join(' ') // '1 2 3 4'
a.join(' | ') // "1 | 2 | 3 | 4"
a.join() // "1,2,3,4"

如果数组成员是undefinednull或空位,会被转成空字符串。

[undefined, null].join('#')
// '#'['a',, 'b'].join('-')
// 'a--b'

通过call方法,这个方法也可以用于字符串或类似数组的对象。

Array.prototype.join.call('hello', '-')
// "h-e-l-l-o"var obj = { 0: 'a', 1: 'b', length: 2 };
Array.prototype.join.call(obj, '-')
// 'a-b'

concat()

concat方法用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。

['hello'].concat(['world'])
// ["hello", "world"]['hello'].concat(['world'], ['!'])
// ["hello", "world", "!"][].concat({a: 1}, {b: 2})
// [{ a: 1 }, { b: 2 }][2].concat({a: 1})
// [2, {a: 1}]

除了数组作为参数,concat也接受其他类型的值作为参数,添加到目标数组尾部。

[1, 2, 3].concat(4, 5, 6)
// [1, 2, 3, 4, 5, 6]

如果数组成员包括对象,concat方法返回当前数组的一个浅拷贝。所谓“浅拷贝”,指的是新数组拷贝的是对象的引用。

var obj = { a: 1 };
var oldArray = [obj];var newArray = oldArray.concat();obj.a = 2;
newArray[0].a // 2

上面代码中,原数组包含一个对象,concat方法生成的新数组包含这个对象的引用。所以,改变原对象以后,新数组跟着改变。

reverse()

reverse方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组。

var a = ['a', 'b', 'c'];a.reverse() // ["c", "b", "a"]
a // ["c", "b", "a"]

JS的Array对象解析相关推荐

  1. Js中Array对象

    Js中Array对象 JavaScript的Array对象是用于构造数组的全局对象,数组是类似于列表的高阶对象. 描述 在JavaScript中通常可以使用Array构造器与字面量的方式创建数组. c ...

  2. JS基础-Array对象手册

    2019独角兽企业重金招聘Python工程师标准>>> Array 对象属性 属性 描述 constructor 返回对创建此对象的数组函数的引用. length 设置或返回数组中元 ...

  3. js中Array对象。concat,concat,pop,push,reserve,shift,slice,splice,toString,toLocaleString,unshift

    Array对象(arr代码中表示Array创建的实例对象) 创建方式: 1.new Array(); 2.new Array(size);3.new Array(eg01,eg2.eg3.....); ...

  4. 前端:JS/23/JS内置对象(String对象,Array对象,Date对象,Boolean对象,Number对象,Math对象),实例:求圆的面积,求直角三角形

    JS内置对象 1,String对象 字符串对象,提供了对字符串进行操作的属性和方法 2,Array对象 数组对象,提供了数组操作方面的属性和方法 3,Date对象 日期时间对象,可以获取系统的日期时间 ...

  5. JS中生成和解析JSON

    1.JS中生成JSON对象的方法: var json = []; var row1 = {}; row1.id= "1"; row1.name = "jyy"; ...

  6. JavaScript – 6.JS面向对象基础(*) + 7.Array对象 + 8.JS中的Dictionary + 9.数组、for及其他...

    6.JS面向对象基础(*) 7.Array对象 7.1 练习:求一个数组中的最大值.定义成函数. 7.2 练习:将一个字符串数组输出为|分割的形式,比如"刘在石|金钟国|李光洙|HAHA|宋 ...

  7. JS中集合对象(Array、Map、Set)及类数组对象的使用与对比

    JS中集合对象(Array.Map.Set)及类数组对象的使用与对比 在使用js编程的时候,常常会用到集合对象,集合对象其实是一种泛型,在js中没有明确的规定其内元素的类型,但在强类型语言譬如Java ...

  8. JS中的函数,Array对象,for-in语句,with语句,自定义对象,Prototype

    一)函数 A)JS中的函数的定义格式: function add(a,b) { var sum = a+b; document.write("两个数的和是:" + sum); // ...

  9. js array 对象

    Javascript 对象: Array 对象:数组 创建方法: 1, var a = new Array() 2,var a = new Array(3) 3,var a = new Array(& ...

最新文章

  1. s3c2440移植MQTT
  2. 上下文 及 执行上下文
  3. Binder机制(一)
  4. 一文解决new/delete与malloc/free相关问题:区别?注意事项?使用方式?
  5. 爬虫解析利器PyQuery详解及使用实践
  6. 《Python从小白到大牛》简介
  7. java中int转成String位数不足前面补零 java格式化2位数不足补零
  8. Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作
  9. 2 如何设置窗口title_如何设置华为4G路由2的WiFi黑白名单【设置方法】
  10. 华为云云容器快速搭建网站实践随记—利用公有镜像搭建WordPress
  11. 设计Whats App
  12. Linux shell 根据时间批量删除指定文件夹下的文件
  13. python day - 19 抽象类 接口类 多态 封装
  14. win8:添加WinJS控件
  15. 力扣-剑指offer所有题
  16. 海康网络摄像机与电脑交互,有网络和无网络两种方式读取URL视频流,以及无网络情况下配置IP地址
  17. bamboo 启动报错,无法正常访问
  18. android.graphics.bitmap jar,Android入门之画图详解
  19. 传统行业+互联网思维
  20. 成就你一生的100个哲理71-80

热门文章

  1. 单词背诵 500 个考过二十次以上词汇
  2. vue中网页图标favicon.ico不显示
  3. kali系统arp介绍(断网嗅探密码抓包)
  4. PHP的self和static区别
  5. 今日教学:怎么才能畅玩所有手游体验服?教你最简单的方法
  6. Java岗的网易/华为/美团/滴滴社招面试经历
  7. Android 系统(52)---O1关机闹钟
  8. Windows服务器补丁列表及介绍_Windows server 2012 R2 部署WSUS补丁服务
  9. 对单用户计算机来说在,(电大网考计算机自检自测2.doc
  10. 被薅羊毛损失45万元 App平台该如何避免刷单