美文网首页前端笔记
基础类型:Symbol

基础类型:Symbol

作者: 好奇男孩 | 来源:发表于2018-05-14 21:58 被阅读0次

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值

let s = Symbol();

typeof s
// "symbol"

Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突

Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分

let s1 = Symbol('foo');
let s2 = Symbol('bar');

s1 // Symbol(foo)
s2 // Symbol(bar)

s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)"
// 没有参数的情况
let s1 = Symbol();
let s2 = Symbol();

s1 === s2 // false

// 有参数的情况
let s1 = Symbol('foo');
let s2 = Symbol('foo');

s1 === s2 // false
上面代码中,s1和s2都是Symbol

作为属性名的 Symbol

let mySymbol = Symbol();

// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';

// 第二种写法
let a = {
  [mySymbol]: 'Hello!'
};

// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });

// 以上写法都得到同样结果
a[mySymbol] // "Hello!"

注意:在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中

Object.getOwnPropertySymbols方法

返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。

const obj = {};
let a = Symbol('a');
let b = Symbol('b');

obj[a] = 'Hello';
obj[b] = 'World';

const objectSymbols = Object.getOwnPropertySymbols(obj);

objectSymbols
// [Symbol(a), Symbol(b)]

Symbol 值作为名称的属性,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法.

let size = Symbol('size');

class Collection {
  constructor() {
    this[size] = 0;
  }

  add(item) {
    this[this[size]] = item;
    this[size]++;
  }

  static sizeOf(instance) {
    return instance[size];
  }
}

let x = new Collection();
Collection.sizeOf(x) // 0

x.add('foo');
Collection.sizeOf(x) // 1

Object.keys(x) // ['0']
Object.getOwnPropertyNames(x) // ['0']
Object.getOwnPropertySymbols(x) // [Symbol(size)]

Symbol.iterator

对象的Symbol.iterator属性,指向该对象的默认遍历器方法

const myIterable = {};
myIterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};

[...myIterable] // [1, 2, 3]

对象进行for...of循环时,会调用Symbol.iterator方法,返回该对象的默认遍历器

相关文章

  • 静态类型&自定义类型&基础类型&对象类型

    静态类型 自定义类型 基础类型 null、nudefined、symbol、boolean、void 基础类型 对象类型

  • Flutter之基本语法一

    一. 基础数据类型 Symbol基础数据类型Symbol 在JavaScript中是将基本数据类型转换为唯一标识符...

  • 基础类型:Symbol

    ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值 Symbol 值通过Symbol函数生成。这就是...

  • 001|JavaScript ES6新特性之Symbol

    Symbol symbol是JavaScript中的一种基础数据类型(primitive types)。而Symb...

  • JS数据类型转换规则

    JS数据类型 基础类型 String Boolean Number Symbol Undefine Null(ty...

  • 数据类型总结

    基础数据类型 number、boolean、string、undefined、symbol、null 引用数据类型...

  • es6 — Symbol - 2020-06-08

    基础数据类型 可通过调用Symbol()函数来创建一个Symbol实例: 每个Symbol实例都是唯一的 场景1:...

  • es学习-Symbol-推荐看

    symbol的来头 symbol是第六种基础类型,厌倦了只能用String做key,现在可以用Symbol。 Sy...

  • Prop 验证

    提供的基础类型检查:String、Number、Boolean、Function、Object、Array、Symbol

  • js判断数据类型

    typeof 只能判断除了null的基础数据类型 symbol 是es6新增的基础数据类型 instanceof ...

网友评论

    本文标题:基础类型:Symbol

    本文链接:https://www.haomeiwen.com/subject/hdhsdftx.html