ES6Day01:babel工具的安装和使用、新的变量声明关键字、第七种数据类型Symbol、解构赋值

目录

0x00 babel工具的安装和使用

0x01 新的变量声明关键字

0x02 第七种数据类型Symbol

0x03 解构赋值


0x00 babel工具的安装和使用

babel是一个转码器,可以将高版本的js代码转化为低版本js代码。

首先确保安装了node。

1.创建package.json文件

为你的项目创建一个文件夹(例如ES6),然后在vscode的View中打开终端,输入命令初始化工程项目。

#-y表示使用默认配置初始化项目
npm init -y

注意:确保项目文件夹名中不要含有中文

该命令执行后,将会创建一个package.json文件。

2.局部安装babel命令行工具babel-cli和babel规则集babel-preset-es2015(不推荐全局安装)

npm install --save-dev babel-cli babel-preset-es2015

安装完成后,将会有一个node_modules文件夹

3.在ES6文件夹下创建以下文件夹

src:用于存放高版本的js代码

dist:用于存放转码后的低版本的js代码

4.在src中创建一个test.js输入以下代码测试babel工具是否生效

let slo = "hello world";

首先,在src的同级目录下创建一个.babelrc文件,来存babel的相关配置 ,即表示转码的规则集为es2015

{
    "presets": ["es2015"]
}

babel程序在node_modules的隐藏文件夹.bin中

因为在终端中输入:

node_modules/.bin/babel src/test.js --out-file dist/test.js

表示将src/test.js 转码并将转码后的文件存到dist/test.js

这是将单个js文件转码的方式,除此之外还可以将一个文件夹中的所有js文件转码到另一个文件夹

node_modules/.bin/babel src --out-dir dist

但是,即便是这样,每次test.js发生改变,我们都要手动转码一次,岂不是很麻烦,如何实现自动监听test.js并转码呢?

抱歉命令少了一个参数,在-w 后面再添加一个 -o表示输出

"dev":"babel src/test.js -w -o dist/test.js"

然后在终端输入 :npm run dev即可运行dev脚本实现自动监听test.js并转码.

如何监听目录呢?

"dev2":"babel src -w -d dist"

0x01 新的变量声明关键字

创建index.html,在src下创建一个js文件,然后在index.html中导入dist下转化后的js文件。运行上次的自动转换脚本。

下载插件 live server ,这个插件可以建立一个本地服务器,可以实现右键菜单再浏览器中打开文件。

1.var的缺陷

var声明的变量只有两种局部作用域和全局作用域。例如:循环中的问题

var i = 2;
for(var i=0;i<10;i++){

}
console.log(i);

浏览器中竟然输出了10!按照C这种标准规范的作用域来理解。全局变量I的值等于2才是合理的。js中只是用来计数的局部变量就能影响全局变量显然不是我们需要的。

var不合理的第二点:变量声明提前。

function test(){
    console.log(b);
    var b=2;
}
test();

输出undefined!因为上面的代码相当于:

function test(){
    var b;//变量声明被提前
    console.log(b);
    b=2;
}
test();

其实js这种自动提前声明就不合理。变量先声明再调用才是规范的。

例如在C语言中有3钟作用域:http://c.biancheng.net/view/1860.html

全局作用域:不在任何函数中定义的变量,作用域是整个程序(源文件和头文件),加上static的前缀的作用域是本文件。

局部作用域:函数中定义的变量,作用域是整个函数

块级作用域:在一个块{}中定义的变量。作用域是整个块{}.

所以为了解决第一个问题:es6引入了块级作用域来规范js的作用域。

一个{}就是一个块级作用域。一个块级作用域中声明的变量。在块级作用域外是不能被访问的。

let的特点:

  1. let有块级作用域,var没有块级作用域。
  2. let取消了变量提升,使用变量前必须先声明变量。
  3. var能够重复声明(不合理),let变量不能重复声明

2.const

