ES标准中不包含 DOM 和 BOM的定义,只涵盖基本数据类型、关键字、语句、运算符、内建对象、内建函数等通用语法
本部分只学习前端开发中ES6的必要知识,方便后面项目开发中对代码的理解
let声明变量:
/*
{
var a = 0; // var声明的变量是全局变量,注意在方法里不同,var不够严谨
let b = 0; // let声明的变量是局部变量,通常不是括起来的,let够严谨
}
//单纯的{},必然执行且操作,相当于一个匿名对象且执行
console.log(a);
console.log(b); //b is not defined:b没有定义
*///------------------------------------------------/*
// var可以声明多次
// let只能声明一次
var m = 1;
var m = 2; //var可以重复声明
let n = 3;
let n = 4; //SyntaxError: Identifier 'n' has already been declared(语法错误:n已经声明过了)
console.log(m);
console.log(n);
*///------------------------------------------------// var 声明的变量会全局存储// let 声明的变量只能在执行后才存储
console.log( x );//没有报错,输出:undefined,注意,在其他的var x = x或者alert(x)中,后面的代码不会执行,但是这里会,说明log中处理了错误,类似于java的try,即错误的捕获,具体可以百度查看var x ="苹果";
console.log(y);//y is not defined(y没有定义)let y ="香蕉";
可以得出let才是真正的是一个严谨的语法,即严谨的局部变量
const声明常量:
const 声明常量,为只读变量
一旦声明之后,其值是不允许改变的
一但声明必须初始化,否则会报错 SyntaxError: Missing initializer in const declaration(语法错误,声明常量丢失了初始化)
constPI=3.14;PI=3.1415;//Assignment to constant variable.(声明的是常量)
console.log(PI);
解构赋值:
解构赋值是对赋值运算符的扩展
它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值
解构,顾名思义,就是将集合型数据进行分解,拆分,把里面的值逐一遍历获取
在代码书写上简洁且易读,语义更加清晰明了,也方便了复杂对象中数据字段获取
var arr =[1,2,3];// 传统的jslet a = arr[0];let b = arr[1];let c = arr[2];
console.log(a,b,c);//可以连着写,因为log方法可以输出多个参数,用空格隔开//es6的解构var[x,y,z]= arr;
console.log(x,y,z);//解构,就是将数组的值,一一赋值给对应的数组值,语法就是反过来,但对应的值必须是一个数组,如arr//其中的[]括号里的,是一些变量,相当于将数组的值一一赋值给这些变量,而不用非常麻烦的一一操作了//且x,y,z就是var的类型//-----------------------------------------------------var user ={username:"吕布",weapon:"方天画戟",horse:"赤兔马"};// 传统的jslet mingzi = user.username;let wuqi = user.weapon;let zuoji = user.horse;
console.log("姓名:"+mingzi+",武器:"+wuqi+",坐骑:"+zuoji);//es6的解构let{username,weapon,horse}= user;// 注意:解构的变量名必须是对象中的属性,否则就是空定义
console.log("姓名:"+username+",武器:"+weapon+",坐骑:"+horse);//解构,实际上就是用集合的方式的声明获得赋值
模板字符串 :
模板字符串相当于加强版的字符串
用反引号 `,除了作为普通字符串,还可以用来定义多行字符串
还可以在字符串中加入变量和表达式
定义多行字符串
/*
let str = `hello,
你俩在哪呢?
心情不好,出来喝点啊!`;
使用""要换行,必须使用换行符,直接换行会报错的,因为换行是占一行,而`会识别,必须要有另外一个`才会结束
实际上最终的结果还是返回字符串,只是中间有很多操作
console.log(str);
*///-----------------------------------/*
let name = `吕布`;
let age = 24;
// 传统的拼接字符串
var info1 = "我叫:"+ name +",我今年"+age+"岁!";
console.log(info1);
// es6的拼接字符串
var info2 = `我叫:${name},我明年${age+1}岁!`;
console.log(info2);
*///其中使用`时将内容进行判断,${}取对应变量值,然后作为字符串,所以这个变量是可以进行计算的,因为只取最终结果//所以这就是类似于vue的取找当前值进行操作//-----------------------------------functiontest(){return"吃喝玩乐";}let str =`悲催的人生,从${test()}开始`;//那么既然是变量,那么方法自然也可以使用
console.log( str );//注意:模板字符串允许你在字符串中插入变量或表达式,但是如果不是在node.js的环境中,是不能包含 JavaScript 代码块的(如html文件的script中写上这样的代码),比如 <script> 标签不能写入代码块,否则会提示报错(通常在最后的</html>那里有红色波浪线)
声明对象简写:
定义对象的时候,可以用变量名作为属性名
let name =`吕布`;let age =28;//传统let user1 ={name: name,age: age
};
console.log(user1);//es6新语法中的简写let user2 ={name,age};//当key和value的名称一致时,可以直接省略写一个
console.log(user2);
let user1 ={name:"项羽",age:34};let user2 ={...user1};// 深拷贝(克隆),需要三点血才可拷贝,只能拷贝相应对象//若let user1 =1,则user2的值就是{},{}里面什么都没有
console.log(user1);
console.log(user2);
合并对象:
let user1 ={name:"项羽",age:34};let user2 ={head:"诸葛亮"};let user ={...user1,...user2};//获得对应的三滴血形成一个新的对象,逗号隔开
console.log( user );
函数的默认参数:
形参处已声明,但不传入实参会怎样?
functiontest(name , age =18){//当age是undefined时,就会将18赋值给age,如不传参或传入undefined,那么age就等于18
console.log(`我叫${name},我今年${age}岁`);}test("吕布",33);//我叫吕布,我今年33岁test("貂蝉");//我叫貂蝉,我今年18岁test("关羽",null);//我叫关羽,我今年null岁test("马超","");//我叫马超,我今年岁test("张飞",undefined);//我叫张飞,我今年18岁test()//我叫undefined,我今年18岁test(1)//我叫1,我今年18岁test(1,2,3)//我叫1,我今年2岁,多余的参数若没有形参获取,相当于什么都没有做test(1,2,)//我叫1,我今年2岁test(1,)//我叫1,我今年18岁//可以得出参数少的或者多的,都是从左边参数获得//没获得的就是undefined,逗号只是用来分割,无其他作用,写或者不写,并不会造成影响//但这个逗号在{}里面可以防止忘记写逗号而使得数据不对//因为{}里面必须是一起的(如key的单词之间不可换行,不可有空格),所以逗号有非常的保护作用
函数的不定参数:
定义方法时,不确定有几个参数?
functiontest(...arg){//使用三个点来定义一个不定长参数,实际上就是一个数组
console.log(`传入了${arg.length}个参数`);for(var i =0;i<arg.length;i++){
console.log(arg[i]);}}test(1);test(1,2);test(1,2,3,4,5,6);test();test("郭","嘉",28);
箭头函数 :
箭头函数提供了一种更加简洁的函数书写方式,基本语法是:参数 => 函数体
// 传统varf1=function(a){return a*10;}
console.log(f1(10));// es6varf2=a=>a*10;//有返回值的可以直接这样
console.log(f2(20));// 当箭头函数一个参数时,()可以省略// 当箭头函数没有参数或者有多个参数,要用()括起来// 当箭头函数的函数体有多行语句,用{}括起来,表示代码块// 当只有一条语句,并且需要返回时,可以省略{},结果会自动返回varf3=(a,b)=>{let sum = a+b;return sum;}
console.log(f3(3,7));// 可以将f3进行简化varf4=(a,b)=> a + b;
console.log(f3(11,22));
import*as info from"./user.js"//通过*来批量接收,全部放入info里,是键值对形式,相当于info是一个对象,es6中,并没有存在以前版本的总体获取,所以只能这样,因为我是简化的而已
console.log(info.a);
console.log(info.b);
console.log( info.c());
默认导出:
可以将所有需要导出的变量放入一个对象中,然后通过default export进行导出
exportdefault{name:"换行",eat(){return"吃点啥"}}
import p from"./person.js";
console.log(p.name,p.eat())//前面我们知道es6没有总体获取,所以为了进一步满足,即出现了export default,来解决这个问题,实际上之前是module.exports也不是简便的,那么es6也不是
上面注意注意转码(除非可以直接识别)
重命名export和import:
如果导入的多个文件中,变量名字相同,即会产生命名冲突的问题
为了解决该问题,ES6为提供了重命名的方法,当你在导入名称时可以这样做:
/*******************student1.js**************************/exportlet name ="我是来自student1.js";/*******************student2.js************************/exportlet name ="我是来自student2.js";//export可以导出后面定义的变量,具体怎么定义,看你操作/*******************test_student.js************************/import{name as name1}from'./student1.js';import{name as name2}from'./student2.js';//一般可以分开操作也行,逗号隔开即可
console.log( name1 );// 我是来自student1.js
console.log( name2 );// 我是来自student2.js