新的数据类型Symbol

1. 概述

2.简单的用法

  • 最简单的声明
let a=Symbol();
console.log(a);//Symbol()
  • 每一个都是独一无二
let a=Symbol()
let b=Symbol()
console.log(a===b)//false

3.Symbol.for(),Symbol.keyFor()

let a=Symbol.for('fw')
let b=Symbol.for('fw')
console.log(a===b);//true Symbol("bar") === Symbol("bar")//false
let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo" let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

4.作为属性名的 Symbol

let testKey=Symbol();

// 第一种写法
let a={};
a[testKey]='hello world'; // 第二种
let a={
[testKey]:'hello world'
} // 第三种
let a={};
Object.defineProperty(a,testKey,{value:'hello world'}) // 以上写法得到同样的结果
console.log(a[testKey]);//hello world

注意,Symbol 值作为对象属性名时,不能用点运算符。

  • demo1
const mySymbol = Symbol();
const a = {}; a.mySymbol = 'Hello!';
a[mySymbol] // undefined
a['mySymbol'] // "Hello!"
  • demo2
let a=Symbol('symbolA');

let obj={
[a]:1,
a:2
}
// 各种写法的结果
obj.a //2
obj['a']//2
obj[a] //1

5.使用场景(实例)

  • 旧写法
function getArea(shape, options) {
let area = 0;
switch (shape) {
case 'Triangele':
area = options.w * options.h / 2;
break;
case 'Squire':
area = options.w * options.h;
break;
/**more code */
}
return area;
}
getArea('Squire',{w:10,h:2});//20
  • 新写法
const shapeType = {
Triangle: Symbol(),
Squire: Symbol()
}
function getArea(shape, options) {
let area = 0;
switch (shape) {
case shapeType.Triangle:
area = options.w * options.h / 2;
break;
case shapeType.Squire:
area = options.w * options.h;
break;
/**more code */
}
return area;
}
getArea(shapeType.Squire, { w: 10, h: 2 });

参考

05-28 12:00