let只作用在当前块级作用域内
使用let或者const声明的变量,不能再被重新声明
let不存在`变量提升`

    console.log(dad);
var dad = '我是爸爸!';//预定义undefined console.log(dad);
let dad = '我是爸爸!';//报错

生成十个按钮 每个按点击的时候弹出1 - 10
var 方法:

    var i = 0;
for (i = 1; i <= 10; i ++) {
(function(i) {
var btn = document.createElement('button');
btn.innerText = i;
btn.onclick = function() {
alert(i)
};
document.body.appendChild(btn);
})(i);
}

let方法:

    for (let i = 1; i <= 10; i ++) {
var btn = document.createElement('button');
btn.innerText = i;
btn.onclick = function() {
alert(i)
};
document.body.appendChild(btn);
}

ES6之前的作用域:全局作用域、函数作用域、eval作用域、ES6块级作用域


常量声明后不能被修改

  const NAME = '小明';
NAME = '小红';//报错

q: 怎么防止常量为引用类型的时候能被修改的情况
Object.freeze()

    const xiaoming = {
age: 14,
name: '小明'
};
Object.freeze(xiaoming);
console.log(xiaoming);
xiaoming.age = 22;
xiaoming.dd = 11;
console.log(xiaoming); const ARR = [];
Object.freeze(ARR);
ARR.push(1);
console.log(ARR);

Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性

    var obj1 = {
a: 1,
b: 2
} var obj2 = Object.create(obj1); obj2.c = 3;
obj2.d = 4; for (let i in obj2) {
if (obj2.hasOwnProperty(i)) {
document.body.innerHTML += (i + ': ' + obj2[i] + '<br>');
}
}

数组的解构赋值

    const arr = [1, 2, 3, 4];
let [a, b, c, d] = arr;
console.log(a);

更复杂的匹配规则

    const arr = ['a', 'b', ['c', 'd', ['e', 'f', 'g']]];
const [ , b] = arr;
const [ , , g] = ['e', 'f', 'g']
const [ , , [ , , g]] = ['c', 'd', ['e', 'f', 'g']];
const [ , , [ , , [ , , g]]] = arr;

扩展运算符  ...

    const arr1 = [1, 2, 3];
const arr2 = ['a', 'b'];
const arr3 = ['zz', 1];
const arr4 = [...arr1, ...arr2, ...arr3];
const arr = [1, 2, 3, 4, 5, 6];
const [a, b, ...c] = arr;

默认值

    const arr = [1, null, undefined];
const [a, b = 2, c, d = 'aaa'] = arr;

交换变量

    [a, b] = [b, a];

接收多个函数返回值

    function getUserInfo(id) {
// .. ajax
return [
true,
{
name: '小明',
gender: '女',
id: id
},
'请求成功'
];
};
const [status, data, msg] = getUserInfo(123);

对象的解构赋值

    const obj = {
saber: '阿尔托利亚',
archer: '卫宫'
};
const { saber, archer1 } = obj;

稍微复杂的解构条件

    const player = {
nickname: '感情的戏∫我没演技∆',
master: '东海龙王',
skill: [{
skillName: '龙吟',
mp: '100',
time: 6000
},{
skillName: '龙卷雨击',
mp: '400',
time: 3000
},{
skillName: '龙腾',
mp: '900',
time: 60000
}]
}; const { nickname } = player;
const { master } = player;
const { skill: [ skill1, { skillName }, { skillName: sklName } ] } = player;
const { skill } = player;
const [ skill1 ] = skill;

结合扩展运算符

    const obj = {
saber: '阿尔托利亚',
archer: '卫宫',
lancer: '瑟坦达'
};
const { saber, ...oth } = obj;

对已经申明了的变量进行对象的解构赋值

    let age;
const obj = {
name: '小明',
age: 22
};
({ age } = obj);

默认值

    let girlfriend = {
name: '小红',
age: undefined,
};
let { name, age = 24, hobby = ['学习'] } = girlfriend;

字符串的结构赋值

    const str = 'I am the bone of my sword'; // 我是剑骨头
const [ a, b ,c, ...oth ] = str;
const [ ...spStr1 ] = str;

提取属性

    const { length, split } = str;

数值与布尔值的解构赋值

    const { valueOf: vo } = 1;
const { toString: ts } = false;

