乐趣区

关于es6:每日一题ES6中为什么要使用Symbol

关注微信公众号「松宝写代码」,精选好文,每日面试题

退出咱们一起学习,day day up

作者:saucxs | songEagle

起源:原创

一、前言

2020.12.23 日刚立的 flag,每日一题,题目类型不限度。

点击上面图片,查看第 1 道「一道面试题是如何引发深层次的灵魂拷问?」

或者集体站点链接:

一道面试题是如何引发深层次的灵魂拷问

接下来是第 2 道:ES6 中为什么要应用 Symbol?

二、ES6 中为什么要应用 Symbol?

1、简述 ES6 中 Symbol 的概念

ES6 中曾经有 6 种数据类型:

  • Undefined
  • Null
  • 布尔值
  • 字符串
  • 数值
  • 对象

然而在 ES6 种新退出一种新的数据类型 Symbol。

Symbol 示意举世无双的值。

// 没有参数的状况
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false

// 有参数的状况
var s1 = Symbol('saucxs');
var s2 = Symbol('saucxs');
s1 === s2 // false

须要阐明一下:这里的字符 ’saucxs’ 是该 Symbol 的一个形容,然而并非两个参数都是 ’saucxs’。

2、简述 Symbol 的个性

  • 个性 1:Symbol 值通过 Symbol 函数生成,应用 typeof,后果为 “symbol”
var a = Symbol();
console.log(typeof a); // "symbol"
  • 个性 2:Symbol 函数前不能应用 new 命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。
  • 个性 3:instanceof 的后果为 false
var a = Symbol('foo');
console.log(a instanceof Symbol); // false
  • 个性 4:Symbol 函数能够承受一个字符串作为参数,示意对 Symbol 实例的形容,次要是为了在控制台显示,或者转为字符串时,比拟容易辨别。
var a = Symbol('saucxs');
console.log(a); // Symbol(saucxs)
  • 个性 5:如果 Symbol 的参数是一个对象,就会调用该对象的 toString 办法,将其转为字符串,而后才生成一个 Symbol 值。
const obj = {toString() {return 'abc';}
};
const a = Symbol(obj);   // Symbol(abc)
  • 个性 6:如果 Symbol 的参数是一个对象,就会调用该对象的 toString 办法,将其转为字符串,而后才生成一个 Symbol 值。
// 没有参数的状况
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false

// 有参数的状况
var s1 = Symbol('saucxs');
var s2 = Symbol('saucxs');
s1 === s2 // false
  • 个性 7:Symbol 值不能与其余类型的值进行运算,会报错。
var a = Symbol('saucxs');

console.log(`I am ${a}`); // TypeError: can't convert symbol to string
  • 个性 8:Symbol 值能够显式转为字符串。
const f = Symbol('saucxs')
f.toString()    // "Symbol(saucxs)"
String(f)       // "Symbol(saucxs)"
  • 个性 9:Symbol 值能够作为标识符,用于对象的属性名,能够保障不会呈现同名的属性。
var mySymbol = Symbol();

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

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

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

// 以上写法都失去同样后果
console.log(a[mySymbol]); // "Hello!"
  • 个性 10:Symbol 作为属性名,该属性不会呈现在 for…in、for…of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。然而,它也不是公有属性,有一个 Object.getOwnPropertySymbols 办法,能够获取指定对象的所有 Symbol 属性名。
var obj = {};
var a = Symbol('a');
var b = Symbol('b');

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

var objectSymbols = Object.getOwnPropertySymbols(obj);

console.log(objectSymbols);
// [Symbol(a), Symbol(b)]
  • 个性 11:应用同一个 Symbol 值,能够应用 Symbol.for。它承受一个字符串作为参数,而后搜寻有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。
var s1 = Symbol.for('saucxs');
var s2 = Symbol.for('saucxs');

console.log(s1 === s2); // true
  • 个性 12:Symbol.keyFor 办法返回一个已登记的 Symbol 类型值的 key。
var s1 = Symbol.for("saucxs");
console.log(Symbol.keyFor(s1)); // "saucxs"

var s2 = Symbol("saucxs");
console.log(Symbol.keyFor(s2) ); // undefined

3、为什么要应用 Symbol?

比方有这样一种场景,咱们想辨别两个属性,其实咱们并不在意,这两个属性值到底是什么,咱们在意的是,这两个属性相对要辨别开来!
例如:

const shapeType = {triangle: 'Triangle'};
function getArea(shape, options) { 
    var area = 0; 
    switch (shape) { 
      case shapeType.triangle:
      area = .5 * options.width * options.height; 
      break; 
    } 
    return area;
}

getArea(shapeType.triangle, { width: 200, height: 200});

这个时候,咱们仅仅是想辨别各种形态,因为不同的形态用不同的计算面积的公式。
这里应用的是 triangle 的名字叫做‘Triangle’,而是事实上咱们不想对 triangle 去顺便取个名,咱们只想要辨别 triangle 这个形态不同于任何其余形态,那么这个时候 Symbol 就派上用场啦!

const shapeType = {triangle: Symbol()
};

也就是说,咱们不必非要去给变量赋一个字符串的值,去辨别它和别的变量的值不同,因为去给每个变量取个语义化而又不同的值是一件伤脑子的事,当咱们只须要晓得每个变量的值都是百分百不同的即可,这时候咱们就能够用 Symbol。

还有能够使用在类的公有变量和公有办法中。

福利

1、内推福利

回复「校招」获取内推码

回复「社招」获取内推

回复「实习生」获取内推

后续会有更多福利

2、学习材料福利

回复「算法」获取算法学习材料

3、每日一题

  • 本文就是第 2 道「ES6 中为什么要应用 Symbol?」
  • 第 1 道「一道面试题是如何引发深层次的灵魂拷问?」

或者集体站点链接:

一道面试题是如何引发深层次的灵魂拷问

The End

songEagle 开发常识体系构建,技术分享,我的项目实战,实验室,每日一题,带你一起学习新技术,总结学习过程,让你进阶到高级资深工程师,学习项目管理,思考职业倒退,生存感悟,空虚中成长起来。问题或倡议,请公众号留言。

退出移动版