ES6语法初探

1 前言

作为一个只写过Android的年轻工程师,起初让我接触ReactNative我是拒绝的,没办法,无法改变世界,只能接受世界。
先从学习ES6开始。
let和const命令
let命令
对比java来说
let类似于局部变量,只在相应的代码块内有效,var相应的对应为全局变量,所有的针对局部变量的说明针对let几乎都适用。
const命令
const命令类似于 之前写的 public static final 这样的命令
定义一个只读的常量,一旦生命,常亮的值就不能改变。
相比编译型的语言,js的声明变量的形式相对很稀少,ES6 共有6中,分别是var ,function,
let, const,import,class。
关于其他
大家学习ES6可能都是从阮一峰老师的书开始,感觉js的语法越来越接近传统的java语法,最起码思想上越来越接近,使我们这些只写过JAVA的接触起来更加方便了很多
重点记录一下目前为止用的比较多的
箭头函数
基本用法

//ES6允许使用‘箭头’(=>)定义函数。
var f  = v=>v;
//上面的箭头函数等同于:
var f = function(v) {
  return v;
};
//如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。
var f = ()=>5;

//等同于
var f = function(){return 5};


var sum = (num1,num2) => num1+num2;

//等同于
var sum = function(num1,num2) {
   return num1+num2;

}
//若果箭头函数的代码块部分多余一条语句,就要使用大括号将他们括起来,并且使用return语句返回。
var sum = (num1,num2) => {return num1+num2;}
//由于大括号被解释成代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号。
var getTempItem = id => ({id:id,name:"Temp"});
//箭头函数可以与变量解构结合使用。
const full = ({first,last}) => first + ' ' + last;
//等同于
function full(person) {
  return person.first +' ' + person.last;

}
// 正常函数写法
[1,2,3].map(function(x){
   return x*x;
});
//箭头函数写法
[1,2,3].map(x=>x*x);

另一个例子是
//正常函数写法
var result =values.sort(function(a,b) {
    return a-b;
});
//箭头函数写法
var result = values.sort((a,b)=>a-b);

使用注意点
箭头函数有几个使用注意点。
(1) 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当做构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在,如果要用,可以用Rest参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作Generator函数。
上面四点中,第一点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,他是固定的。

function foo() {
  setTimeout(() => {
     console.log('id:',this.id);
  },100);
}
var id = 21;
foo.call({id:42});

上面代码中,setTimeout的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,二它的真正执行要等到100毫秒后,如果是普通函数,执行时 this 应该指向全局对象 window,这是应输出21。但是,箭头函数导致this总指向函数定义生效时所在的对象(本例是{id:42}),所以输出的是42。
箭头函数可以让setTimeout里面的this,绑定定义时所在的作用域,而不是指向运行时所在的作用域。下面是另一个例子。

function Timer() {
    this.s1 = 0;
    this.s2 = 0;
    //箭头函数
    setInterval(() =>this.s1++,1000);
    //普通函数
    setInterval(function() {
       this.s2++;
     },1000);
}
   var timer = new Timer();

   setTimeout(()=> console.log('s1: ',timer.s1),3100);
   setTimeout(() => console.log('s2: ',timer.s2),3100);
//s1:3
//s2:0

上面代码中,Timer函数内部设置了两个定时器,分别使用了箭头函数和普通函数。前者的this绑定定义时所在的作用域(即Timer函数),后者的this指向运行时所在的作用域(即全局对象)。所以3100毫秒之后,timer.s1被更新了3次,而timer.s2 一次都没更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值