2.1 let
- 变量不能重复声明
- 块儿级作用域,只在代码块里有效 全局、函数、eval
- 不存在变量提升
- 不影响作用域链
{ let a = '爱学习'; function show(){ console.log(a); } show(); }
实践练习
let点击修改背景颜色
2.2 const
- 一定要赋初始值
- 一般常量使用大写(潜规则)
- 常量的值不能修改
- 块儿级作用域
- 对于数组和对象的元素的修改,不算做对常量的修改,不会报错
2.3 变量解构赋值
ES6 允许按照一定模式从数组和对象中提取值,对变量进行赋值,这就是结构赋值。
数组的解构
const demo = ['aaa','bbb','ccc','ddd']; let [a,b,c,d] = demo; console.log(a); console.log(b); console.log(c); console.log(d);
对象的解构
const person = { name: '赵本山', age: 66, show(){ console.log('哈哈哈哈'); } } let {name, age, show} = person; console.log(name); console.log(age); console.log(show); show(); // 为了方便调用方法 let {show} = person; show();
2.4 模板字符串
ES6 引入新的声明字符串的方式 【 ``】 反引号
- 内容中可以直接出现换行符
// 内容中可以出现换行符 let str = `aaabbbccc`
- 变量拼接
let boy = '王嘉尔'; let man = `${boy}是个大帅哥`; console.log(man);
2.5 简化对象写法
ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。
let name = '小明'; let study = function(){ console.log('爱学习'); }; const student ={ name, study, play(){ console.log('爱玩'); } };
2.6 箭头函数*
ES6 允许使用 【箭头】(=>)定义函数
let add = (a,b)=>{ return a+b; } let res = add(1,2); console.log(res);
注意事项
- this 是静态的,this 始终指向函数申明时所在作用域下的this 的值
function getName(){ console.log(this.name); } getName2 = ()=>{ console.log(this.name); } window.name = '爱学习'; const student = { name: '就是玩儿', } // 直接调用 getName(); // 爱学习 getName2(); // 爱学习 // call方法调用,可以改变this指向 getName.call(student); // 就是玩儿 getName2.call(student); // 爱学习
不能作为构造函数实例化对象
不能使用arguments变量
箭头函数的简写
let add = n => n+n;
省略小括号,当形参有且仅有一个的时候
省略花括号,当代码体只有一条语句的时候,此时 return 必须省略,而且语句的执行结果就是返回值
箭头函数实践
点击div 2s后背景颜色变为粉色
箭头函数实践{ this.style.background = 'orange'; },2000) })" _ue_custom_node_="true">
从数组arr 中返回偶数项
let arr = [1,2,5,16,23,52]; // 方式一 let res = arr.filter(function(item){ if(item % 2 === 0){ return true; }else{ return false; } }) // 方式二 let res = arr.filter(item =>{ if(item % 2 === 0){ return true; }else{ return false; } }) // 方式三 let res = arr.filter(item => item % 2 === 0) console.log(res);
总结:箭头函数适合与 this 无关的回调,例如定时器,数组的方法回调;
不适合与 this 有关的回调,例如事件回调,对象的方法。
2.7 函数参数默认值
- 形参初始值 具有默认值的参数,一般位置要靠后
function add(a,b,c=5){ return a+b+c; }; console.log(add(1,2,3)); // 6 console.log(add(1,2)); // 8
- 可以与解构赋值结合
function connect({host,username,password,port}){ console.log(host); console.log(username); console.log(password); console.log(port); } connect({ host: 'localhost', username: 'admin', password: 123456, port: 3306 })
2.8 rest参数
ES6 引入 rest 参数,用于获取函数的实参,用来代替 arguments
// es5 获取数组(返回对象形式) function arr(){ console.log(arguments); } arr('aaa','bbb','ccc'); // es6 rest参数(返回数组形式) function str(...args){ console.log(args); } str('bbb','aaa','ddd');
注:rest 参数必须放在参数的最后!!
function show(a,b,...data){ console.log(a); console.log(b); console.log(data); } show(1,2,3,4,5,6,7,8)
2.9 扩展运算符
介绍
【...】扩展运算符能将数组转化为逗号分隔的参数序列
// 声明一个数组 let boys = ['jackson','mark','bambam']; function show(){ console.log(arguments); } show(boys); show(...boys);
应用
// 1.数组的合并 let boy = ['小王','小明']; let girl = ['小红','小芳']; // let student = boy.concat(girl); let student = [...girl,...boy]; console.log(student); // 2.数组的克隆 let arr = ['aaa','bbb','ccc']; let str = [...arr]; console.log(str); // 3.将伪数组转化为真正的数组 let divs = document.getElementsByTagName('div'); let divArr = [...divs]; console.log(divArr);
2.10 Symbol
ES6 引入了一种新的数据类型 【Symbol】,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。
Symbol 特点:
- Symbol 的值是唯一的,用来解决命名冲突的问题
- Symbol 值不能与其他数据进行运算
- Symbol 顶柜的对象属性不能使用【for...in】循环遍历,但是可以使用 【Reflect.ownKeys】来获取对象的所有键名
let s = Symbol(); console.log(s, typeof s); // 方式一 let s1 = Symbol('爱学习'); let s2 = Symbol('爱学习'); console.log(s1 === s2); // false // 方式二 let s3 = Symbol.for('就是玩儿'); let s4 = Symbol.for('就是玩儿'); console.log(s3 === s4); // true
JavaScript七种数据类型:【USONB】
U:undefined
S:string Symbol
O:object
N:null number
B:boolean
Symbol 作用:给对象添加【独一无二的】属性和方法
let game = { name: '俄罗斯方块', up(){ console.log('改变形状'); }, down(){ console.log('快速下降'); } } // 声明一个变量 let methods = { up: Symbol(), down: Symbol() } game[methods.up] = function(){ console.log('我可以改变形状'); } game[methods.down] = function(){ console.log('我可以快速下降'); } console.log(game); let game2 = { name: '狼人杀', [Symbol('say')]: function(){ console.log('我可以发言'); } }; console.log(game2);
Symbol 内置值
除了定义自己使用的 Symbol 值以外, ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。
- Symbol.hasInstance
当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法
class Person{ static [Symbol.hasInstance](){ console.log('我被用来检测类型了!') } } let oo ={}; console.log(oo instanceof Person); // false
- Symbol.isConcatSpreadable
对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于 Array.prototype.concat() 时,是否可以展开
let arr = [1,2,3]; let arr1 = [3,2,1]; let arr2 = [4,5,6]; console.log(arr.concat(arr1)); arr2[Symbol.isConcatSpreadable] = false; console.log(arr.concat(arr2));
- Symbol.unscopables
该对象指定了使用 with 关键字时,哪些属性会被 with 环境排除
- Symbol.match
当执行 str.match(myObject) 时,如果该属性存在,会调用他,返回该方法的返回值
- Symbol.replace
当该对象被 str.replace(myObject) 方法调用时,会返回该方法的返回值
- Symbol.search
当该对象被 str.search(myObject) 方法调用时,会返回该方法的返回值
- Symbol.split
当该对象被 str.split(myObject) 方法调用时,会返回该方法的返回值
- Symbol.iterator
对象进行【for...of】循环时,会调用 Symbol.iterator 方法,返回该对象的默认遍历器
- Symbol.toPrimitive
该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值
- Symbol.toStringTag
在该对象上面调用 toString 方法时,返回该方法的返回值
- Symbol.species
创建衍生对象时,会使用该属性