ES6—知识点儿复习

ES6—知识点儿复习_第1张图片

let,const和var 的区别

块级作用域

块作用域由{ }包括, let和const具有块级作用域,var不存在块级作用域。块级作用域解决了两个问题

  • 内层变量可能覆盖外层变量
  • 用来记数的循环变量泄露为全局变量

变量提升 

var 存在变量提升,let和const 不存在变量提升,也就是变量只能在声明之后使用,如果不在就会报错

给全局添加属性

浏览器的全局对象是window,Node的全局对象是global,var 声明的变量是全局变量,并且会将该变量添加为全局对象的属性,但是let和const 不会

重复声明

var声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的变量,但是const 和let 是不允许重复声明的

暂时性死区

在使用let ,const 声明变量之前,该变量都是不可用的,这在与发生称为暂时性死区,使用var 声明的变量并不存在暂时性死区

初始值设置:

在声明变量的时候,var 和const 可以不用设置初始值,但是const变量必须设置初始值

指针指向

let和const都是ES6新增的用于创建变量的语法。let创建的变 量是可以更改指针指向(可以重新赋值)。但const声明的变 量是不允许改变指针的指向。

区别

var

let

const

是否有块级作用域

×

是否存在变量提升

×

×

是否能添加全局属性

×

×

是否能重复声明变量

×

×

是否存在暂时性死区

×

是否必须设置初始值

×

×

能否改变指针指向

×


const对象的属性可以修改吗

const保证的并不是变量的值不能改动,而是变量指向的那个内存地址不能改动。对于基本类型的数据(数值、字符串、布尔值),其值就保存在变量指向的那个内存地址, 因此等同于常量。但对于引用类型的数据(主要是对象和数组)来说,变量指向数据的内存地址,保存的只是一个指针, const只能保证这个指针是固定不变的,至于它指向的数据结构是不是可变的,就完全不能控制了。

new操作符的实现原理

new操作符的执行过程:

  1. 首先创建了一个新的空对象
  2. 设置原型,将对象的原型设置为函数的prototype对象。
  3. 让函数的this指向这个对象,执行构造函数的代码(为这个新对象添加属性)
  4. 判断函数的返回值类型,如果是值类型,返回创建的对象。如果是弓|用类型,就返回这个引用类型的对象。

 具体实现

function objectFactory(){
  let newObject = null;
  let constructor=Array.prototype.shift.call(arguments);
  let result=null;
  //判断参数是否是一个函数
  if(typeof constructor !="function"){
   console.error("type error");
   return;
}
  //新建一个空对象,对象的原型是构造函数的prototype 对象
  newObject =Object.create(constructor.prototype);
  //将this 指向新建对象,并执行函数
  result = constructor .apply(newobject, arguments);
  //判断返回结果
  return flag ? result : newObject;
}
//使用方法
objectFactory(构造函数,初始化参数);

 如果new 一个箭头函数会怎样?

箭头函数是ES6中的提出来的,它没有prototype, 也没有自己的this指向,更不可以使用arguments参数, 所以不能New-一个箭头函数。箭头函数是ES6中的提出来的,它没有prototype, 也没有自己的this指向,更不可以使用arguments参数, 所以不
能New-一个箭头函数。
new操作符的实现步骤如上所述,
所以,上面的第二、三步, 箭头函数都是没有办法执行的。

箭头函数和普通函数的区别

箭头函数比普通函数更加简洁

  • 如果没有参数,就直接写一个空括号即可
  • 如果只有一个参数,可以省去参数的括号
  • 如果有多个参数,用逗号分割
  • 如果函数体的返回值只有一句,可以省略大括号
  • 如果函数体不需要返回值,职有-句话,可以给这个语句前面加一个void关键字。最常见的就是调用一 个函数

let  fn = ( ) => void doesNotReturn( ); 

 箭头函数没有自己的this

箭头函数不会创建自己的this,所以它没有自己的this,它只会在自己作用域的上一层继承

箭头函数继承来的this指向永远不会改变

var id='GLOBAL';
var obj={
 id:'OBJ',
 a:function(){
   console.log(this.id);
},
 b:()=>{
  console.log(this.id);
}
};
obj.a();//'OBJ'
obj.b();//'GLOBAL'
new obj.a() //undefined
new obj.b() //uncaught TypeError:obj.b is not a constructor

对象obj的方法b是使用箭头函数定义的,这个函数中的this就永远指向它定义时所处的全局执行环境中的this,即便这个函数是作为对象obj的方法调用,this依旧指向Window对象。 需要注意,定义对象的大括号{}是无法形成一个单独的运行环境的,它依旧是处于全局执行环境中

箭头函数不能作为构造函数使用

构造函数在new的步骤在上面已经说过了,实际上第二步就是将函数中的this指向该对象。但是由于 箭头函数时没有自己的this的,且this指向外层的执行环境,环能改变指向,所以不能当做构造函数使用。

箭头函数没有自己的arguments

箭头函数没有自己的arguments对象。在箭头函数中访问arguments实际上获得的是它外层函数的arguments值。

箭头函数没有prototype
箭头函数不能用作Generator函数,不能使用yeild关键字


 恭喜你,又涨知识啦~~

ES6—知识点儿复习_第2张图片

现在正在期待一个月满我可以改名字,~

 

 

 

你可能感兴趣的:(es6,es6,前端,javascript)