es6 为字符串添加了遍历器接口,使得字符串能够被 for...of 循环遍历javascript
at(), charAt() 返回字符串给定位置的字符java
'abc'.charAt(0)// 'a'
normalize() 用来将字符的不一样表示方法统一为一样的样式,这称为 Unicode 正规化;es6
es5 只有 indexOf() 来肯定一个字符串是否包含在另外一个字符串中,es6 又提供了三种新方法:编程
第二个参数表示开始搜索的位置;json
let s = 'hello world'; s.startsWith('world',6);// true s.endWith('hello', 5);// true
repeat() 返回一个新字符串,表示将原字符串重复 n 次;数组
'x'.repeat(3) // 'xxx'
padStart(), padEnd(), 字符串补全功能;若是两个字符串不够制定长度,会在头部或尾部补全。数据结构
'x'.padStart(5,'ab');
常见用途是为数值补全指定位数和提示字符串格式app
'1'.padStart(5,'0')//'00001' '09-12'.padStart(10,'YYYY-MM-DD')// YYYY-09-12
模板字符串:加强版的字符串,用反引号 `` 标识;它能够用来在字符串中嵌入变量或定义多行字符串;函数式编程
模板字符串中还能调用函数:函数
function fn() {} `foo ${fn()} bar`
Number.isFinite() 用来检查一个数值是否为有限的;
Number.isNaN() 用来检查一个值是不是NaN;
Number.parseInt(), Number.parseFloat()
Math.trunc() 用于去除一个数的小数,只保留整数部分;
Math.sign() 用来判断一个数是正负仍是0
Math.cbrt() 用于计算一个数的立方根
Math.clz32() 返回一个数的32位无符号整数形式有多少个前导0;
Math.fround() 返回会一个数的单精度浮点数形式;
Math.hypot() 返回会全部参数的平方和的平方根
新增指数运算符** ; 2 **2 = 4 与 Math.pow()差很少
函数的 length 属性,将返回没有指定默认值的参数个数,即指定了默认值后,length 属性将失真;
rest 参数:用于获取函数的多余参数,这样就不用 arguments 对象了;
function add(...values) { for(var val of values) { sum += val; } return sum; } add(2.5.3);// 10
函数的 name 属性,返回会该函数的函数名
箭头函数: 若是箭头函数不须要参数或须要多个参数,就使用一个()表明参数部分;
箭头函数有几个使用注意点:
箭头函数可使 this 指向固定化,这种特性颇有利于封装回调函数;
var handler = { id: '123', init: function() { document.addEventListener('click', event => this.doSomething(event.type), false); }, doSomething: function(type) { console.log('handling' + type + 'for' + this.id); } };
这里 this 一直指向 handler;
this 指向的固定化,并非由于箭头函数内部有绑定 this 的机制,实际缘由是箭头函数根本没有本身的 this,致使内部的 this 就是外层代码块的this。正式由于它没有 this,因此也就不能用做构造函数;
因为箭头函数没有本身的 this,因此也不能用 call(), apply(), bind() 方法来改变 this 的指向;
尾调用:函数式编程的一个重要概念,就是指某个函数的而最后一步是调用另外一个函数;
function f(x) { return g(x); }
柯里化:意思是将多参数的函数转换程单参数的形式;
将一个数组转为用逗号分隔的参数序列,该运算符主要用于函数调用;
扩展运算符的应用:
复制数组, const a1 = [1,2]; const a2 = [...a1]
合并数组: [1, 2,...array3]
与结构复制结合:[a, ...rest] = list
将字符串转为真正的数组: [...'hello']// 'h','e','l','l','o']
实现了Iterator接口的对象:任何Iterator接口的对象,均可以用扩展运算符转为真正的数组;
Map和Set结构:扩展运算符内部调用的是数据结构的 Iterator 接口,所以只要具备 Iterator 接口的对象,均可以使用扩展运算符,好比 Map 结构;
let map = new Map([ [1,'one'], [2,'two'], [3,'three'], ]); let arr = [...map.keys()];//[1,2,3]
Array.from() 用于将两类对象转为真正的数组:相似数组的对象和可遍历的对象
Array.of() 用于将一组值,转换为数组;Array.of(3,11,8)
Array.copyWithin():在当前数组内部,将指定位置的成员复制到其它位置(会覆盖原有成员),而后返回当前数组;
[1,2,3,4,5].copyWithin(0,3) //表示将从3号为直到数组结束的成员(4,5), //复制从0号位开始的位置,结果覆盖了原来的1和2;
数组示例的find() 和 findIndex()
array.fill():用给定值,填充一个数组;['a','b','c'].fill(7,1,2);上面代码表示,fill 方法从 1 号位开始,向原数组填充 7,到 2 号位结束;
array 的 enteries(),keys(), values(),都是用于遍历数组的,enteries 是用于遍历键值对,keys 遍历索引,values() 遍历值;
array.includes():返回一个布尔值,表示某个数组是否包含给定的值;
[1,2,3].includes(2) // true
Object.assign() 用于对象的合并,将源对象的全部可枚举属性,复制到目标对象;
const target = {a:1}; const souce1 = {b:2}; Object.assign(target,souce1);
常见用途:
es6共有 5 种方法能够遍历对象的属性:
Object.keys(),Object.values(),Object.enteries()
es6 新的原始数据型,表示独一无二的值;即对象的属性名如今有两种类型,一种是原来的数据类型,一种是 symbol,凡是 symbol 类型的,就是独一无二的,能够保证不会与其余属性名产生冲突。
Set 是 es6 提供的新的数据结构,相似于数组,可是成员的值为惟一的,没有重复的值。可用来进行数组去重。
const set = new Set([1,2,2,4,3]); console.log([...set]);//[1,2,4,3]
去除数组重复成员的方法:[...new Set(array)];
在 Set 内部,NaN 是相等的,5 和'5'是不等的;
上面说到 Array.from() 能够将 Set 结构转为数组,这提供了去除数组重复成员的另外一种方法;
function deeupe(array) { return Array.from(new Set(array)); } deeupe([1,1,2,3]);// [1,2,3]
遍历操做:
Set结构的示例有四个遍历方法,能够用于遍历成员
keys():返回键名;values():返回键值;enteries():返回键值对;forEach():遍历每一个成员
set = new Set([1,4,9]); set.forEach((value,key) => {console.log(key + ':' + value)})// 1:1 4:4 9:9
数组的 map 和 filter 也能够用于 set;
let set = new Set([1,2,3]); set = new Set([...set].map(x => x*2)); // 返回Set结构{2,4,6} let a = new Set([1,2,3]) let b = new Set([4,3,2]) let union = new Set([...a,...b]) // set {1,2,3,4} let intersect = new Set(...a).filter(x = b.has(x));// 交集 let difference = new Set([...a]).filter(x => !b.has(x))// 差集
WeakSet 不能遍历,是由于成员都是弱引用,随时可能消失,遍历机制没法保证成员的存在,极可能遍历结束,成员就取不到了。
所拥有方法和遍历方法和 Set 相似;
与其余数据结构的互相转化:
(1)Map 转为数组:使用扩展运算符...
const myMap = new Map().set(true,7).set({foo,3},['abc]); [...myMap]// [[true,7],[{foo,3},'abc']]
(2) 数组转 为Map, 将数组传入 Map 构造函数,就能够转为 Map
new Map([[true,7],[{foo,3},['abc']]])
(3)Map 转为对象
function strMapObj(strMap) { let obj = Obect.create(null); for(let [k,v] of strMap) { obj[k] = v; } return obj; } const myMap = new Map().set('yes', true).set('no', false); strMapObj(myMap);
(4)Map 转为 Json,返回值使用 Json.stringify(),—> Map的键名都是字符串时,可将对象转为 JSON;
分为两种状况:一种是 Ma p的键名都是字符串,这时选择转为对象 JSON:
function strMapToJson(sttrMap) { return JSON.stringify(strMaoToObj(strMap)); } let myMap = new Map().set('yes',true).set('no',false); strMaptoJson(myMap)// '{'yes':true,'no': false}'
另外一种是 Map 的键名有非字符串,这时能够选择转为数组 JSON
function mapToArrayJson(map) { return JSON.stringify([...map]); } let myMap = new Map().set(true,7).set({foo,3},['abc']); mapToArrayJson(myMap)// '[[true,7],[{'foo':3},['abc']]]'
(5)Json转为Map,json.parse()