ES6基础

2016-11-04  本文已影响0人  Remeo

let和const

  if (true) {
    // TDZ开始 
    tmp = 'abc'; // ReferenceError 
    console.log(tmp); // ReferenceError 
    let tmp; // TDZ结束 
    console.log(tmp); // undefined 
    tmp = 123;
    console.log(tmp); // 123
  }
  function bar(x = y, y = 2) {
   return [x, y];
  }
  bar(); // 报错
!调用bar函数之所以报错(某些实现可能不报错),是因为参数x默认值等于另一个参数y,而此时y还没有声明,属于”死区“。

4、不许重复声明:let不允许在相同作用域内,重复声明同一个变量。
function () { let a = 10; var a = 1;}//报错
function () { let a = 10; let a = 1;}//报错

const a = [];
a.push('Hello'); // 可执行
a.length = 0;    // 可执行
a = ['Dave']; //报错
常量a是一个数组,这个数组本身是可写的,但是如果将另一个数组赋值给a,就会报错。

块级作用域

  var tmp = new Date();
  function f() { 
    console.log(tmp);
    if (false) { 
      var tmp = "hello world"; 
    }
  }

2、用来计数的循环变量泄露为全局变量。eg:

  var s = 'hello';
  for (var i = 0; i < s.length; i++) { 
    console.log(s[i]);
    }
  console.log(i); // 5

扩展运算符和rest参数

  function add(...items){
    let sum = 0;
    for(var val of items){
      sum += val;
    }
    return sum;
  }
add(4,4,5);//输出13
实际参数4,4,5会被放入items数组中。

!rest参数之后不可以再有其他参数,也就是说rest参数只能是最后一个参数。函数的length属性(用来获取函数参数的值)的值不包括rest参数。

 var arr1 = [1,2]; var arr2 = [3,4]; var arr3 = [5,6,'b'] ;
  [...arr1, ...arr2, ...arr3]//输出[1,2,3,4,5,6,'b']

2、与结构赋值结合,rest参数必须放在最后一位。

const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest  // [2, 3, 4, 5]
const [first, ...rest] = [];
first // undefined
rest  // []:

3、可以将字符串转成真正的数组。
[...'world'] //输出['w', 'o', 'r', 'l', 'd']
凡是涉及到操作32位Unicode字符的函数,最好用扩展运算符改写, JavaScript会将32位Unicode字符,识别为2个字符,采用扩展运算符就没有这个问题。

function length(str) { 
  return [...str].length;
}
  length('x\uD83D\uDE80y') // 3
不用扩展运算符:
'x\uD83D\uDE80y'.length // 4

箭头函数

es6允许使用“箭头”(=>)定义函数。
var f = v => v;相当于:

var f = function(v){
  return v;
}

1、如果箭头函数不需要使用参数或者需要多个参数,就是用圆括号代表参数部分。

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

2、如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return
语句返回。
var sum = (num1, num2) => { return num1 + num2; }
3、由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号。
var getTempItem = id => ({ id: id, name: "Temp" });
4、

(1)函数体内的this对象就是定时所在的对象,而不是使用时所在的对象。this对象的指向是可变的,但是在箭头函数中是固定的。
  //call()方法在使用一个指定的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。
(2)不可以当做构造函数,也就是说不可以使用new命令,否则会抛出错误、
(3)不可以使用arguments对象,该对象在函数体内不存在,如果要用,可以使用rest参数替代;
(4)不可因使用yield命令,因为箭头函数不能作为Generator函数。
Paste_Image.png
上一篇 下一篇

猜你喜欢

热点阅读