A.字符串
1.字符串是不可变的,如果对字符串的某个索引赋值,不会有报错,但字符串不会改变;以下这些方法本身不会改变原有字符串的内容,而是返回一个新字符串:
2.toUpperCase()把一个字符串全部变为大写;
3.toLowerCase()把一个字符串全部变为小写;
4.indexOf()会搜索指定字符串出现的位置;
5.substring(start,end)返回指定索引区间的子串,end可以省略(默认到字符串结束)
B.数组
arr=['A','B','C','D']
1.arr.length; 显示数组arr的长度。若重新定义arr.length 则arr长度发生改变:
例:arr.length=6 则arr=['A','B','C','D',undefined,undefined],
arr.length=2 则arr=['A','B']
即大于当前数组长度时,多出的元素值为undefined;小于当前数组长度时,相当于删除操作。
2.与字符串不同,数组可以通过坐标索引,在原数组的基础上进行修改:
例:arr[1]='b'; 则arr=['A','b','C','D']
如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化:
例:arr[6]='G' 则arr=['A','B','C','D',undefined,undefined,'G']
*大多数其他编程语言不允许直接改变数组的大小,越界访问索引会报错。然而,JavaScript的Array却不会有任何错误(但不建议使用)
3.indexOf()函数,查找指定元素的下标索引,找到返回下标,没找到返回-1
例:arr.indexOf('B') 返回1
arr.indexOf('K') 返回-1,没找到元素位置,返回值为-1
4.slice()切割数组函数,截取数组的一部分,返回一个新的数组:
例:var a1=arr.slice(0, 2) 则a1=['A','B'] 截取数组下标从0-2,但不包括下标2
var a2=arr.slice() 则a2=['A','B','C','D'] 不写任何参数相当于copy原数组
var a3=arr.slice(2) 则a3=['C','D'] 从下标2处开始截取,直到数组结束
5.push()向Array的末尾添加若干元素
例:arr.push('E','F') 则arr=['A','B','C','D','E','F']
6.pop()把Array的最后一个元素删除掉
例:arr.pop() 则arr=['A','B','C']
空数组继续pop不会报错,而是返回undefined
7.unshift()函数,向Array的头部添加若干元素
例:arr.unshift('E','F') 则arr=['E','F','A','B','C','D']
8.shift()方法则把Array的第一个元素删掉
例:arr.shift() 则arr=['B','C','D']
空数组继续shift不会报错,而是返回undefined
9.sort()可以对当前Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序
10.reverse()反转函数,倒序
11.splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素,该返回值为数组包含被删除元素
例:arr=['A','B','C','D']
// 从索引1开始删除3个元素,然后再添加两个元素:
arr.splice(1, 3, 'Google', 'Facebook') 则arr=['A', 'Google', 'Facebook'],方法返回值['B','C','D']
//从索引2开始删除2个元素 只删除,不添加:
arr.splice(2, 2) 则arr=['A','B'],方法返回值['C','D']
// 只添加,不删除:
arr.splice(2, 0, 'Google', 'Facebook') 则arr=['A','B','C','Facebook', 'Oracle','D'],方法返回值[],因为没有删除任何元素
12.concat()方法把当前的Array和另一个Array连接起来(该方法并没有修改当前Array,而是返回了一个新的Array)
例:var added = arr.concat([1, 2, 3]); 则added=['A','B','C','D',1, 2, 3]
concat()方法可以接收任意个元素和Array,并且自动把Array拆开,然后全部添加到新的Array里
例:var added=arr.concat(1, 2, [3, 4]); 则added=['A','B','C','D',1, 2, 3,4]
13.join()把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串
例:str=arr.join('-') 则str='A-B-C-D'
C.对象
1.访问不存在的属性不报错,返回undefined
2.访问xiaohong的name属性,一般使用xiaohong.name,也可用xiaohong['name']
3.判断一个对象是否包括某个属性,属性名 in 对象名,若返回值为true则包括,false则不包括
例:var result='name' in xiaoming 若result=true,包括;result=false ,不包括
这种方法判断的属性不一定是该对象自身的,也可能是他继承的
4.过滤掉对象继承的属性,判断自身是否包含该属性,用hasOwnProperty()
例:xiaoming.hasOwnProperty('name') true则存在,false则不包括
D.循环
1.for ... in对Array的循环得到的是String而不是Number. for(var key in arr)
2.do { ... } while()循环要小心,循环体会至少执行1次,而for和while循环则可能一次都不执行
E.Map(新增数据类型)
1.Map一种键值对结构,结构上类似于二维数组,作用上和Python的字典类似,一个key对应一个value
2.可以在初始化时为Map赋值
例:var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
3.也可先定义一个空的Map,后面再填值
例:var m = new Map();
4.Map的主要方法:
(1)添加新的key-value ,多次对一个key放入value,后面的值会把前面的值冲掉
m.set('Adam', 67);
(2)判断是否存在某个key值,返回布尔值
m.has('Adam');
(3)获取某个key值对应的键值,若不存在该key值,返回undefined
m.get('Adam');
(4)删除某个key值对应的键值对
m.delete('Adam');
F.Set(新增数据类型)
1.一组key的集合,但不存储value。由于key不能重复,在Set中,没有重复的key。功能相当于自带重复判断的数组
2.定义Set
例:var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
重复元素在Set中自动被过滤:
var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}
3.Set的主要方法:
(1)添加key值
s.add(4);
(2)删除key值
s.delete(4);
G.iterable(新增)
1.遍历Array可以采用下标循环,遍历Map和Set无法使用下标。
为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。
2.具有iterable类型的集合可以通过新的for ... of循环来遍历
例:
var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a) { // 遍历Array
console.log(x);
}
for (var x of s) { // 遍历Set
console.log(x);
}
for (var x of m) { // 遍历Map
console.log(x[0] + '=' + x[1]);
}
3.for ... of循环和for ... in循环有何区别?
for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。
当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果:
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
console.log(x); // '0', '1', '2', 'name'
}
for ... in循环将把name包括在内,但Array的length属性却不包括在内。for ... of循环则完全修复了这些问题,它只循环集合本身的元素:
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a) {
console.log(x); // 'A', 'B', 'C'
}
这就是为什么要引入新的for ... of循环。
参考自廖雪峰老师的官方网站