注意:
str.indexOf('') 总是返回0 str.includes('') 返回true
四、数组
数组实例方法:
find( )实例方法: 需要传入一个匿名函数 返回**第一个**满足「指定条件返回true」的元素
let arr=[1,2,3,4,5,6,7,8,9];
console.log(arr.find(function(value,index,arr){
return value > 5; //return 指定条件
}))
==> 6
//查找值大于5的数
fill( )实例方法: 把数组进行填充,它接收三个参数,第一个参数是填充的变量,第二个是开始填充的位置,第三个是截至位置
entries( )实例方法:
判断数组是否空:
ES5 let arr=[,,,,,]; console.log(arr.length); //5 ES6 let arr=[,,,,,]; console.log(0 in arr); //false let arr1=['jspang','技术胖']; console.log(0 in arr1); // true
数组的遍历方法: for循环 map reduce forEach filter 回调函数参数统一为(item,index,array)形式 [参数arry作用是改变this指向为array自身]
every() 相当于&&。
some()相当于||。
、map()、some()
1. forEach()循环遍历 (value,index) 返回值为undefined
2. 过滤filter()对数组中每一项运行回调函数 返回一个新的数组 由返回为true的数组项组成
3. map() 映射 对原数组中的每一项进行加工,返回一个新的数组。 // 数组值是引用类型,会改变原数组,值类型不会改变原数组
4、reduce()归并运算 接力,return值传给下一次 参数分别是(a,b,index) 多对一映射 (遍历开始为前两个值)
reduce的机理: a就表示遍历前一项return的值,b表示这一项的值(第一次遍历时a为第一项,b为第二项。return为遍历完成后返回)
应用:
1. 求数组的最大值 var arr = [4,43,5,436,45,623,4,324,23,443,53,65,46,45,6,234,324]; var result = arr.reduce(function(a,b){ return a >= b ? a : b; }); console.log(result); //623 2. 求平均值
let arr = [2,3,5,7,8]
let res = arr.reduce((a,b,index) =>{
if (index<arr.length-1){
return a+b;
}else{
return (a+b)/arr.length;
}
});
- 调用Iterator接口场合:
解构赋值 扩展运算符 Promise.all().race() Array.from()遍历对象为数组;
遍历:for ·· of 遍历iterable类型,只循环集合本身的元素 && for...in 用来遍历对象中可枚举的属性 [遍历的时候有自己的顺序:先遍历数字属性名(按照小->大),再遍历字符串属性名(按照书写顺序)]
使用iterable
内置的forEach
方法,它接收一个函数 每次迭代就自动回调该函数。以Array
为例
内置的可迭代对象并且有默认的迭代行为:
Array Map Set String
TypedArray
函数的arguments类数组对象
NodeList对象
注意,Object不符合可迭代协议。可以通过自定义迭代器方法 或其他对象的iterator接口实现 obj.__proto__[Symbol.iterator] = iterator;//生成要迭代的对象
五、对象的改变
Map:映射 js对象的超集,
map的key可以是任何类型 还可以是 DOM 元素。可以通过 size 属性很容易地得到一个 Map 的键值对个数,而对象的键值对个数只能手动确认
初始化Map
需要一个二维数组,或者直接初始化一个空Map :
new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
Map键和内存地址绑定,两个空对象不相等。key排列按照添加顺序排列
同Set 实例的遍历方法 Map 实例的属性和方法如下: * `size`:获取成员的数量 * `set`:设置成员 key 和 value * `get`:获取成员属性值 * `has`:判断成员是否存在 * `delete`:删除成员 * `clear`:清空所有
在 Map 中新增键时,不会覆盖其原型上的键;而在 Object 中新增键时,则有可能覆盖其原型上的键:
JSON 默认支持 Object 而不支持 Map。若想要通过 JSON 传输 Map 则需要使用到 .toJSON() 方法,然后在 JSON.parse() 中传入复原函数来将其复原。
-使用 Map:
储存的键不是字符串/数字/或者 Symbol 时,选择 Map,因为 Object 并不支持
储存大量的数据时,选择 Map,因为它占用的内存更小
需要进行许多新增/删除元素的操作时,选择 Map,因为速度更快
需要保持插入时的顺序的话,选择 Map,因为 Object 会改变排序
需要迭代/遍历的话,选择 Map,因为它默认是可迭代对象,迭代更为便捷
-使用 Object:
只是简单的数据结构时,选择 Object,因为它在数据少的时候占用内存更少,且新建时更为高效
需要用到 JSON 进行文件传输时,选择 Object,因为 JSON 不默认支持 Map
需要对多个键值进行运算时,选择 Object,因为句法更为简洁
需要覆盖原型上的键时,选择 Object
Set:集合 数组拓展,
集合成员的value都是唯一的 ,set只有value keyvalue同值
初始化:new Set(具有 iterable接口的数据结构)
Set 实例的属性和方法有 * `size`:获取元素数量。 * `add(value)`:添加元素,返回 Set 实例本身。 * `delete(value)`:删除元素,返回一个布尔值,表示删除是否成功。 * `has(value)`:返回一个布尔值,表示该值是否是 Set 实例的元素。 * `clear()`:清除所有元素,没有返回值。 Set 实例的遍历接口 * `keys()`:返回键名的遍历器。 * `values()`:同上;key value相同 * `entries()`:返回键值对数组的遍历器。 键值相等 * `forEach()`:使用回调函数遍历每个成员。
symbol 全局标记声明,
声明方式:使用全局Symbol('描述')函数
对象key可以是字符串或者 Symbol类型 不能转str,num,可以转布尔值,