注意:
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的数
findIndex() //返回**第一个**满足「指定条件返回true」的元素的索引

fill( )实例方法: 把数组进行填充,它接收三个参数,第一个参数是填充的变量,第二个是开始填充的位置,第三个是截至位置

entries( )实例方法:
 Array.of(value1, value2, value3)  **作用**:多个值转换成数组
 Array.from()  单个对象转为数组;
 
判断是否为数组: 布尔值 = Array.isArray(被检测的值) ;
判断数组是否空:  
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()相当于||。
 
every()、filter()、forEach()支持IE8以上
、map()、some()

PS:这几个方法**不会修改原数组**
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()`:使用回调函数遍历每个成员。
**WeakSet**: WeakSet 结构与 Set 类似,也是不重复的值的集合。                             
但是,它与 Set 有两个区别。                        
首先, WeakSet/(weakmap) 的成员只能是对象,而不能是其他类型的值。                                
其次, WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,
也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
这个特点意味着,无法引用 WeakSet 的成员,因此 WeakSet 是不可遍历的。
操作方法:               
WeakSet.prototype.add(value) :向 WeakSet 实例添加一个新成员。              
WeakSet.prototype.delete(value) :清除 WeakSet 实例的指定成员。                    
WeakSet.prototype.has(value) :返回一个布尔值,表示某个值是否在 WeakSet 实例之中。   

 

symbol 全局标记声明,
  声明方式:使用全局Symbol('描述')函数
  对象key可以是字符串或者 Symbol类型   
  不能转str,num,可以转布尔值,