Klay's Notebook

阿胡的的流水账


  • Home
  • Archive
  • Categories
  • Tags
  •   

© 2026 Klay-Clam

Theme Typography by Makito

Proudly published with Hexo

ES6笔记📒

Posted at 2019-07-13 JavaScript  ES6 

  • 对象的原型prototype
1
var A = {  n: 4399};var B = function(){  this.n = 9999;}var C = function() {  var n = 8888;}B.prototype = A;C.prototype = A;var b = new B();var c = new C();A.n++;console.log(b.n);console.log(c.n);

对象在寻找属性/方法时在当前对象中寻找,不存在的时候才去原型中寻找。如果在对象中已经存在,就不会去原型中寻找。

  • let,var的区别
    let:用来声明局部变量。用法与var类似,但是声明的变量值在let命令所在的代码块内有效,而且有暂时性死区的约束。
1
/* var 变量提升的问题 */var a = 99;f();console.log(a); // [3] 99 打印全局变量afunction f() {  console.log(a); // [1] undefined 变量提升且未赋值  var a = 10;  console.log(a); // [2] 10 打印赋值之后的a的值}

let没有变量提升的问题,因为变量在let声明之前使用会报错,只能在声明之后再使用。也就是暂时性死区
let不能在同一作用域重复声明同一变量

  • 箭头函数 ==>
    箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this,arguments,super或 new.target。这些函数表达式更适用于那些本来需要匿名函数的地方,并且它们不能用作构造函数。
    引入箭头函数有两个方面的作用:更简短的函数并不绑定this

更简短的函数

1
var elements = [  'Hydrogen',  'Helium',  'Lithium',  'Beryllium'];elements.map(function(element){  return element.length;}); // 返回数组 [8,6,7,9]// 改写为箭头函数elements.map((element) => {  return element.length;}); // [8,6,7,9]// 当箭头函数只有一个参数时,可以省略参数的圆括号elements.map(element => {  return element.length;}); // [8,6,7,9]// 当箭头函数只有一个 return 函数体语句时,可以省略 return 关键字和方法体的花括号elements.map(element => element.length);// 在这个例子中,因为我们只需要 `length` 属性,所以可以使用参数解构// 需要注意的是字符串 `"length"` 是我们想要获得的属性的名称,而 `lengthFooBArX` 则只是个变量名,// 可以替换成任意合法的变量名elements.map(({ "length": lengthFooBArX }) => lengthFooBArX); // [8, 6, 7, 9]
  • 不绑定this

在箭头函数出现在以前,每个新定义的函数都有他自己的this(在构造函数的情况下时一个新对象,在严格模式的函数调用中威undefined,如果该函数被作为对象方法调用,则为基础对象等)。this被证明是令人厌烦的面向对象风格的编程。

1
function Person() {  // Person() 构造函数定义 this 作为它自己的实例  this.age = 0;  setInterval(function growUp(){    // 在非严格模式, growUp()函数定义 `this`作为全局对象,     // 与在 Person()构造函数中定义的 `this`并不相同.    this.age++;  }, 1000);}var p = new Person()// growUp方法内部的this不指向Person对象// 使用箭头函数解决上面的问题function Person() {  this.age = 0;  setInterval(() => {    this.age++;  }, 1000);}var p = new Person()

箭头函数不能用做构造器,和new一起使用会抛出错误。

1
var Foo = () => {};var foo = new Foo(); // TypeError: Foo is not a constructorconsole.log(Foo.prototype); // undifined 箭头函数没有undefined属性

箭头函数返回对象字面量

1
var func = () => ({foo: 1})

箭头函数递归:

1
var fact = x => ( x == 0 ? 1 : x*fact(x-1));fact(5);
  • Set
    ES6提供了新的数据结构Set。它类似数组,但是成员的值都是唯一的,没有重复的值,可以按照插入的顺序迭代元素。

NaN和undefined都可以被存储在Set 中, NaN之间被视为相同的值(尽管 NaN !== NaN)。另外在Set中两个对象总是不相等的,即使是两个空对象

Set本身是一个构造函数,用来生成Set数据结构

1
const s = new Set();[2,3,3,4,5,5,6,7].forEach(x => {  s.add(x)})for (let i of s){  console.log(i)}// 2 3 4 5 6 7

add()方法向Set结构加入成员。
Set函数可以接受一个数组(活着具有iterable接口的其他数据结构)或为参数,用来初始化

1
// 去除数组的重复成员[...new Set(array)]// 去除字符串中的重复字符[...new Set('abbbbasssas')].join('')

Set实例的属性和方法

Set.prototype.constructor:构造函数,默认就是Set函数

  • Set.prototype.size:返回Set实例的成员总数

  • Set.prototype.add(value):添加某个值,返回Set结构本身

  • Set.prototype.delete(value):删除某个值,返回boolean值,表示删除是否成功

  • Set.prototype.has(value):返回一个boolean值,表示该值是否为Set成员

  • Set.prototype.clear():清除所有成员,没有返回值

1
const items = new Set([1, 2, 3, 4, 5]);const array = Array.from(items);// 数组去重的另一种方法:function dedupe(array) {  return Array.from(new Set(array));}dedupe([1, 1, 2, 3]) // [1, 2, 3]

Set的遍历操作

  • Set.prototype.keys():返回键名的遍历器

  • Set.prototype.values():返回键值的遍历器

  • Set.prototype.entries():返回键值对的遍历器

  • Set.prototype.forEach():使用回调函数遍历每个成员

Set的遍历顺序就是插入顺序。这个特性有时非常有用,比如使用 Set 保存一个回调函数列表,调用时就能保证按照添加顺序调用

1
let set = new Set(['red', 'green', 'blue']);// keysfor (let item of set.keys()) {  console.log(item);}// red// green// blue// valuesfor (let item of set.values()){  console.log(item)}// red// green// blue// entries()for (let item of set.entries()) {  console.log(item);}// ["red", "red"]// ["green", "green"]// ["blue", "blue"]
1
// 使用forEach进行遍历let set = new Set([1, 4, 9]);set.forEach((value, key) => console.log(key + ' : ' + value))// 1 : 1// 4 : 4// 9 : 9

Set遍历的应用:

1
// 数组去重let arr = [3, 5, 2, 2, 5, 5];let unique = [...new Set(arr)];// 配合数组方法map、filterlet set = new Set([1, 2, 3]);set = new Set([...set].map(x => x * 2));// 返回Set结构:{2, 4, 6}let set = new Set([1, 2, 3, 4, 5]);set = new Set([...set].filter(x => (x % 2) == 0));// 返回Set结构:{2, 4}
  • Promise
    是一部变成的一种解决方案,比传统的解决方案更加合理和强大。Promise是一个对象,从它可以回去一步操作的消息。Promise提供统一的API,各种一步操作都可以使用用样的方法进行处理。

Promise构造函数是同步执行的,promise.then是异步执行的

  • 构造函数中的resolve或reject 只有第一次执行有效,多次调用没有任何作用

  • promise 的.then 或者.catch 可以被调用多次,但这里Promise构造函数只执行一次。或者说 promise 内部状态一经改变,并且有了一个值,那么后续每次调用.then或者.catch 都会直接拿到该值

Share 

 Previous post: 前端面试常用的简单排序算法 Next post: ES6-let/const 

© 2026 Klay-Clam

Theme Typography by Makito

Proudly published with Hexo