函数参数的解构赋值

    function swap([x, y]) {
return [y, x];
}; let arr = [1, 2];
arr = swap(arr);
    function Computer({
cpu,
memory,
software = ['ie6'],
OS = 'windows 3.5'
}) { console.log(cpu);
console.log(memory);
console.log(software);
console.log(OS); }; new Computer({
memory: '128G',
cpu: '80286',
OS: 'windows 10'
});

最后来一个高颜值弹框小案例~

按照国际惯例先放图

index.html

    <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./msg.css">
</head>
<body>
<button>弹个框</button>
<div id="t"></div>
<script src="./msg.js"></script>
<script>
document.querySelector('button').addEventListener('click', function() {
new $Msg({
content: '真的要删除吗...',
title: '确认删除',
type: 'wrong',
btnName: ['好的', '算了吧'],
confirm: function(e) {
console.log(this);
console.log(e);
new $Msg({
content: '删除成功<span style="color: red">~</span>',
type: 'success',
footer: false,
useHTML: true,
header: false
})
},
cancel: function(e) {
document.querySelector('#t').innerHTML += '取消了,';
}
});
});
</script>
</body>
</html>

msg.css

    /* 弹出框最外层 */
.msg__wrap {
position: fixed;
top: 50%;
left: 50%;
z-index:;
transition: all .3s;
transform: translate(-50%, -50%) scale(0, 0);
max-width: 50%; background: #fff;
box-shadow: 0 0 10px #eee;
font-size: 10px;
} /* 弹出框头部 */
.msg__wrap .msg-header {
padding: 10px 10px 0 10px;
font-size: 1.8em;
} .msg__wrap .msg-header .msg-header-close-button {
float: right;
cursor: pointer;
} /* 弹出框中部 */
.msg__wrap .msg-body {
padding: 10px 10px 10px 10px;
display: flex;
} /* 图标 */
.msg__wrap .msg-body .msg-body-icon{
width: 80px;
} .msg__wrap .msg-body .msg-body-icon div{
width: 45px;
height: 45px;
margin: 0 auto;
line-height: 45px;
color: #fff;
border-radius: 50% 50%;
font-size: 2em;
} .msg__wrap .msg-body .msg-body-icon .msg-body-icon-success{
background: #32a323;
text-align: center;
} .msg__wrap .msg-body .msg-body-icon .msg-body-icon-success::after{
content: "成";
} .msg__wrap .msg-body .msg-body-icon .msg-body-icon-wrong{
background: #ff8080;
text-align: center;
} .msg__wrap .msg-body .msg-body-icon .msg-body-icon-wrong::after{
content: "误";
} .msg__wrap .msg-body .msg-body-icon .msg-body-icon-info{
background: #80b7ff;
text-align: center;
} .msg__wrap .msg-body .msg-body-icon .msg-body-icon-info::after{
content: "注";
} /* 内容 */
.msg__wrap .msg-body .msg-body-content{
min-width: 200px;
font-size: 1.5em;
word-break: break-all;
display: flex;
align-items: center;
padding-left: 10px;
box-sizing: border-box;
} /* 弹出框底部 */
.msg__wrap .msg-footer {
padding: 0 10px 10px 10px;
display: flex;
flex-direction: row-reverse;
} .msg__wrap .msg-footer .msg-footer-btn {
width: 50px;
height: 30px;
border: 0 none;
color: #fff;
outline: none;
font-size: 1em;
border-radius: 2px;
margin-left: 5px;
cursor: pointer;
} .msg__wrap .msg-footer .msg-footer-cancel-button{
background-color: #ff3b3b;
} .msg__wrap .msg-footer .msg-footer-cancel-button:active{
background-color: #ff6f6f;
} .msg__wrap .msg-footer .msg-footer-confirm-button{
background-color: #4896f0;
} .msg__wrap .msg-footer .msg-footer-confirm-button:active{
background-color: #1d5fac;
} /* 遮罩层 */
.msg__overlay {
position: fixed;
top:;
right:;
bottom:;
left:;
z-index:;
background-color: rgba(0, 0, 0, .4);
transition: all .3s;
opacity:;
}

