Skip to content

8 对象扩展

8.1 属性的简洁表示

let a = 'a1';
let b = { a };

8.2 属性名表达式

a.f = true
a['f'+'un'] = true

8.3 Object.is()

用于判断两个值是否严格相等在 ES5 中==和===就可以比较,但是有一个缺点前者会自动转换裂隙后者 NaN 不等于自身 +0 = -0

Object.is('a','a') //true
Object.is({},{}) false

//如果用=判断结果相反
Object.is(+0,-0) false
Object.is(NaN,NaN) true

8.4 Object.assign()

合并对象可枚举的属性

let a = {a: 1}
let b = {b: 2}
Object.assign(a,b)
//若属性同名则后面的会覆盖前面的属性

9symbol

9.1 介绍

ES6 引入 Symbol 作为一种新的原始数据类型,表示独一无二的值,主要是为了防止属性名冲突。 ES6 之后,JavaScript 一共有其中数据类型: Symbol、 undefined、 null、 Boolean、 String、 Number、 Object。

  • Symbol 函数不能用 new,会报错。由于 Symbol 是一个原始类型,不是对象,所以不能添加属性,它是类似于字符串的数据类型。
let a =Symbol();
typeof a //symbol
let b =Symbol()
a===b //false
let c = Symbol('hello')
String(c) //'Symbol(hello)'

9.2symbol 作为属性名

let a = Symbol()
let c = Symbol()
let b = {}
b[a] = 'hello' //注意不支持点只支持括号
let b = {
    [a]: 'hello'
}
let b = {
    [c]: function() {
        return 1
    }
}
//或者
let b = {
    [c](){
        return 1
    }
}

9.3 应用: 消除魔术字符串

let a = Symbol();
function fn(k) {
    if(k==a) {
        return true
    }
    return false
}
fn(a)

9.4 遍历属性名字

Symbol 作为属性名遍历,不出现在 for...in、 for...of 循环,也不被 Object.keys()、 Object.getOwnPropertyNames()、 JSON.stringify()返回。

let a = Symbol(),b = Symbol()
let obj = {
    [a]: 'aaa',
    [b]: bbb
}
for(let k of Object.values(object)) {
    console.log(k) //无输出
}

let obj2 = Object.getOwnPropertySymbols(obj)
//obj [Symbol(a),Symbol(b)]

使用Reflect.ownKeys方法获取键名
Reflect.ownKeys(a) //[Symbol()]

9.5Symbol().for() 、Symbol().keyFor()

let a =Symbol().for('aa');
let b = Symbol().for('aa')
Symbol.for('aa') === Symbol.for('aaa') //true
Symbol('aa') === Symbol('aa') //false