1. ES6的解构
ES6中引入了解构赋值的操作,其作用是:将值从数组Array或属性从对象Object提取到不同的变量中
即分为两种情况:从数组Array中解构,以及从对象Object中解构
①.从数组中解构
const [a, b] = [1, 2]
//a = 1, b = 2
当然这些是基本的数组解构赋值,你还可以用逗号,进行跨值解构,用扩展运算符...进行多余项的解构等等
②.从对象中结构
const {a, b} = {a: 1, a: 2}
//a = 1, b = 2
这也是基本的对象结构赋值,不过在这里提一下,你仍然可以用扩展运算符...进行多余项的解构:
const {a, ...b} = {a: 1, b: 2, c: 3, d: 4}
//a = 1
//b = {b: 2, c: 3, d: 4}
③. 其他类型
当解构其他类型时,也是先将其他类型值转换为Array或者Object
const [a, b, c] = 'hello'
// a = 'h', b = 'e', c = 'l'
const {toString: a} = true
toString === Boolean.prototype.toString // true
2. ES6的函数默认参数
① 定义
函数默认参数允许在没有值或undefined被传入时使用默认形参。
栗子:
function foo (a = 1, b = 2) {
console.log(a, b)
}
foo ()// 1 2
Note: 形参默认是undefiend, 也就是说,在没有默认值时,a = undefiend, b = undefined;不过上面这个例子是没有值被传入的情况
undefiend被传入的情况如下:
function foo (a = 1, b = 2) {
console.log(a, b)
}
foo (undefined, window.valueIsNotDefined)// 1 2
② 默认值不是只有函数参数才能用
还是直接举个例子:
var {a = 1, b = 2} = {}
// a = 1, b = 2
var {a = 1, b = 2} = {a: 'hello'}
// a = 'hello', b = 2
其实解构赋值也是可以赋值默认值的;由此可见:
函数参数默认值的本质,还是解构赋值
3. 一个有趣的小栗子
说了那么多废话,终于要说到这个小栗子了。
Step 1
这是一种超常见的情况,有的时候,当我们定义函数参数的时候,可以去解构当前的参数
比如:
function foo ({ a, b }) {
console.log(a, b)
}
foo({ a: 1, b: 2 })// 1 2
Note: 可以看成做了以下操作:
const { a, b } = { a: 1, b: 2 };
console.log(a, b)
Step 2
更多的时候,我们不会满足于此,我们想要一个默认值
function foo ({a = 1, b = 2}) {
console.log(a, b)
}
foo({})// 1 2
Note: 可以看成做了以下操作:
const { a = 1, b = 2 } = {};
console.log(a, b)
问题 1
然而,我们实际使用时,不会用foo({})这种写法来表示参数缺省,我们大多数人采用foo()这种显而易见的写法,由此问题来了
function foo ({a = 1, b = 2}) {
console.log(a, b)
}
foo()
Uncaught TypeError: Cannot destructure property `a` of 'undefined' or 'null'.
at foo (<anonymous>:1:14)
at <anonymous>:4:1
通过换一种写法,不难发现错误原因:
const {a = 1, b = 2} = undefined // Error
解决方法:
其实,function foo ({a = 1, b = 2}) {}是对第一个参数的解构,那我们完全按照文章前面函数默认参数定义的那样,在参数为undefined或没有传入的时候,预先定义:
function foo ({a, b} = {a: 1, b: 2}) {
console.log(a, b)
}
foo()// 1 2
分析:可以看做以下写法
function foo (temp = {a: 1, b: 2}) {
var {a, b} = temp
console.log(a, b)
}
foo()// 1 2
问题 2
上面这种方法看似解决了问题,但当我们回过头来,重新运行foo({}),却出现了错误:
function foo ({a, b} = {a: 1, b: 2}) {
console.log(a, b)
}
foo({}) // undefined undefined
经历了前面情景的分析后,不难发现:此时的函数参数传入了一个有效值,所以temp不会去采纳默认值,而是去采纳有效的传入值{}; 而var { a, b } = {}的解构,自然而然会让a和b变为undefined
解决方法:
var { a = 1, b = 2 } = {}的形式,可以解决这种情况,原函数写作:
function foo ({ a = 1, b = 2 } = {}) {
console.log(a, b)
}
foo()// 1 2
foo({})//1 2
ES6学习 --函数参数默认值与解构赋值默认值的更多相关文章
-
es6 -- 与解构赋值默认值结合使用
参数默认值可以与解构赋值的默认值,结合起来使用. function foo({x, y = 5}) { console.log(x, y) } foo({}) // undefined 5 foo({ ...
-
ES6之主要知识点(二) 变量的解构赋值。默认值
引自http://es6.ruanyifeng.com/#docs/destructuring 数组解构赋值 默认值 对象解构赋值 用途 1.数组的解构赋值 let [a, b, c] = [1, 2 ...
-
ES6新特性2:变量的解构赋值
本文摘自ECMAScript6入门,转载请注明出处. ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring).不仅适用于var命令,也适用于let和c ...
-
【ES6】对象的新功能与解构赋值
ES6 通过字面量语法扩展.新增方法.改进原型等多种方式加强对象的使用,并通过解构简化对象的数据提取过程. 一.字面量语法扩展 在 ES6 模式下使用字面量创建对象更加简洁,对于对象属性来说,属性初始 ...
-
ES6 (一)变量声明方法 &; 解构赋值
就是最新的JavaScript 原来的是var,要求不严格,不能限制修改,函数级 es6要求严格 1.防止重复声明 let 变量=var const 常量 2.控制修改 const常量不能修 ...
-
es6笔记(3) 变量的解构赋值
基本概念 本质上是一种匹配模式,只要等号两边的模式相同,那么左边的变量就可以被赋予对应的值. // 以往定义接个变量的时候,需要这样 var a = 1, b = 2, c = 3; // 使用ES6 ...
-
ES6学习 第二章 变量的解构赋值
前言 该篇笔记是第二篇 变量的解构赋值. 这一章原文链接: 变量的解构赋值 解构赋值 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 解构 ...
-
js-ES6学习笔记-变量的解构赋值
1.ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 2.ES6允许写成:let [a,b,c] = [1,2,3];上面代码表示,可以从数 ...
-
ES6入门——变量的解构赋值
1.数组的解构赋值 以前为变量复制,只能直接指定值.现在ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 本质上,这种写法属于模式匹配,只要等 ...
随机推荐
-
[PHP源码阅读]explode和implode函数
explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出.在PHP中经常会用到这两个函数,因此 ...
-
weui 搜索框
点击搜索,会显示关键字取消按钮,输入文字,会在搜索框下,有相应的列表显示. HTML: <!DOCTYPE html> <html> <head> <meta ...
-
iOS开发系列--C语言之指针
概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面: 什么是指针 ...
-
使用代码为textview设置drawableLeft
xml中的textView中设置android:drawableLeft: <TextView android:id="@+id/bookTitle" android:lay ...
-
Laravel 使用多个数据库的问题。
这几天在使用Laravel 开发一个系统.这个系统连2个数据库.一个名为blog,一个名为center. center 数据库的作用是作为用户中心.可能会有其他几个系统相连,属于公用数据库.主要是用来 ...
-
【BZOJ-4353】Play with tree 树链剖分
4353: Play with tree Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 31 Solved: 19[Submit][Status][ ...
-
用CentOS 7打造合适的科研环境 :zhuan
这篇博文记录了我用CentOS 7搭建地震学科研环境的过程,供我个人在未来重装系统时参考.对于其他地震学科研人员,也许有借鉴意义. 阅读须知: 本文适用于个人电脑,不适用于服务器: 不推荐刚接触Lin ...
-
URL跳转与webview安全浅谈
URL跳转与webview安全浅谈 我博客的两篇文章拼接在一起所以可能看起来有些乱 起因 在一次测试中我用burpsuite搜索了关键词url找到了某处url我测试了一下发现waf拦截了指向外域的请求 ...
-
Android .9.png 的介绍
概述 .9.PNG是安卓开发里面的一种特殊的图片,这种格式的图片通过ADT自带的编辑工具生成,使用九宫格切分的方法.点九图是一种可拉伸的位图,android会自动调整它的大小,来使图像在充当背景时可以 ...
-
typescript-koa-postgresql 实现一个简单的rest风格服务器 —— typescript 开发环境配置
最近需要用 nodeJS 写一个后台程序,为了能够获得 IDE 的更多代码提示,决定用 typescript 来编写,随便也学习下 ts,在这记录下实现过程. 1.新建文件夹 typescript-k ...