msg.js

    (function (window, document) {

      /**
* 暴露出去的构造函数
* @param {*} options
*/
let Msg = function (options) {
this._init(options);
} /**
* 初始化传入的配置后创建元素 并显示
* @param {*} param0
*/
Msg.prototype._init = function ({
content = '',
type = 'info',
useHTML = false,
showIcon = true,
confirm = null,
cancel = null,
footer = true,
header = true,
title = '提示',
contentStyle = {},
contentFontSize = '1.5em',
btnName = ['确定', '取消']
}) {
this.content = content;
this.type = type;
this.useHTML = useHTML;
this.showIcon = showIcon;
this.confirm = confirm;
this.cancel = cancel;
this.footer = footer;
this.contentStyle = contentStyle;
this.contentFontSize = contentFontSize;
this.title = title;
this.btnName = btnName;
this.header = header; this._createElement();
// 给dom上的按钮们和遮罩层绑定事件
this._bind({ el: this._el, overlay: this._overlay });
this._show({ el: this._el, overlay: this._overlay });
} /**
* 创建弹出框
*/
Msg.prototype._createElement = function () { let wrap = document.createElement('div');
wrap.className = 'msg__wrap'; const [ confirmBtnName, cancelBtnName ] = this.btnName; // 判断是否显示图标
const iconHTML = this.showIcon
? '<div class="msg-body-icon">\
<div class="msg-body-icon-' + this.type + '"></div>\
</div>'
: ''; // 判断是否显示弹出框底部按钮
const footerHTML = this.footer
? '<div class="msg-footer">\
<button class="msg-footer-btn msg-footer-cancel-button">' + cancelBtnName + '</button>\
<button class="msg-footer-btn msg-footer-confirm-button">' + confirmBtnName + '</button>\
</div>' : ''; const headerHTML = this.header
? '<div class="msg-header">\
<span>' + this.title + '</span>\
<span class="msg-header-close-button">×</span>\
</div>'
: ''; // 拼成完整html
const innerHTML = headerHTML +
'<div class="msg-body">'
+ iconHTML +
'<div class="msg-body-content"></div>\
</div>'
+ footerHTML; // 将容器内的html替换成弹出框内容
wrap.innerHTML = innerHTML; // 生成合并自定义的内容样式
const contentStyle = {
fontSize: this.contentFontSize,
...this.contentStyle
} // 获取内容dom
let content = wrap.querySelector('.msg-body .msg-body-content'); // 给内容容器加上自定义样式
for (let key in contentStyle) {
content.style[key] = contentStyle[key];
} // 给弹出框内容赋值
if (this.useHTML) {
content.innerHTML = this.content;
} else {
content.innerText = this.content;
} // 创建遮罩层
let overlay = document.createElement('div');
overlay.className = 'msg__overlay'; // 把dom挂到当前实例上
this._overlay = overlay;
this._el = wrap;
} /**
* 显示弹出框
* @param {*} param0
*/
Msg.prototype._show = function ({ el, overlay }) { // 把遮罩和弹出框插到页面中
document.body.appendChild(el);
document.body.appendChild(overlay); // 显示
setTimeout(function () {
el.style.transform = 'translate(-50%, -50%) scale(1, 1)';
overlay.style.opacity = '1';
console.log(1);
});
console.log(2);
} /**
* 绑定事件
* @param {*} param0
*/
Msg.prototype._bind = function ({ el, overlay }) {
// 保留this
const _this = this; // 隐藏弹出框
const hideMsg = function () {
_this._el.style.transform = 'translate(-50%, -50%) scale(0, 0)';
_this._overlay.style.opacity = '0'; setTimeout(function () {
document.body.removeChild(_this._el);
document.body.removeChild(_this._overlay);
}, 300);
} // 取消事件
const close = function (e) {
_this.cancel && _this.cancel.call(_this, e);
hideMsg();
} // 确定事件
const confirm = function (e) {
_this.confirm && _this.confirm.call(_this, e);
hideMsg();
} overlay.addEventListener('click', close); if (this.header) {
el.querySelector('.msg-header .msg-header-close-button').addEventListener('click', close);
} if (this.footer) {
el.querySelector('.msg-footer .msg-footer-cancel-button').addEventListener('click', close);
el.querySelector('.msg-footer .msg-footer-confirm-button').addEventListener('click', confirm);
}
} // 注册到全局对象
window.$Msg = Msg; })(window, document);

