1、数组
1.1 基本认识
定义数组可以使用关键词 new 来创建数组对象:
var mycars=new Array();
var mycars=new Array("Saab","Volvo","BMW");
2
1
var mycars=new Array();
2
var mycars=new Array("Saab","Volvo","BMW");
也可以直接赋值的方式(如下),另外,Java中的数组在固定了长度以后就不可以改变,但是在JS中的数组长度是可以改变的,直接给Array的length赋值就会导致数组大小的变化:
var arr = [1,2 ,3];
arr.length; //3
arr.length = 6;
arr; // [1, 2, 3, undefined, undefined, undefined]
arr.length = 2;
arr; // [1, 2]
6
1
var arr = [1,2 ,3];
2
arr.length; //3
3
arr.length = 6;
4
arr; // [1, 2, 3, undefined, undefined, undefined]
5
arr.length = 2;
6
arr; // [1, 2]
和Java数组类似的是,JS中的Array也是通过索引访问元素,并且可以赋新值,但是更灵活的是,如果通过索引给Array赋值,索引超出了范围,同样会引起Array大小的变化,这和Java中会报越界异常是不同的。
Array的多维数组和Java类似,元素中又是另外的Array则可形成多维数组,取值也是通过类似 arr[1][2] //取数组中索引1元素(数组)的索引2的元素。
JS中的数组类型的变量可以直接使用各种方法,Java中的数组是需要另外一个叫做Arrays的类提供静态方法来操作。
1.2 常用方法
Array的常用方法:
- indexOf()
- 搜索一个指定元素的位置,没找到返回 -1 // arr.indexOf('30'); 返回字符串'30'的索引
- slice()
- 截取部分Array元素返回新的Array //arr.slice(0, 3); 返回从索引开始(包含)到索引3(不包含)结束的元素新数组
- 如果不传递参数,会从头到尾截取所有元素,我们可以利用这一点进行数组的 “复制”
- push()
- 在Array末尾添加若干新元素 //arr.push('A', 'B');
- pop()
- 在Array最后一个元素删除 //arr.pop();
- unshift()
- 在Array头部添加若干元素 //arr.unshift('A', 'B');
- shift()
- 把Array第一个元素删掉 //arr.shift();
- sort()
- 对Array排序,直接调用,按默认顺序排序 // var arr = ['B', 'C', 'A']; arr.sort(); arr -- > ['A', 'B', 'C']
- reverse()
- 把整个Array元素调转方向
- splice(start, amount, valA, valB ...)
- 修改Array的万能方法,可以从指定索引(start)开始删除若干(amount)元素,然后再从该位置添加若干元素(valA、valB...)
- e.g. 从索引2开始删除3个元素,然后再添加两个元素 --> arr.splice(2, 3, 'Google', 'Facebook');
- e.g. 从索引2开始不删除元素,添加两个元素 --> arr.splice(2, 0, 'Google', 'Facebook');
- concat()
- 连接两个Array,返回新的数组(注意,不会改变原数组,而是返回新数组) // arr.concat([1, 2, 3]);
- join()
- 把当前Array的每个元素用指定字符连起来,然后返回连接后的字符串
- e.g. var arr = ['A', 'B', 1, 2]; arr.join('-'); // 'A-B-1-2'
发散思维:
在新生欢迎会上,你已经拿到了新同学的名单,请排序后显示:欢迎XXX,XXX,XXX和XXX同学!
'use strict';
var arr = ['小明', '小红', '大军', '阿黄'];
let arrCopy = arr.slice().sort()
const last = arrCopy.pop()
const notLast = arrCopy.join(',')
alert(`欢迎${notLast}和${last}同学!`);
6
1
'use strict';
2
var arr = ['小明', '小红', '大军', '阿黄'];
3
let arrCopy = arr.slice().sort()
4
const last = arrCopy.pop()
5
const notLast = arrCopy.join(',')
6
alert(`欢迎${notLast}和${last}同学!`);
2、对象
JS中的对象是一种无序的集合数据类型,由键值对组成,是不是很熟悉?没错,根本就和Java中的Map一个样。
var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
8
1
var xiaoming = {
2
name: '小明',
3
birth: 1990,
4
school: 'No.1 Middle School',
5
height: 1.70,
6
weight: 65,
7
score: null
8
};
属性的取值可以直接通过“点”来获取,如 xiaoming.name; //小明。这种方式要求变量名必须有效,如果包含特殊字符,需要用单引号括起来,访问也只能使用 [ ' attrName ' ] 来访问。以上两种方式是等同的, xiaoming.name; // --> xiaoming['name'];
实际上,JS对象的所有属性都是字符串,即key都是字符串,但是value可以是任意数据类型(简直就是Map嘛)
访问不存在的属性也不会报错,而是返回 undefined
JS对象是动态类型,意味着你可以自由地添加或删除属性,如 xiaoming.age = 18; //新增age属性且为18
另,如果要删除属性,使用 delete objName.attrName 的方式就可以了,如 delete xiaoming.age; //xiaoming.age --> undefined
检测对象是否有某属性,使用 in 操作符,如 'name' in xiaoming; // true 。 不过要注意,in判断这个属性并不一定是你所认为的这个对象的,它完全可能是因为继承得到的,如果判断是对象自身的而不是继承得到的?使用 hasOwnProperty() // xiaoming.hasOwnProperty('name'); --> true
画外音:如何输出对象中所有属性?
var xm = {
name: '小明',
birth: 2000,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
for(var i in xm){
console.log(xm[i]);
}
x
1
var xm = {
2
name: '小明',
3
birth: 2000,
4
school: 'No.1 Middle School',
5
height: 1.70,
6
weight: 65,
7
score: null
8
};
9
10
for(var i in xm){
11
console.log(xm[i]);
12
}