学习TypeScrip13---symbol类型

74 阅读1分钟

自ECMAScript2015起,symbol成为了一种新的原始数据类型,就像number和string一样

symbol类型的值是通过Symbol构造函数创建的

可以传递参数作为唯一标识,只支持stringnumber类型的参数

let sym1 = Symbol()
let sym2 = Symbol("key")

Symbol的值是唯一的

const s1 = Symbol()
const s2 = Symbol()
s1 === s2   // false

用作对象属性的键

let sym = Symbol()

let obj = {
    [sym]: "value"
}
console.log(obj[sym])

使用symbol定义的属性,是不能通过如下方式遍历拿到的

const symbol1 = Symbol("666")
const symbol2 = Symbol("777")
const obj = {
  [symbol1]: 'xx',
  [symbol2]: 'yy',
  age: 19,
  sex: '女'
}

// 1. for in 遍历
for (const key in obj) {
  // 注意在console看key,是不是没有遍历到symbol1,symbol2
  console.log(key);
}

// 2. Object.keys 遍历
console.log(Object.keys(obj));

// 3. getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj));

// 4. JSON.stringify()
console.log(JSON.stringify(obj))

下面两种可以取到

// 1. 拿到具体的symbol属性,对象中有几个就可以拿到几个
console.log(Object.getOwnPropertySymbols(obj))

// 2. es6的Reflect拿到对象的所有属性
console.log(Reflect.ownKeys(obj))

Symbol.iterator 迭代器 和 生成器 for of

支持遍历大部分类型迭代器 arr nodeList argumetns set map 等

var arr = [1, 2, 3, 4]
let iterator = arr[Symbol.iterator]()

console.log(iterator.next()) //{ value: 1, done: false }
console.log(iterator.next()) //{ value: 2, done: false }
console.log(iterator.next()) //{ value: 3, done: false }
console.log(iterator.next()) //{ value: 4, done: false }
console.log(iterator.next()) //{ value: undefined, done: true }

以下这些是Symbol的属性

Symbol.hasInstance:方法,会被instanceof运算符调用。构造器对象用来识别一个对象是否是其实例。

Symbol.replace:布尔值,表示当在一个对象上调用Array.prototype.concat时,这个对象的数组元素是否可展开。

Symbol.Iterator:方法,被for-of语句调用,返回对象的默认迭代器

Symbol.replace:方法,被String.prototype.replace调用。正则表达式用来替换字符串中匹配的子串。

Symbol.search:方法,被String.prototype.search调用。正则表达式返回被匹配部分在字符串中的索引。