1,JS的解构赋值是ES6新增的一种赋值方法,一般分为对象解构与数组解构两种形式;
对象解构赋值:
let obj = {
x: 'Json',
y: 25,
}
let {x, y} = person
console.log(x,y)// Json 25
var o = {p: 42, q: true}
var {p: foo, q: bar} = o// 将o的p值赋给变量foo,将o的q值赋值给变量bar。
var {p: foo, q: bar} = o等价于({p: foo, q: bar} = o)
数组结构赋值:
let [x, y] = ['a', 'b', 'c']
console.log(x,y)// a b
注意点:
1,解构赋值等号两边结构需要一样,所有变量才能正常解析赋值;
2,若左边结构少于右边,左边按结构赋值,右边多余不管;
3,若右边结构少于左边,左边结构将不赋值,为undefined,若左边给默认值将为默认值,如 let {x,y = 3} = {1}x = 1, y = 3
4,凡是有默认值,若正常赋值,默认值会被覆盖;
4,不能将数组解构赋值给对象的解构赋值;如:const {x, y} = ['a', 'b'];x,y值将为undefined.
一、树结构定义一颗树,JS中常见的树形数据结构如下,children属性对应的是子树
let tree = [
{
id: '1',
name: '节点1',
children: [
{
id: '1-1',
name: '节点1-1'
}
]
},
{
id: '2',
name: '节点2',
children: [
{
id: '2-1',
name: '节点2-1'
},
{
id: '2-2',
name: '节点2-2',
children: [
{
id: '2-2-1',
name: '节点2-2-1'
}
]
}
]
},
{
id: '3',
name: '节点3'
}
]
二、深度优先遍历(DFS)
1、递归实现
function treeIterator(tree, func) {
tree.forEach((node) =>{
func(node)
node.children &&treeIterator(node.children, func)
})
}
实现逻辑简述:定义treeIterator函数,传入tree(树)和func(回调函数)两个参数,遍历tree数组,执行回调函数,如果当前节点存在children,则递归调用。
函数调用验证:调用treeIterator函数,传入上文定义好的树结构数组,打印出每个节点的name值。
treeIterator(tree, (node) =>{
console.log(node.name)
})
控制台打印结果如下:
2、循环实现
function treeIterator(tree, func) {
let node, curTree = [...tree]
while ((node = curTree.shift())) {
func(node)
node.children &&curTree.unshift(...node.children)
}
}
实现逻辑简述:
(1)定义node作为当前节点,curTree为传入的树(不影响原数组tree);
(2)执行while循环,curTree数组第一个元素从其中删除,并返回第一个元素赋值给node;
(3)①执行回调函数;②如果当前节点存在子树,则追加到curTree数组的开头,继续执行循环,直到curTree没有元素为止。
函数调用验证:参考上述递归实现验证,方式和结果一致。
三、广度优先遍历(BFS)
function treeIterator(tree, func) {
let node, curTree = [...tree]
while ((node = curTree.shift())) {
func(node)
node.children &&curTree.push(...node.children)
}
}
实现逻辑简述:和上述深度优先遍历的循环实现差不多。区别在于如果当前节点存在子树,则追加到list数组的末尾。
简单理解:解构赋值的意思是对应的位置,对应的 key 自动赋值。使用 () 还是 {},要看你定义的函数的参数是什么样的,具体看下面的例子。
第一种:当函数的参数是一个对象时,需要使用 {}。这样在函数里面能通过参数的相同的 key 获取到参数对象里的 key对应的值。
function demo({name, age}) { console.log(`姓名:${name}`) console.log(`年龄:${age}`)
}
demo({ name: '张三', age: 24})
第二种:当函数里的参数是多个时,这个时候用 ()。其实,这个不是结构赋值,真的只是 ES5 里的形参而已,只不过你的代码里用到了 ES6 中的参数默认值设置而已。
function demo(name = "张三", age = 30) { console.log("姓名:" + name) console.log("nianl:" + age)
}
demo()