ES6中新增的数据类型 Symbol
在ES6
之前,基本数据类型有五种 Undefined
、Null
、String
、Number
、Boolean
;引用数据类型有一种 Object
。但在ES6
之后,新增了一种基本数据类型 Symbol
。
文章目录
- Symbol是什么?
- 有什么特点?
- 没有字面量的写法
- 新的数据类型,`typeof`返回的是`symbol`
- `Symbol`函数得到的符号永远不会相等,不管符号描述是否相同
- `Symbol`可以作为对象属性名,这种属性名叫符号属性。
- 符号属性是不可枚举的。
- 针对获取符号属性名的API
- 符号类型无法被隐式转换,数学运算,字符串拼接等都不可以
- Symbol 的API
- 共享符号 `Symbol.for(“符号描述”)`
- 返回共享符号的值 `Symbol.keyFor(“符号描述”)`
- 内置 symbol
- Symbol.hasInstance 判断对象的构造器
- `Symbol.isConcatSpreadable` 配置`concat()`方法
- Symbol.toPrimitive
- Symbol.toStringTag
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]
还没有评论,来说两句吧...