ES6------第三天(const命令、变量解构)
2017-12-01 00:00
537 查看
摘要: 慢不要紧,
重要的是学会。
路漫漫其修远兮,
加油。
http://es6.ruanyifeng.com/#docs/destructuring
一旦声明,常量值不能改变
一旦声明变量,就必须初始化,不能留到以后赋值
只在声明所在的块级作用域内有效
不提升
存在暂时性死区
只能在声明的位置后面使用
不能重复声明
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量
对于复合类型的数据(对象、数组),变量指向的内存地址,保存的只是一个指针,const只能保证指针是固定的
ES5中的 function
let
const
import
class
let/const/class声明的变量,不属于顶层对象的属性
(1)基本用法
1)完全解构
PS: 解构不成功,变量的值等于undefined
ES6中
2)不完全解构
3)Set结构
(2)默认值
1)解构赋值允许指定默认值
2)如果一个数组成员不严格等于undefined,默认值是不会生效的
3)如果一个数组成员是null,默认值就不会生效
4)如果默认值是一个表达式,那么这个表达式就是惰性的,只有在用到的时候,才会去求值
(2)等号左边的变量的次序与等号右边的同名属性的次序不一致,不影响取值
(3)变量没有对应的同名属性,则导致获取不到值
(4)对象解构的内部机制:先找到同名属性,然后再赋值给对应的变量
(5)真正被赋值的是后者
PS: foo是匹配的模式,baz才是变量,真正被赋值的是变量baz,而不是模式foo
(6)用于嵌套解构的对象
(7)指定默认值
(2)对length属性解构赋值
(2)undefined和null无法转为对象,解构赋值时报错
(2)使用默认值
建议:只要有可能,就不要再模式中放置圆括号
(1)不能使用圆括号的情况
1)变量声明语句
2)函数参数
3)赋值语句的模式
(2)可以使用圆括号的情况
赋值语句的非模式部分
(2)从函数返回多个值
1)返回一个数组
2)返回一个对象
(3)函数参数的定义
将参数和变量名对应起来
1)参数是一组有序值
2)参数是一组无序值
(4)提取JSON数据
(5)函数参数的默认值
(6)遍历Map解构
1)获取键值
2)只获取键
3)只获取值
(7)输入模块的指定方法
重要的是学会。
路漫漫其修远兮,
加油。
http://es6.ruanyifeng.com/#docs/destructuring
const命令
1.基本用法
声明只读变量一旦声明,常量值不能改变
一旦声明变量,就必须初始化,不能留到以后赋值
只在声明所在的块级作用域内有效
不提升
存在暂时性死区
只能在声明的位置后面使用
不能重复声明
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Test</title> <!--加载Traceur的库文件--> <script type="text/javascript" src="../js/traceur.js"></script> <!--将库文件用于浏览器--> <script type="text/javascript" src="../js/browerSystem.js"></script> <script type="text/javascript" src="../js/bootstrap.js"></script> <!--type="module":Traceur 编译器识别 ES6 代码的标志, 编译器会自动将所有type=module的代码编译为 ES5,然后再交给浏览器执行--> <script type="module"> // 一旦声明,常量值不能改变 /*const PI = 3.14; console.log(PI) PI = 3 // 写完就报错*/ // 只在声明所在的块级作用域内有效 /* if(true){ const YJ = 1 } alert(YJ) // YJ is not defined*/ // 只能在声明的位置后面使用 /* if(true){ console.log(YJ) // YJ is not defined const YJ = 3 }*/ // 不能重复声明 const yj = 1 const yj = 'hello' // Identifier 'yj' has already been declared </script> </head> <body> </body> </html>
2.本质
const保证的是变量指向的那个内存地址不得改动对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量
对于复合类型的数据(对象、数组),变量指向的内存地址,保存的只是一个指针,const只能保证指针是固定的
3.ES6声明变量的六种方法
ES5中的 varES5中的 function
let
const
import
class
顶层对象的属性
ES5中 var和function声明的变量是顶层对象的属性let/const/class声明的变量,不属于顶层对象的属性
global对象
作为顶层对象变量的解构赋值
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值1.数组的解构赋值
PS: 只要某种结构具有Iterator接口,都可以采用数组形式的解构赋值(1)基本用法
1)完全解构
PS: 解构不成功,变量的值等于undefined
ES6中
let [a, b, c] = [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3
2)不完全解构
let [a, b] = [1, 2, 3]; console.log(a); // 1 console.log(b); // 2
3)Set结构
let [x, y, z] = new Set(['a', 'b', 'c']); console.log(x); // a console.log(y); // b console.log(z); // c
(2)默认值
1)解构赋值允许指定默认值
let [foo = true] = [false]; console.log(foo); // false
2)如果一个数组成员不严格等于undefined,默认值是不会生效的
let [x = 1] = [undefined]; console.log(x); // 1
3)如果一个数组成员是null,默认值就不会生效
let [x = 1] = [null] console.log(x) // null
4)如果默认值是一个表达式,那么这个表达式就是惰性的,只有在用到的时候,才会去求值
function f(){ return 'hello' } let [x = f()] = [1]; console.log(x) // 1
2.对象的解构赋值
(1)变量必须与属性同名,才能取到正确的值let {foo, bar} = {foo: 'hello', bar: 'world'}; console.log(foo); // hello console.log(bar); // world
(2)等号左边的变量的次序与等号右边的同名属性的次序不一致,不影响取值
let {bar, foo} = {foo: 'hello', bar: 'world'}; console.log(foo); // hello console.log(bar); // world
(3)变量没有对应的同名属性,则导致获取不到值
let {baz} = {foo: 'hello', bar: 'world'}; console.log(baz); // undefined
(4)对象解构的内部机制:先找到同名属性,然后再赋值给对应的变量
let {foo: foo, bar: bar} = {foo: 'hello', bar: 'world'}; console.log(foo); // hello console.log(bar); // world
(5)真正被赋值的是后者
let {foo: baz} = {foo: 'hello', baz: 'world'}; console.log(baz); // hello
PS: foo是匹配的模式,baz才是变量,真正被赋值的是变量baz,而不是模式foo
(6)用于嵌套解构的对象
let obj = { p: ['hello', {y: 'world'}] }; let {p: [x, {y}]} = obj; console.log(x); // hello console.log(y); // world
(7)指定默认值
var {x = 3} = {}; console.log(x) // 3
3.字符串的解构赋值
(1)字符串被转换成了一个类似数组的对象const [a, b, c, d, e] = 'hello'; console.log(a); // h console.log(b); // e console.log(c); // l console.log(d); // l console.log(e); // o
(2)对length属性解构赋值
let {length: len} = 'hello'; console.log(len); // 5
4.数值和布尔值的解构赋值
(1)等号右边是数值和布尔值,先转为对象let {toString: s} = 123; console.log(s === Number.prototype.toString); // true
(2)undefined和null无法转为对象,解构赋值时报错
let {prop: x} = undefined; // 报错
5.函数参数的解构赋值
(1)函数传参以后,数组参数就被解构成变量function add([x, y]){ console.log(x + y) // 3 } add([1, 2])
(2)使用默认值
function move({x = 0, y = 0}){ console.log(x + y) } move({x: 3, y: 4}); // 7 move({}); // 0 move() // 报错
6.圆括号问题
ES6的规则:只要有可能导致解构的歧义,就不得使用圆括号建议:只要有可能,就不要再模式中放置圆括号
(1)不能使用圆括号的情况
1)变量声明语句
let [(a)] = [1]; // 报错
2)函数参数
function fun([(x)]){ console.log(x) // 报错 }
3)赋值语句的模式
({p: a}) = {p: 42} // 报错
(2)可以使用圆括号的情况
赋值语句的非模式部分
let b; [(b)] = [3]; console.log(b) // 3
7.用途
(1)交换变量的值let x = 1; let y = 2; [x, y] = [y, x]; console.log(x, y); // 2, 1
(2)从函数返回多个值
1)返回一个数组
function example(){ return [1, 2, 3]; } let [a, b, c] = example(); console.log(a); // 1 console.log(b); // 2 console.log(c); // 3
2)返回一个对象
function example(){ return {foo: 'hello', bar: 'world'} } let {foo, bar} = example(); console.log(foo); // hello console.log(bar); // world
(3)函数参数的定义
将参数和变量名对应起来
1)参数是一组有序值
function fun([x, y, z]){ console.log(x, y, z) // 1, 2, 3 } fun([1, 2, 3])
2)参数是一组无序值
function fun({x, y, z}){ console.log(x, y, z) // 1, 2, 3 } fun({z: 3, y: 2, x: 1})
(4)提取JSON数据
let jsonData = { id: 42, status: 'ok', data: [123,234] }; let {id, status, data: number} = jsonData; console.log(id, status, number) // 42 "ok" [123, 234]
(5)函数参数的默认值
(6)遍历Map解构
1)获取键值
const map = new Map(); map.set('first', 'hello'); map.set('second', 'world'); for(let [key, value] of map){ console.log(key + ' is ' + value); // first is hello // second is world }
2)只获取键
const map = new Map(); map.set('first', 'hello'); map.set('second', 'world'); for(let [key] of map){ console.log(key); // first // second }
3)只获取值
const map = new Map(); map.set('first', 'hello'); map.set('second', 'world'); for(let [, value] of map){ console.log(value); // hello // world }
(7)输入模块的指定方法
相关文章推荐
- 【ES6学习】— (1)ES6简介、let与const命令以及变量的解构赋值
- es6学习篇之 let和const命令 、变量的解构赋值
- const命令,全局变量的属性,变量的解构赋值
- ES6新特性 let、const、变量对象的解构赋值
- JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
- ES6中的const命令
- 笔记:ES6新特性-变量声明关键字:let和const
- js -- ES6(三)-- 变量的解构赋值(根据阮一峰ES6标准入门整理 更新中。。。)
- ES6变量解构赋值
- ES6学习笔记(let、const、变量的解构赋值、字符串扩展)
- ES6 变量解构赋值
- ES6学习2章:let和const命令
- 简说ES6中的变量定义:let、const
- ES6中的变量 let 和const的区别
- es6-变量的解构赋值
- ES6 变量的解构赋值
- ES6(三: 变量的解构赋值)
- 【ES6】变量的解构赋值
- ES6学习之变量的解构赋值
- ES6入门之let 和 const 命令