《深度理解es6》

1. 块级绑定
  • var变量提升
  • let禁止重复声明
  • const阻止变量绑定与变量自身值得改变
  • 同步和异步,for循环里有function,会把for执行完毕再执行function
2. 字符串与正则表达式
字符串
  • includes() 方法,在给定文本存在于字符串中的任意位置时会返回 true ,否则返回 false ;
  • startsWith() 方法,在给定文本出现在字符串起始处时返回 true ,否则返回 false ;
  • endsWith() 方法,在给定文本出现在字符串结尾处时返回 true ,否则返回 false 。
  • repeat() 方法
console.log("x".repeat(3)); // "xxx"
正则表达式
  • 添加啦u,y
var re = /ab/g; console.log(getFlags(re)); // "g"

var re = /ab/g; console.log(re.source); // "ab" console.log(re.flags); // "g"
模板字面量
  • 多行字符串:针对多行字符串的形式概念;
  • 基本的字符串格式化:将字符串部分替换为已存在的变量值的能力;
  • HTML 转义:能转换字符串以便将其安全插入到 HTML 中的能力。
3. 函数
// 函数参数默认值
function makeRequest(url, timeout = 2000, callback = function() {})
// 参数表达式
functionadd(first,second=getValue()){
	return first + second
}
// 多个形式参数合并
functioncheckArgs(...args){
}
//构造器得增强能力
var add=newFunction("first","second","returnfirst+second");
//扩展运算符
let values=[25,50,75,100]
console.log(Math.max(...values));
箭头函数
  • 没有 this 、 super 、 arguments ,也没有 new.target 绑定
  • 不能被使用 new 调用
  • 不能被使用 new 调用
  • 不能更改 this
  • 不允许重复的具名参数
创建立即调用函数表达式
let person = function(name) { return { getName: function() { return name; } }; }("Nicholas");
4. 扩展的对象功能
var person = { name: "Nicholas", sayName: function() { console.log(this.name); } };

var suffix = " name";
var person = { ["first" + suffix]: "Nicholas", ["last" + suffix]: "Zakas" };
console.log(person["first name"]); 
// "Nicholas"
 console.log(person["last name"]); 
 // "Zakas"
  • Object.is() 方法
console.log(5 == 5); // true 
console.log(5 == "5"); // true 
console.log(5 === 5); // true 
console.log(5 === "5"); // false 
console.log(Object.is(5, 5)); // true 
console.log(Object.is(5, "5")); // false
  • Object.assign() 方法 和mixin()类似
  • Object.setPrototypeOf() ,Object.getPrototypeOf()此方法允许你修改任意指 定对象的原型。
  • super关键字来调用对象原型上的方法,所调用的方法会被设置好其内部的 this 绑定,以自动使用该 this 值来进行工作。
5. 解构:更方便的数据访问
//对象解构
let node = { type: "Identifier", name: "foo" };
 let { type, name } = node; console.log(type); // "Identifier" 
console.log(name); // "foo"
//数组解构
let colors = [ "red", "green", "blue" ]; let [ firstColor, secondColor ] = colors; console.log(firstColor); // "red"
console.log(secondColor); // "green"
// 在 ES6 中互换值 
let a = 1, b = 2;
 [ a, b ] = [ b, a ]; 
 console.log(a); // 2 
 console.log(b); // 1
6. 符号与符号属性
  • 符号是 JS 新引入的基本类型值,它用于创建不可枚举的属性,并且这些属性在不引用符号的 情况下是无法访问的。
  • 虽然符号类型的属性不是真正的私有属性,但它们难以被无意修改,因此在需要提供保护以 防止开发者改动的场合中,它们非常合适。
  • 你可以为符号提供描述信息以便更容易地辨识它们的值。全局符号注册表允许你使用相同的 描述信息,以便在不同的代码段中共享符号值,这样相同的符号值就可以在不同位置用于相 同目的。
  • -Object.keys() 或 Object.getOwnPropertyNames() 不会返回符号值,因此 ES6 新增了一个 Object.getOwnPropertySymbols() 方法,允许检索符号类型的对象属性。而你依然可以使用 Object.defineProperty() 与 Object.defineProperties() 方法对符号类型的属性进行修改。
  • “知名符号”使用了全局符号常量(例如 Symbol.hasInstance ),为常规对象定义了一些功 能,而这些功能原先仅限内部使用。这些符号按规范使用 Symbol. 的前缀,允许开发者通过 多种方式去修改常规对象的行为。
7. set与map
  • Set 是不包含重复值的列表
