let const 与 var 的区别
var 可以变量提升, 声明相同的名字不会报错
(变量提升原理:JS引擎的工作是 1)先加载代码,2)执行代码,变量提升会把所有的变量定义提升到代码头)
存在与全局作用域和函数作用域
let const
- 作用域是当前代码块
- 不允许重复声明
- 暂时性死区: 如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
//在代码块中,let 声明了局部变量 tmp, 所以在此代码快中与var 所声明的全局变量 tmp 没有关系。
//且由于‘暂时性死区’,声明前使用,因此报错。
- const一旦声明必须赋值,不能使用null占位。声明后不能再修改。如果声明的是复合类型数据,可以修改其属性。其实是变量指向的那个内存地址所保存的数据不得改动
Promise
Promise 是异步编程的一种解决方案,其实是一个构造函数,可以new出一个Promise实例。自己身上有all、reject(失败后的回调函数)、resolve(成功之后的回调函数)这几个方法,原型上有then、catch、finally(不管 Promise 对象最后状态如何,都会执行的操作,ES2018 )等方法。
状态:
一共有三种状态,分别为pending(进行中)、fulfilled(已成功)和rejected(已失败)
all
将多个 Promise 实例,包装成一个新的 Promise 实例
箭头函数
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
上面四点中,第一点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。
Symbol
表示独一无二的一种数据类型,不能使用new,它是一种类似于字符串的基础数据类型,从根本上防止属性名的冲突
let a = Symbol();
typeof a
// "symbol"
Class
JavaScript没有真正的类,一直也是通过函数加原型的形式来模拟,class也不例外,只是语法糖,本质还是函数。只是让对象原型的写法更加清晰,更像面向对象编程的语法而已。
类的本质还是一个函数,类就是构造函数的另一种写法。
通过构造函数创建实例,是可以变量提升的。 es6中的类,必须先有类,才可以实例化。
类的所有方法都定义在类的prototype属性上面
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
class Parent {
constructor(name) {
this.name = name;
}
}
class Child extends Parent {
constructor(name, age) {
super(name); // 相当于Parent.call(this, name)
this.age = age;
}
}
Generator 函数
一种异步编程解决方案,是一个状态机,封装了多个内部状态。
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
var hw = helloWorldGenerator();
hw.next()// { value: 'hello', done: false }
hw.next()// { value: 'world', done: false }
hw.next()// { value: 'ending', done: true }
hw.next()// { value: undefined, done: true }
async
async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
async function getStockPriceByName(name) {
const symbol = await getStockSymbol(name);
const stockPrice = await getStockPrice(symbol);
return stockPrice;
}
getStockPriceByName('goog').then(function (result) {
console.log(result);
});