目录
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的特点:
- let有块级作用域,var没有块级作用域。
- let取消了变量提升,使用变量前必须先声明变量。
- 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数据的结构对应起来就可以了。变量名可以自己命名