ES6基础与解构赋值(高颜值弹框小案例!)的更多相关文章

  1. es6基础(2)--解构赋值

    //解构赋值 { let a,b,rest; [a,b]=[1,2]; console.log(a,b); } //数组解构赋值 { let a,b,rest; [a,b,...rest]=[1,2, ...

  2. es6学习笔记--解构赋值

    昨天学习了es6语法中解构赋值,解构赋值在声明中和函数传参提高了灵活性和便捷性,值得掌握该语法. 概念: ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.   数组的解构 ...

  3. ES6 - Note2:解构赋值

    ES6的解构赋值就是利用模式匹配从按照一定模式的数组或者对象中提取值赋值给变量. 1.数组的解构赋值 在ES6以前,变量的赋值是直接指定的,以后可以这么来写,如下所示 let [a,b,c] = [1 ...

  4. ES6 变量的解构赋值

    数组的解构赋值     var [a,b,c] = [1,2,3];    左边是变量,右边是值,根据数据结构一一对应 只要等号两边的模式相同,左边的变量就会被赋予右边对应的值,必须模式相同 如果等号 ...

  5. ES6 - 变量的解构赋值学习笔记

    变量的解析赋值 数组的解析赋值 es6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这就称为解构. var a = 1; var b = 2; var c = 3; //在es6中允许写成 ...

  6. ES6的变量解构赋值

      前  言 ES6 解构赋值: ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构. 1.1 数组的结构赋值 1.1.1基本用法 JS中,为变量赋值直接指定.例如下面代码: ...

  7. 关于ES6 的对象解构赋值

    之 前写了关于ES6数组的解构 现在 go on ; 解构不仅可以用于数组,还可以用于对象: 对象的解构和数组有一个重要的不同.数组的元素是按次序排列的,变量的取值是由他的位置决定的:而对象的属性没有 ...

  8. ES6中的解构赋值

    在解释什么是解构赋值前,我们先来看一下, ES5 中对变量的声明和赋值. var str = 'hello word'; 左边一个变量名,右边可以是字符串,数组或对象. ES6 中增加了一种更为便捷的 ...

  9. ES6学习之 解构赋值

    最近看了一个vue的项目,发现作者大量使用了ES6的语法,包括async, Promise, Set, Map还有一些解构赋值, 才发现自己对于ES6的语法缺乏了总结和运用,看得有点艰难,所以重新学习 ...

随机推荐

  1. 机器学习总结-LR(对数几率回归)

    LR(对数几率回归) 函数为\(y=f(x)=\frac{1}{1+e^{-(w^{T}x+b)}}\). 由于输出的是概率值\(p(y=1|x)=\frac{e^{w^{T}x+b}}{1+e^{w ...

  2. nmcli几个常用命令

    1.nmcli connection 用于查看连接 2.nmcli device用于查看当前网络设备 3.nmcli connection modify用于修改当前连接配置 4.nmcli conne ...

  3. Deeplab

    Deeplab系列是谷歌团队的分割网络. DeepLab V1 CNN处理图像分割的两个问题 下采样导致信息丢失 maxpool造成feature map尺寸减小,细节信息丢失. 空间不变性 所谓空间 ...

  4. 用MYSQL的存储过程创建百万级测试数据表

    创建随机字符串函数,便于创建名称 DROP function if EXISTS rand_string; #创建一个指定字符个数的函数 create function rand_string(n I ...

  5. Spark中的RDD和DataFrame

    什么是DataFrame 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格. RDD和DataFrame的区别 DataFrame与RDD的主要区别在 ...

  6. 安装ik分词插件

    下载IK安装包 https://github.com/medcl/elasticsearch-analysis-ik https://github.com/medcl/elasticsearch-an ...

  7. Private Variable and Private Method - Python 私有变量 和 私有方法

    Private Variable and Private Method Python 不象 Java 那样, 通过 private 关键字创建私有属性, python 通过更简洁的实现了'私有属性', ...

  8. spark sql 执行计划生成案例

    前言 一个SQL从词法解析.语法解析.逻辑执行计划.物理执行计划最终转换为可以执行的RDD,中间经历了很多的步骤和流程.其中词法分析和语法分析均有ANTLR4完成,可以进一步学习ANTLR4的相关知识 ...

  9. hbase架构和读写过程

    转载自:https://www.cnblogs.com/itboys/p/7603634.html 在HBase读写时,相同Cell(RowKey/ColumnFamily/Column相同)并不保证 ...

  10. apache工具

    组件 功能介绍HttpClient 提供HTTP客户端与服务器的各种通讯操作. 现在已改成HttpComponentsIO io工具的封装.Lang3 Java基本对象方法的工具类包 如:String ...