用法:声明一个只读的变量(可理解为常量)

特点:同let命令

注意事项:

const声明常量的同时必须给变量赋值

如果const声明的是简单数据类型,变量的值是不可改变的

实质:保证变量指向的内存地址所保存的数据不允许改动

简单数据类型如字符串、数字、布尔值。值就保存在变量名指向的内存地址。

复杂数据类型如对象,数组和函数。变量名指向的内存空间中存的其实是指向实际数据的指针

而const只能保证 变量名指向的内存空间中的值是固定的。至于内存空间中如果存的是指针。指针指向的内存空间中的值变不变就无法控制了。

0x02 第七种数据类型Symbol

ES6之前有6种数据类型:

Number

String

Boolean

Object

Null(空对象指针)

Undefined(声明变量未被初始化)

引入原因:

对象的属性名容易产生命名冲突,为保证键名的唯一性,故es6引入Symbol这种新的原始数据类型,确保创建的每个变量都是独一无二的。

let a3 = Symbol('kkk');//Symbol是一个函数
let a4 = Symbol('kkk');
console.log(a3 === a4);//false

let a1 = Symbol.for('kkk');
let a2 = Symbol.for('kkk');
console.log(a1 === a2);//true;

方式一:


let a1 = Symbol.for('kkk');
let obj ={
    [a1]:456,//会被替换成Symbol('kkk'):456
    a1:123
}
console.log(obj);

方式二:

let a1 = Symbol.for('kkk');
let obj={};
obj['a1']=456;
obj[a1]=789;//obj[Symbol('kkk')]=789

console.log(obj);

0x03 解构赋值

只要数据类型能够循环遍历,就可以进行解构赋值

let a,b;
[a,b] = [1,2];
console.log(a,b);

1.数组的解构赋值

当数组中的值多于变量时

let a,b;
[a,b] = [1,2,3,5];
console.log(a,b);//a=1 b=2

当数组中的值少于变量时

let a,b,c;
[a,b,c] = [1,2];
console.log(a,b,c);//a=1 b=2 c=undefined

以上情况可以给c一个默认值,如果右边没有值赋值给c,那么c就是默认值。

let a,b;
[a,b,c=6] = [1,2];
console.log(a,b,c);//a=1 b=2 c=6

不定长解构:

let a,other;
[a,...other] = [1,2,3,4,5,6];
console.log(a,other);

如果只想要第一个和第三个呢?

let a,b;
[a,,b] = [1,2,3,4,5,6];
console.log(a,b);

2.对象的解构赋值

let a,b;
({a,b}={a:1,b:2});
// 因为一行不能以{}开头,所以用一个括号把他们括起来
// 注意:这样写左边的变量名必须和右边的key相同
console.log(a,b);

除了用括号,还可以将声明 和结构赋值放在同一行


let {a,b}={a:1,b:2};
console.log(a,b)

如果想自己命名变量怎么办呢?

let username,userage;
({name:username,age:userage}={name:"xiaoming",age:12});

console.log(username,userage);

应用场景JSON数据的解构赋值

function returnJson(){
    return {
        "name":"xdu",
        "namelist":[
            {
            "name":"xiaoming",
            "age":18,
            "grade":98
            },
            {
                "name":"xiaohong",
                "age":20,
                "grade":90
            }
        ]
    };
}
let {"name":wrap_name,"namelist":[{"name":stu_name1,"age":stu_age1,"grade":stu_grade1},{"name":stu_name2,"age":stu_age2,"grade":stu_grade2}]}=returnJson();
console.log(wrap_name,stu_name1,stu_age1,stu_grade1,stu_name2,stu_age2,stu_grade2);

关键:解包时左边的结构 和 JSON数据的结构对应起来就可以了。变量名可以自己命名

发布了156 篇原创文章 · 获赞 19 · 访问量 8924

猜你喜欢

转载自blog.csdn.net/weixin_43415644/article/details/104204899