ES6中新增的数据类型 Symbol

ES6之前,基本数据类型有五种 UndefinedNullStringNumberBoolean;引用数据类型有一种 Object。但在ES6之后,新增了一种基本数据类型 Symbol

Symbol是什么?

Symbol用来表示独一无二的值,创建一个符号。

console.log(Symbol())


// Symbol()

有什么特点?

没有字面量的写法
const syb = Symbol()

新的数据类型,typeof返回的是symbol
console.log(typeof Symbol())

// Symbol

Symbol函数得到的符号永远不会相等,不管符号描述是否相同
const syb1 = Symbol("abc");
const syb2 = Symbol("abc");
console.log(syb1, syb2)
console.log(syb1 === syb2)

// Symbol(abc) Symbol(abc)
// false

Symbol可以作为对象属性名,这种属性名叫符号属性。
const sex = Symbol();
const obj = {
    name: 'robbit',
    age: 20,
    [sex]: '男'
}

for (var key in obj) {
    console.log(key)
}

// name age

在这里插入图片描述


符号属性是不可枚举的。
const sex = Symbol();
const obj = {
    name: 'robbit',
    age: 20,
    [sex]: '男'
}

for (var key in obj) {
    console.log(key)
}

// name age

针对获取符号属性名的API
const sex = Symbol();
const obj = {
    name: 'robbit',
    age: 20,
    [sex]: '男'
}
console.log(Object.getOwnPropertySymbols(obj))

// [Symbol()]

符号类型无法被隐式转换,数学运算,字符串拼接等都不可以
const syb = Symbol();
console.log(syb + 10)

// TypeError: Cannot convert a Symbol value to a number

Symbol 的API

共享符号 Symbol.for("符号描述")

如果符号描述相等,则可以得到同一个符号

const syb1 = Symbol.for("abc");
const syb2 = Symbol.for("abc");
console.log(syb1, syb2)
console.log(syb1 === syb2)

// Symbol(abc) Symbol(abc)
// true
返回共享符号的值 Symbol.keyFor("符号描述")

从注册表返回 token 字符串

Symbol.keyFor(Symbol.for("abc"))

// abc

内置 symbol

Symbol.hasInstance 判断对象的构造器
function A() {}
Object.defineProperty(A, Symbol.hasInstance, {
    value: function(obj) {
        return false;
    }
})
const obj = new A();
console.log(obj instanceof A)

// false
Symbol.isConcatSpreadable 配置concat()方法

内置的Symbol.isConcatSpreadable符号用于配置某对象作为Array.prototype.concat()方法的参数时是否展开其数组元素。

// 配置前
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6, 7]
const result = arr1.concat(arr2) //对两个数组拆分链接成新的数组
console.log(result)
//  [1, 2, 3, 4, 5, 6, 7]

// 配置后
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6, 7]
arr2[Symbol.isConcatSpreadable] = false; // 配置
const result = arr1.concat(arr2) 
console.log(result)

// [1, 2, 3, [4, 5, 6, 7, Symbol(Symbol.isConcatSpreadable): false]]
Symbol.toPrimitive

当一个对象转换为对应的原始值时,会调用此函数。

const obj = {
    a: 1,
    b: 2
}

obj[Symbol.toPrimitive] = function() {
    return 123
}
console.log(obj + 123)

// 246
Symbol.toStringTag

自己创建的类使用 toString 找不到 toStringTag 属性时只好返回默认的 Object 标签,加上 toStringTag 属性,你的类也会有自定义的类型标签。

class Person {
    [Symbol.toStringTag] = "Person"
}
const p = new Person()
console.log(p.toString())

// [object Person]
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值