ECMAScript6学习笔记 ——let、const、变量解构赋值
let
- 不存在变量提升
- 通过let声明的变量仅在块级作用域内有效
- 不允许在同一个作用域内重复声明一个变量
防止值公用
var oUl = document.querySelectorAll('ul>li');
for(let i=0,len=oUl.length;i<len;i+=1){
oUl[i].onclick = function(){
console.log(`text:${this.innerText} index:${i}`);
};
}
不用再使用自执行函数了,兴奋。
typeof不再安全
直接typeof一个不存在的变量
console.log(typeof x); //undefined
而如果typeof一个后定义的let变量,则会报错
console.log(typeof x); //Uncaught ReferenceError: x is not defined
let x = 1;
解决方法:
try{
console.log(x);
}catch(err){
console.log(err);
}
let x = 1;
注意点
尽管通过let声明的变量不存在变量名提升,但只要在一个块级作用域中使用了let,那么就算这个let在定义之前使用,也不会到外部查找同名的变量。
var a = 10;
if(true){
console.log(a);
let a = 12;
}
不能在定义之前使用
a = 10;
console.log(a); //Uncaught ReferenceError: a is not defined
let a = 15;
块级作用域
在大括号中通过let或函数声明的变量不存在变量名提升,但因为一些历史原因,函数可能还是会存在变量提升的问题。
const
- 定义一个常量,不可更改,并且在初始化时就得赋值,不然报错。
- 只在当前作用域内有效
- 不存在变量提升
- 在同一个作用域中,不可重复声明
- 当值是一个对象时,对象的值还是可以改变的,只是说引用不可改变
只在当前作用域内有效
const a = 10;
{
const a = 15;
console.log(a); //15
}
console.log(a); //10
当值是一个对象时
const obj = {
name:'zmz',
love:[1,2,3]
};
console.log(obj.name); //zmz
obj.name = 'o-o';
console.log(obj.name); //o-o
如果不想让其进行修改,可以使用Object.freeze方法
const obj = Object.freeze({
name:'zmz',
love:[1,2,3]
});
console.log(obj.name); //zmz
obj.name = 'o-o';
console.log(obj.name); //zmz
从es6开始新增的一些声明命令,其变量名不再属于顶级对象window
变量解构赋值
按照一定的模式进行赋值
数组解构赋值
var [a,b] = [1,2];
console.log(a,b); // 1 2
左边变量,右边值,一一对应
var [a,...b] = [1,2,3,4,5];
console.log(a,b); // 1 [2,3,4,5]
...会将后面剩余的所有参数当作一个数组,但为了方便阅读,也可以用一个括号将值阔起来,如下代码
var [a,[...b]] = [1,[2,3,4,5]];
console.log(a,b); // 1 [2,3,4,5]
直接用...和使用[]还是有区别的,如下
var [a,[...b],c] = [1,[2,3,4,5],6];
console.log(a,b,c); // 1 [2,3,4,5] 6
而直接用...的
var [a,...b,c] = [1,2,3,4,5,6];
console.log(a,b,c); // Uncaught SyntaxError: Rest element must be last element in array
报错了。
...的真正目的
var [a,...b] = [1,[2],3,4];
console.log(a,b); //1 [Array[1], 3, 4]
...所做的两件事,将剩余的所有参数归为所有,并且其自身是一个数组。
解构不成功的值
当解构不成功值为undefined
var [a,b] = [1];
console.log(a,b); //1 undefined
当值多余时
属于不完全解构,只解构需要的。
默认值
只有当值全等与undefined时才会起作用
var [a,b = 2] = [1];
console.log(a,b); //1 2
var [a,b = 2] = [1,null];
console.log(a,b); //1 null
默认值也可以引用解构赋值中的其他变量,但是这个变量必须已经声明
let [a,b = a] = [1];
console.log(a,b); //1 1
let [a = b,b = 1] = [];
console.log(a,b); //Uncaught ReferenceError: b is not defined
对象解构赋值
对象的解构,变量和属性名对应即可,跟顺序无关。
var {a} = {haha:'haha',a:'hello'};
console.log(a); //hello
也可以起一个别名
var {haha:a} = {haha:'haha',a:'hello'};
console.log(a); //haha
最后被赋值的是a,而不是haha
对象解构也可以使用默认值。
字符串解构
var [a,b,c] = 'haa';
console.log(a,b,c); //h a a
解构的用途
1、简写
var {log,info,time,timeEnd} = console;
time('time');
log('Hello');
timeEnd('time');
2、使接口更友好,并且与顺序无关
function fn({name,age,hello}){
hello(name,age);
}
fn({
name:'老王',
age:23,
hello:function(name,age){
console.log('This is ' + name + ' ' + age); // This is 老王 23
}
});
3、交换变量
var a = 1;
var b = 2;
[a,b] = [b,a];
console.log(a,b); //2 1
4、函数默认值
function fn({a = 1,b}){
console.log(a,b); // 1 2
}
fn({b:2});
5、只取需要的值
var arr = [
{
title:1111,
love:{
one:'one_1',
two:'two_1'
}
},
{
title:2222,
love:{
one:'one_2',
two:'two_2'
}
}
];
for(let {title,love:{two}} of arr){
console.log(title,two);
}
完。
ECMAScript6学习笔记 ——let、const、变量解构赋值的更多相关文章
- ES6学习----let、const、解构赋值、新增字符串、模板字符串、Symbol类型、Proxy、Set
这篇es6的学习笔记来自于表哥 表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206 ES6就是JS6,JS的第 ...
- ES6 学习笔记(二)解构赋值
一.数组的解构赋值 1.基本用法 ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,该操作即为解构 如: let [a,b,c]=[1,2,3]; console.log(a,b,c) ...
- ES6变量解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构ES6之前我们申明多个变量需要按照下面的方法: let l a=1; let b=2; let c=3; let d=4; ...
- ES6学习笔记一:let、const、解构赋值
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7236342.html 感谢阮一峰老师的无私奉献,开源推动世界!教程地址:http://es6.ruanyife ...
- ES6笔记(3)-- 解构赋值
系列文章 -- ES6笔记系列 解构赋值,即对某种结构进行解析,然后将解析出来的值赋值给相关的变量,常见的有数组.对象.字符串的解构赋值等 一.数组的解构赋值 function ids() { ret ...
- ES6学习随笔--字符串模板、解构赋值、对象、循环、函数、Promise、Generrator
在线编译器:babel.github 在nongjs中使用 'use strict' let a = ; 运行node : node --harmony_destructuring xxx.js 代码 ...
- ES6的变量解构赋值
前 言 ES6 解构赋值: ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构. 1.1 数组的结构赋值 1.1.1基本用法 JS中,为变量赋值直接指定.例如下面代码: ...
- 【es6】变量解构赋值
1.数组解构赋值 let [a,b,c]=[1,2,3];//数组解构赋值,注意:左右两边格式需一致 let [a,b]=[1,2,3];//不完全解构,取位置靠前的值 let [a=1,b]=[un ...
- es6变量解构赋值的用途
这里是我觉得es6解构赋值,在平时我们写js的时候非常有用,而且经常用到的地方,能简化我们的代码,让写代码简介优雅易读; 用途 1.交换变量的值,太方便了这逼,写法不仅简介而且一看就明白 let [x ...
随机推荐
- iOS 面试题搜集
1.#import和#include的区别,@class代表什么? 2.浅拷贝和深拷贝区别是什么? 3.Objective-C中类别和类扩展的区别? 4.Objective-C堆和栈的区别? 5.内存 ...
- iOS APP性能优化
:应用启动时间 应用启动时,只加载启动相关的资源和必须在启动时加载的资源. :本地图片加载方式 本地图片加载常用方法有两种: a. [UIImage imageNamed:@"xx.png& ...
- 使用TextUtils.isEmpty简单化代码
如果让你判断一个文本框是否为空(null)或者没有任何值(length=0),你会怎么怎样去写代码,很多初学者可能会这样写: if(text==null || text.length==0) {... ...
- sass sourcemap详细使用
新发布的Sass 3.3版本,将Source Maps正式纳入了Sass中.这也成为Sass新版本的一大亮点,一大新功能.让广大Sass爱好者可以直接在浏览器中更容易调试自己的代码和Debug相关操作 ...
- 压缩png质量不改变像素
private static byte[] CompressionImage(Bitmap bitmap, Stream fileStream, long quality) { using (Syst ...
- bzoj 刷水
bzoj 3856: Monster 虽然是sb题,,但是要注意h可能<=a,,,开始忘记判了WA得很开心. #include <iostream> #include <cst ...
- txt文本变成html
file_name = 'x.txt' f = open(file_name,'r') file_result = 'x.html' str_head = " LINE CI UTIL&qu ...
- 网站中使用中文个性字库字体--@font-face解决方案探索 l(转)
最近的项目有用到特别中文字体,最终效果如下图: 红线标记处均为字体,可选中,交互起来,比图片方便太多了. 解决思路就是将体积巨大的中文字库,取子集,只包涵要使用的那部分文字,因此体积就很小了(包含10 ...
- 第三方框架之ThinkAndroid 学习总结(一)
ThinkAndroid是一个免费的开源的.简易的.遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单.快速的进行Android应用程序的开发,包含Android mvc.简易s ...
- Java中堆内存和栈内存详解
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...