- 对象的原型
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都会直接拿到该值