问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

es6中以下代码为什么右边要有一个={ } 求详细解答

发布网友 发布时间:2022-04-22 10:27

我来回答

2个回答

懂视网 时间:2022-04-22 14:48

在ES6之前想要为变量赋值,只能指定其值,如下:

let a = 1;
let b = 2

而在ES6中可以写成这样,如下:

let [a,b] = [1,2]
// a = 1, b = 2

值得注意的是,等式两边的值要对等,这样左边的变量才会被赋上右边对应的值,如果不对等左边的值将会出现undefined,如下写法:

let [foo,[[bar],baz]] = [1,[[2],3]]
foo // 1
bar // 2
baz // 3

注意:只有左右两边的 格式一定要对等,数量可以不对等。

let [a,b,c] = [1,2]
a = 1, b = 2, c = undefined

let [a,,c] = [1,2,3]
a = 1, c = 3

let [a, ...b] = [1,2,3]
a = 1, b = [2,3]

let [a] = []
let [b,a] = [1]
a = undefined

还有一种情况,等号左边为数组,但是等号右边为其他值,将会报错。如下:

let [a] = 1;
let [a] = false;
let [a] = NaN;
let [a] = undefined;
let [a] = null;
let [a] = {};

以上都会报错

但是如果左边为数组,右边为字符串,将会取字符串的第一个下标的值

let [a] = '121321' a = '1'
let [a] = 'adgasg' a = 'a'

对于Set结构,同样可以使用数组的解构赋值。

let [x,y,z] = new Set([1,2,3])
x = 1, y = 2, z = 3

默认值

解构赋值允许指定默认值
let [a = 3] = [] // a:3
let [a = 3,b] = [,4] // a:3 b:4
let [a = 3,b] = [5,4] // a:5 b:4
特殊
let [a = 3] = [undefined] // a:3
let [a = 3] = [null] // a:null

Tips: 在es6中使用严格相等运算符,在结构赋值中如果需要默认值生效,则应对等的值为undefined的时候才会采用默认值,否则还是使用赋值。上面中null 不严格等于undefined++

如果默认值的赋值为一个表达式,只有当等号右边的赋值没有值为undefined的时候,才会取表达式中的值,如下:

function demo(){
 console.log('demo')
}

let [a = demo()] = [] // a: demo
let [a = demo()] = [1] // a : 1

对象的解构赋值

与数组的不同点是,数组的元素必须和赋值的元素要位置一致才能正确的赋值,而对象的解构赋值则是等号两边的变量和属性同名即可取到正确的值。否则值为 undefined
let {a,b} = {a:'23',b:'3'}
let {a,b} = {b:'3',a:'23'}

// 上面两个的值 都是 a: 23 b: 3

let {a,b} = {a:'3',c:'d'}
//a: 3 b: undefined

对象的解构赋值还有将某一个现有对象的方法赋值到一个新的变量,如下:

let {sin,cos} = Math
// Math 中的sin cos 方法将赋值给变量 sin cos

let {log} = console
// log(2) === console.log(2)

如果等号左边的变量名不能和等号右边的对象的属性名一致,则必须写成如下格式:

let {a:b} = {a:'ss'} // b:ss
//a是属性名,b才是实际赋值的变量名

对象的解构赋值一样是可以嵌套解构的,如下:

第一种:

let obj = {
 p:[
 'Hello',
 {y:'world'}
 ]
}

let {p:[x,{y}]} = obj 
// x: Hello, y: world

这边的p只是属性不是变量,如果p想赋值可以写成:

let {p,:[x,{y}]} = obj

第二种:
const a = {
 loc: {
 t :1,
 b :{
  c:1,
  d:2 
 }
 }
}
let {loc:{t,b:{c,d}}} = a
或者
let {loc,loc:{t,b,b:{c,d}}} = a
嵌套赋值
let o = {}, arr = []

({foo:o.prop,bar: arr[0]} = {foo:123,bar:true})
//o: 123, arr = [true]

如果解构模式 是嵌套的对象,如果子对象所在的父属性不存在,则会报错,如下:

let {foo:{bar}} = {baz:'baz'} //报错

默认值

let {x = 3} = {}
// x: 3

let {x,y = 5} = {x : 1}
// x: 1, y: 5

let {x: y = 5} = {}
// y = 5

let {x: y = 5} = {x : 4}
// y = 4

let {x: y = 'hhhh'} = {}
//y = 'hhhh'

Tips:以上左边 x为属性名,y为变量


let {x = 5} = {x: undefined}
// x: 5

let {x = 4} = {x: null}
// x: null

同数组一样遵循 严格等于 
只有右边为undefined的时候默认值才会生效

注意点:

1)不能将已声明的变量用于解构赋值,因为已经是一个代码块。

字符串的解构赋值

如果赋值的对象是数组,字符串将被分割为数组的格式,一一对应赋值
let [a,b] = 'ha'
// a = h , b = a

同时可以获得字符串的长度:

let {length:len} = '12121'
// len = 5

数值和布尔值的解构赋值

如果等号右边是数字或者布尔值 则转换成对象或者说,除了是数组和对象,其他值都将转换成对象,null 和 undefined 除外。如下:
let {t:s} = 123
let {t: s} = true

函数参数的解构赋值

function add([x,y]){
 return x+y
}
add([3,5]) // 8

[[3,5],[6,7]].map(([a,b]) => a + b)
//8 , 13

