完整系统性的学习下ES6(一)

107 阅读4分钟

本文已参与『新人创作礼』活动,一起开启掘金创作之路

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

ECMAScript6

ECMAScript简称就是ES,你可以把它看成是一套标准,JavaScript就是实施了这套标准的一门语言,现在主流浏览器使用的是ECMAScript5

Babel 是编写下一代 JavaScript 的编译器。

ES2015 and beyond。 Babel 默认使用一组 ES2015 语法转换器,允许你使用新的语法,无需等待浏览器支持。

JSX and React。 Babel 内置支持 JSX,与  babel-sublime 包一起结合,将语法高亮功能带到一个新的高度。

Pluggable。 Babel 支持用户插件。允许你插入强大的 Babel 转换层。babeljs.io/docs/en/

1. 作用域变量

作用域就是一个变量的作用范围。也就是你声明一个变量以后,这个变量可以在什么场合下使用 以前的JavaScript只有全局作用域,还有一个函数作用域

1.1 var

  1. var没有块级作用域,定义后在当前闭包中都可以访问,如果变量名重复,就会覆盖前面定义的变量,并且也有可能被其他人更改。
  if (true) {
      var a = "a"; // 期望a是某一个值
  }
  console.log(a);
  1. var在for循环标记变量共享,一般在循环中使用的i会被共享,其本质上也是由于没有块级作用域造成的
 //  弹窗三次 `3`
    for (var i = 0; i < 3; i++) {
         setTimeout(function () {
             alert(i);
         }, 0);
     }

1.2 块级作用域

在用var定义变量的时候,变量是通过闭包进行隔离的,现在用了let,不仅仅可以通过闭包隔离,还增加了一些块级作用域隔离。 块级作用用一组大括号定义一个块,使用 let 定义的变量在大括号的外面是访问不到的

1.2.1 实现块级作用域

if(true){
    let name = 'zfpx';
}
console.log(name);// ReferenceError: name is not defined

1.2.2 不会污染全局对象

if(true){
    let name = 'zfpx';
}
console.log(window.name);

结果 undefined

1.2.3 for循环中也可以使用i

// 嵌套循环不会相互影响
    for (let i = 0; i < 3; i++) {
        console.log("out", i);
        for (let i = 0; i < 2; i++) {
            console.log("in", i);
        }
    }

结果 out 0 in 0 in 1 out 1 in 0 in 1 out 2 in 0 in 1

1.2.4 重复定义会报错

if(true){
    let a = 1;
    let a = 2; //Identifier 'a' has already been declared
}

1.2.5 不存在变量的预解释

for (let i = 0; i < 2; i ++){
    console.log('inner',i);
    let i = 100;
}

结果 i is not defined

1.2.6 闭包的新写法

以前

;(function () {
    ...
})();

现在

{
...
}

2. 常量

使用const我们可以去声明一个常量,常量一旦赋值就不能再修改了

2.1 常量不能重新赋值

const MY_NAME = 'zfpx';
MY_NAME = 'zfpx2';//Assignment to constant variable

2.2 变量值可改变

注意const限制的是不能给变量重新赋值,而变量的值本身是可以改变的,下面的操作是可以的

const name = ['str'];
name.push('str2');
console.log(name);

2.3 不同的块级作用域可以多次定义

const A = "0";
{
    const A = "A";
    console.log(A)
}
{
    const A = "B";
    console.log(A)
}
console.log(A)
//  结果 A B 0

小知识

let、const、class声明的全局变量不属于顶层对象的属性,并且使用let和const定义不会产生变量提升。

3. 解构

3.1 解析数组

解构意思就是分解一个东西的结构,可以用一种类似数组的方式定义N个变量,可以将一个数组中的值按照规则赋值过去。

var [name,age] = ['zfpx',8];
console.log(name,age);

3.2 嵌套赋值

    let [x, [y], z] = [1, [2.1, 2.2]];
    console.log(x, y, z);

    let [x, [y,z]] = [1, [2.1, 2.2]];
    console.log(x,y,z);

    let [json,arr,num] = [{name:'zfpx'},[1,2],3];
    console.log(json,arr,num);

1 2.1 undefined 1 2.1 2.2 { name: 'zfpx' } [ 1, 2 ] 3

3.3 省略赋值

let [, , x] = [1, 2, 3];
console.log(x);

3.4 解构对象

对象也可以被解构

var obj = {name:'zfpx',age:8};
//对象里的name属性的值会交给name这个变量,age的值会交给age这个变量
var {name,age} = obj;
//对象里的name属性的值会交给myname这个变量,age的值会交给myage这个变量
let {name: myname, age: myage} = obj;
console.log(name,age,myname,myage);

3.5 默认值

在赋值和传参的时候可以使用默认值

let [a = "a", b = "b", c =new Error('C必须指定')] = [1, , 3];
console.log(a, b, c);

function ajax (options) {
    var method = options.method || "get";
    var data = options.data || {};
    //.....
}
function ajax ({method = "get", data}) {
    console.log(arguments);
}
ajax({
    method: "post",
    data: {"name": "zfpx"}
});

4. 字符串

4.1 模板字符串

模板字符串用反引号(数字1左边的那个键)包含,其中的变量用${}括起来

var name = 'zfpx',age = 8;
let desc = `${name} is ${age} old!`;
console.log(desc);

//所有模板字符串的空格和换行,都是被保留的
var str = `<ul>
<li>a</li>
<li>b</li>
</ul>`;
console.log(str);

其中的变量会用变量的值替换掉

function replace(desc){
  return desc.replace(/${([^}]+)}/g,function(matched,key){
    return eval(key);
  });
}

4.2 带标签的模板字符串

可以在模板字符串的前面添加一个标签,这个标签可以去处理模板字符串 标签其实就是一个函数,函数可以接收两个参数,一个是strings,就是模板字符串里的每个部分的字符 还有一个参数可以使用rest的形式values,这个参数里面是模板字符串里的值

var name = 'zfpx',age = 8;
function desc(strings,...values){
    console.log(strings,values);
}
desc`${name} is ${age} old!`;

4.3 字符串新方法

  • includes():返回布尔值,表示是否找到了参数字符串。
  • startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
  • endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
var s = 'zfpx';
s.startsWith('z') // true
s.endsWith('x') // true
s.includes('p') // true

第二个参数,表示开始搜索的位置

var s = 'zfpx';
console.log(s.startsWith('p',2)); // true
console.log(s.endsWith('f',2)); // true
console.log(s.includes('f',2)); // false

endsWith的行为与其他两个方法有所不同。它针对前n个字符,而其他两个方法针对从第n个位置直到字符串结束

4.4 repeat

repeat方法返回一个新字符串,复制指定次数。

var str = "String"; str.repeat(2);
console,log(str)
// 输出结果: 'StringString'

文章有错误或者遗漏地方的小伙伴可以在评论区评论哦~~