let set = new Set();
set.add(5);
set.add("5"); 
console.log(set.size); // 2
set.delete(5);
console.log(set.size); // 1
console.log(set.has(5)); // false
//转化为数组
let set = new Set([1, 2, 3, 3, 3, 4, 5])
 array = [...set]; 
 console.log(array); // [1,2,3,4,5]
  • Map 则是键与相对应的值的集合。
let map = new Map(); 
map.set("title", "Understanding ES6"); map.set("year", 2016); console.log(map.get("title")); // "Understanding ES6" 
console.log(map.get("year")); // 2016
  • has(key) :判断指定的键是否存在于 Map 中;
  • delete(key) :移除 Map 中的键以及对应的值;
  • clear() :移除 Map 中所有的键与值。
8. 迭代器与生成器
  • 集合迭代器
    entries() :返回一个包含键值对的迭代器;
    values() :返回一个包含集合中的值的迭代器;
    keys() :返回一个包含集合中的键的迭代器。
  • Symbol.iterator 符号被用于定义对象的默认迭代器。内置对象与开发者自定义对象都可以使 用这个符号,以提供一个能返回迭代器的方法。当 Symbol.iterator 在一个对象上存在时, 该对象就会被认为是可迭代对象。
  • for-of 循环在循环中使用可迭代对象来返回一系列数据。与使用传统 for 循环进行迭代相 比,使用 for-of 要容易得多,因为你不再需要追踪计数器并控制循环何时结束。 for-of 循环会自动从迭代器中读取所有数据,直到没有更多数据为止,然后退出循环。
  • 生成器是一个特殊的函数,可以在被调用时自动创建一个迭代器。生成器的定义用一个星号 ( * )来表示,使用 yield 关键字能指明在每次成功的 next() 方法调用时应当返回什么 值。
9. js的类

//定义类、继承类

class PersonClass { 
// 等价于 PersonType 构造器 
constructor(name) { this.name = name; }// 等价于 
PersonType.prototype.sayName sayName() { 
console.log(this.name); 
} }
let person = new PersonClass("Nicholas");
 person.sayName(); // 输出 "Nicholas"
10. 增强的数组功能
  • Array.of() 方法创建数组
let items = Array.of(1, 2); 
console.log(items.length); // 2 
console.log(items[0]); // 1 
console.log(items[1]); // 2
  • Array.from() 方法转化为数组
function doSomething() { var args = Array.from(arguments); // 使用 args }
//转化映射
function translate() {
 return Array.from(arguments, (value) => value + 1); }
 let numbers = translate(1, 2, 3);
 console.log(numbers); // 2,3,4
  • find() 与 findIndex() 方法
  • fill() 方法
let numbers = [1, 2, 3, 4]; 
numbers.fill(1); 
console.log(numbers.toString()); // 1,1,1,1
  • copyWithin() 方法
let numbers = [1, 2, 3, 4]; 
// 从索引 2 的位置开始粘贴 
// 从数组索引 0 的位置开始复制数据 
numbers.copyWithin(2, 0); 
console.log(numbers.toString()); // 1,2,1,2
  • 数组缓冲区
let buffer = new ArrayBuffer(10); // 分配了 10 个字节
11. promise与异步编程
  • promise.then()
  • promise.catch()
  • promise.all()
  • promise.race()
12. 代理与反射接口
  • 通过调用 new Proxy() ,你可以创建一个代理用来替代另一个对象(被称为目标),这个代 理对目标对象进行了虚拟,因此该代理与该目标对象表面上可以被当作同一个对象来对待。
let target = {}; 
let proxy = new Proxy(target, {}); proxy.name = "proxy"; console.log(proxy.name); // "proxy" 
console.log(target.name); // "proxy" 
target.name = "target"; 
console.log(proxy.name); // "target" 
console.log(target.name); // "target"
13. 用模块封装代码
// 导出数据 
export var color = "red"; 
export let name = "Nicholas"; 
export const magicNumber = 7; 
// 导出函数 
export function sum(num1, num2) 
{ return num1 + num1; }
// 导出类 
export class Rectangle { constructor(length, width) { this.length = length; this.width = width; } }
// 此函数为模块私有 
function subtract(num1, num2) { return num1 - num2; }
// 定义一个函数…… 
function multiply(num1, num2) { return num1 * num2; }
// ……稍后将其导出 
export { multiply };
//导入
import { identifier1, identifier2 } from "./example.js";
// 完全导入 
import * as example from "./example.js";
//默认导出
export default function(num1, num2) { return num1 + num2; }
// 导入默认值 
import sum from "./example.js";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值