????????扩展运算符(spread)是三个点( ... )。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。
//声明一个数组 ...
const persons = ['小明', '小红', '小昂']
// => '小明', '小红', '小昂'
console.log(...persons) //小明 小红 小昂
// 1. 数组的合并
const student = ['王一', '张二']
const allPerson = [...persons, ...student]
console.log(allPerson) //[ '小明', '小红', '小昂', '王一', '张二' ]
const persons = ['小明', '小红', '小昂']
// 2. 数组的克隆
const persons2 = [...persons]
// 常用于页面将document.querySelectorAll('div')获取的伪数组转化为真正的数组
console.log([...'hello']);//[ 'h', 'e', 'l', 'l', 'o' ]
function push(array, ...items) {
array.push(...items)
console.log(array)//[ 4, 38, 6, 4, 8 ]
}
function add(x, y) {
return x + y
}
const numbers = [4, 38]
console.log(add(...numbers)) // 42
push(numbers,6,4,8)
// 扩展运算符后面还可以放置表达式。
let x = 3;
const arr = [
...(x > 0 ? ['a'] : []),
'b',
]
console.log(arr)//[ 'a', 'b' ]
// 如果扩展运算符后面是一个空数组,则不产生任何效果。
console.log(...[],2);//2
? ? ? ? ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。也就是说,JavaScript 除了原有的六种数据类型(undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object))之外,新增了一种。
? ? ? ?1. Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述, 主要是为了在控制台显示,或者转为字符串时,比较容易区分
let s1 = Symbol('foo')
let s2 = Symbol('bar')
console.log(s1) // Symbol(foo)
console.log(s2) // Symbol(bar)
console.log(s1.toString()) // Symbol(foo)
? ? ? ? ?2. 如果 Symbol 的参数是一个对象,就会调用该对象的 toString 方法 ,将其转为字符串,然后才生成一个 Symbol 值
const obj = {
toString() {
return 'abc'
}
}
const sym = Symbol(obj)
console.log(sym) // Symbol(abc)
? ? ? ? 3. Symbol 函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的 Symbol
// 没有参数的情况
let a1 = Symbol();
let a2 = Symbol();
console.log(a1 === a2); // false
// 有参数的情况
let n1 = Symbol('foo');
let n2 = Symbol('foo');
console.log(n1 === n2 );// false
? ? ? ? ?4. Symbol 值可以显式转为字符串,布尔值,但不能转换成数值
let sm = Symbol('My symbol');
console.log(String(sm) );// 'Symbol(My symbol)'
console.log(sm.toString()); // 'Symbol(My symbol)'
// Symbol 值也可以转为布尔值,但是不能转为数值
let b = Symbol();
console.log(Boolean(b)); // true
console.log(!b); // false
? ? ? ? 5. Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性
let mySymbol = Symbol()
// 第一种写法
let aa = {}
aa[mySymbol] = 'Hello!'
// 第二种写法
let bb = {
[mySymbol]: 'Hello!'
}
// 第三种写法
let cc = {}
Object.defineProperty(aa, mySymbol, { value: 'Hello!' })
// 以上写法都得到同样结果
console.log(aa[mySymbol]) // "Hello!"