let arr1 = [1, 3, 5, {age:7}]
console.log(...arr1) // 1 3 5 {age:7} (不是数组)
// 展开语法和 Object.assign() 行为一致, 执行的都是浅拷贝(只遍历一层)。
var arr2 = [...arr1]
arr1[3].age = 11;
console.log(arr2) // [1, 3, 5, {age:11}]
注意:
数组展开语法
和 Object.assign() 行为一致, 执行的都是浅拷贝
(只遍历一层)
// 展开运算符对于拷贝的对象在第一层是深拷贝
let person = { name: 'tom', age: 18, obj: { number: 123 } }
let person2 = { ...person } // 拷贝对象(构建对象字面量)
person.name = 'jerry' // 修改第一层值
person.obj.number = 456 // 修改第二层值
console.log(person) // 控制台:person:{name: 'jerry', age: 18, obj: { number: 456 } }
console.log(person2) // 控制台:person2:{name: 'tom', age:18, obj: { number: 456 }}
注意:
对象展开语法
对于拷贝的对象在第一层是深拷贝,嵌套的子层依旧是浅拷贝!
function foo(x,y, ...args) {
console.log(args) // [3,4]
}
foo(1,2,3,4)
var names = ["abc", "cba", undefined, "nba", "mba"]
// 1.1. 基本使用
var [name1, name2] = names
console.log(name1, name2) // abc cba
// 1.2. 顺序问题: 严格的顺序
var [name1, , , name4] = names
console.log(name1, name4) // abc nba
// 1.3. 解构出数组---很少用
// var [name1, name2, ...newNames] = names
// console.log(name1, name2, newNames)
// 1.4. 解构的默认值
var [name1, name2, name3 = "default"] = names
console.log(name1, name2, name3) // abc cba default
var obj = { name: "why", age: 18, height: 1.88 }
// 2.1. 基本使用
var { name, age, height } = obj
console.log(name, age, height) // why 18 1.88
// 2.2. 顺序问题: 对象的解构是没有顺序, 根据key解构
var { height, name, age } = obj
console.log(name, age, height) // why 18 1.88
// 2.3. 对变量进行重命名
var { height: wHeight, name: wName, age: wAge } = obj
console.log(wName, wAge, wHeight) // why 18 1.88
// 2.4. 默认值
var {
height: wHeight,
name: wName,
age: wAge,
address: wAddress = "中国"
} = obj
console.log(wName, wAge, wHeight, wAddress) // why 18 1.88 中国
function foo (arg1 = '默认值') {
console.log(arg1, '----------->arg1') // 打印null
// 判断undefined 和null
arg1 = (arg1 === undefined || arg1 === null) ? '默认值' : arg1
}
foo(null)
注意:如果参数是
null
,默认参数不会打印,只会打印null
!`
跟es6——>es5有关系,可以在babeljs.io网站在线转码查看下。
运算符 | 运算规则 | 案例 |
---|---|---|
&& |
与:同时为真 | false && true—> false |
|| |
或:一个为真 | false && true—> true |
! |
非:取反 | !false —> true |
(1)逻辑或:const result = a || b
上述代码,关于a || b
代码,js是如何处理的?
true
,就停止后续计算,返回这个操作数的初始值
。初始值
。(2)逻辑与:const result = a && b
false
,就停止后续计算,返回这个操作数的初始值
。初始值
。??
)||
和 ??
的区别const foo = ''
const res1 = foo || '默认值'
const res2 = foo ?? '默认值'
console.log(res1) // 默认值
console.log(res2) // ''(空字符串)
注意:
||
是先转Boolean
,之后根据Boolean
判断;
??
只判断null
和undefined
。
注意:可选链
?.
是在进行null
和undefined
判断时更加清晰和简洁用。