function m({x=3, y=4} = {}){
 return [x,y]
}
m({x:33,y:8}) // [33,8]
m({x:32})  // [32,4]
m({})  // [3,4]
m()  // [3,4]

function m({x,y} = {x=0,y=0}){
 return [x,y]
}
m({x:33,y:8}) // [33,8]
// 代替右边的 x:0, y:0 所以是传值 33 8

m({x:32})  // [32,undefined]
//因为传值替代右边的赋值,但是只有x没有y
//所以y是取 左边y的默认值,因为你没有赋值 为undefined

m({})  // [undefined,undefined] 
// 取左边x,y的默认值,因为没有赋值 为undefined

m()  // [0,0]
// 没有传值,使用本身的赋值 都是0

其他

不能使用圆括号的情况

  1. 变量声明语句
  2. 函数参数
  3. 赋值语句的模式

可以使用圆括号的情况

  1. 赋值语句的非模式部分,可以使用圆括号

解构赋值的用途

  1. 交换变量的值
  2. 从函数返回多个值
  3. 函数参数的定义
  4. 提取JOSN数据
  5. 函数参数的默认值
  6. 遍历Map结构
  7. 输入模块的指定方法

热心网友 时间:2022-04-22 11:56

我的理解是:{x = 0, y = 0} = {}是es6(ECMAscript2015)新增加的变量的解构赋值,因为右边是空的{},所以x和y会取到默认值0,具体是什么意思你可以自己去学习一下,一两句话说不清,推荐阮一峰的ES6入门教程。我这边用chrome调试的话,不传参数没有报错,返回[0,0],你可以试试用较高版本的chrome调试一下看看。追问大佬 我的意思是

function move({x = 0, y = 0} = {}) {
return [x, y];
}
里面 如果不写 = {}

就是
function move({x = 0, y = 0} ) {
return [x, y];
}
然后move()会报错 我想知道为什么要写 = {}

追答“{x=0,y=0}={}”是一个完整的解构赋值语句,而“{x=0,y=0}”不是。我是看不懂像你说的function move({x = 0, y = 0}) {return [x, y];}这种写法的意义何在,当然无意义也并不意味着会报错,从报错的信息来看,我们可以逆向推倒,我是这么理解的:在函数声明的时候,js解析器还是会把“{x=0,y=0}”理解成一个结构赋值的语句,而在函数调用阶段,发现这个结构赋值语句是不完整的(没有等号和一个可被遍历的对象),所以报错了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么一些男性喜欢要求伴侣叫自己爸爸? proteus8中怎么放置引脚标号 ...在proteus里不知道用什么表示?有没有什么proteus中专门的中英文对照... 甜蜜家园郑毅铭是什么身份 甜蜜家园第二季郑毅铭喜欢谁 瑞梦喜智能空调床垫适合人群 小孩可以用智能床垫吗 智能床垫适合哪些人用 我父亲今年59岁,有高血压和颈椎病的病史,最近一段时间感觉一躺下就偏... ...刚从医院治疗回来。我想买个枕头给他,不知买怎样的比较好?_百度知 ... 有什么正规的外汇平台吗 有人祝我生日快乐我互赞该说什么? 快乐互赞为什么添加不了被赞号? 快乐互赞能绑定多少个QQ号? 废水中主要有哪几种类污染物?结合我国的国情说明在生产和生活中节约用水的重要性?急。。。。谢谢 废水中的有毒有害的有机化合物有哪些/ 国税地税非税合并有何影响 国税地税合并利好谁? 国税地税合并怎么理解 国地税合并,都有哪些好处 国税地税合并有何好处? 莒县人快来看看,国税和地税合并后有什么好处 税务机构为什么要由国税地税分设转为合并? 怎样可以涨微博、陌陌的粉丝?? 国地税合并有什么意义 const { data : res } = await login(this.ruleForm) 这种方式是Es6的解构赋值吗? 那些大码40-44码高跟鞋,基本上都是男的买来男扮女装的对吗? 上海哪里有卖大码女鞋,40-43的? 最好是订做什么的,需要高跟鞋~~ 天津哪里卖大码高跟鞋 要好看舒适的高跟鞋,脚42码不好买,哪个牌子好? 人为什么要不停的长头发??? 什么工作效率 工作效率的意义 什么是工作效率比 请问,大师们,眼角旁边的脂肪粒 眼睛周围有脂肪粒!怎么办? 为什么眼角周围会经常长脂肪粒? 冬天晒干鱼好不好? es6解构赋值,默认值为表达式的时候怎么理解 新车多少公里算出磨合期 静电消除器危险吗 江湖绿水每从游,莫怪功名志未酬,桂窟已传芳信至,至梯直冠万人头 电视机的显像管好像是老化了,能修理吗,还是一定要更换? 江湖绿水每从游,莫怪功名志未酬,桂窟已传芳信至,至梯直冠万人头乍尔咨嗟 今方有谐秋江漾月 春地栽花 我的电视机屏幕一片蓝色,并闪烁,是显像管坏了吗? 古代都有江湖绿林好汉之说,为何到现在就没有这样的说法? 电视机 显像管坏了 旧的显像管电视机,屏幕上出现一个横向亮宽带,可能是哪些故障? 手游热血江湖绿色经验条代表什么 这就是江湖绿林盟怎么进 长沙河西岳麓区,哪里有学街舞的?