关注「松宝写代码」,精选好文,每日面试题

加入我们一起学习,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 函数的参数只是表示对当前 Symbol 值的描述,相同参数的 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、每日一题

或者个人站点链接:

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

The End

songEagle开发知识体系构建,技术分享,项目实战,实验室,每日一题,带你一起学习新技术,总结学习过程,让你进阶到高级资深工程师,学习项目管理,思考职业发展,生活感悟,充实中成长起来。问题或建议,请后台留言。

[每日一题]ES6中为什么要使用Symbol?的更多相关文章

  1. 【python】Leetcode每日一题-森林中的兔子

    [python]Leetcode每日一题-森林中的兔子 [题目描述] 森林中,每个兔子都有颜色.其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色.我们将这些回答放在 answers ...

  2. ES6中的新数据类型——Symbol

    今天小编和大家来聊一聊es6中新增的一个原始数据类型Symbol.在es5中原始数据类型(基本数据类型)有以下六种:Undefind.Null.Bool. String.Number.Object.今 ...

  3. [每日一题]面试官问:谈谈你对ES6的proxy的理解?

    [每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  4. 「每日一题」面试官问你对Promise的理解?可能是需要你能手动实现各个特性

    关注「松宝写代码」,精选好文,每日一题 加入我们一起学习,day day up 作者:saucxs | songEagle 来源:原创 一.前言 2020.12.23日刚立的flag,每日一题,题目类 ...

  5. 「每日一题」有人上次在dy面试,面试官问我:vue数据绑定的实现原理。你说我该如何回答?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 来源:原创 一.前言 文章首发在「松宝写代码」 2020. ...

  6. [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  7. [每日一题]面试官问:for in和for of 的区别和原理?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  8. LeetCode每日一题打卡组队监督!刷题群!

    近 2000 人已经加入共同刷题啦! 群友每天都会在群里给大家讲解算法题 每周日「负雪明烛」组织直播讲题 我相信来看我博客的大部分人都是通过LeetCode刷题过来的.最近发现LeetCode中文网站 ...

  9. PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数

    PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数 最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可 ...

随机推荐

  1. 从零开始了解多线程知识之开始篇目 -- jvm&volatile

    CPU多核缓存存储结构图 电脑存储结构概念 多CPU 一个现代计算机通常由两个或者多个CPU,如果要运行多个程序(进程)的话,假如只有 一个CPU的话,就意味着要经常进行进程上下文切换 因为单CPU即 ...

  2. zk下的kafka节点

    zk从某种程度上说是kafka的单点失效组件. /brokers:里面保存了Kafk集群的所有信息,包括每台broker的注册信息,集群上所有topic的信息等. /controller:保存了Kaf ...

  3. 使用OwnCloud建立属于自己私有的云存储网盘

    1.需要LAMP架构 实验环境:centos7.4 64位系统[root@xuegod63 ~]# yum install -y httpd php php-mysql mariadb-server ...

  4. 项目、地铁/公交、游戏签到、项目上线后发现新bug该怎么处理

    项目:1.提前分配好业务(每个人该干什么 )2.提前召开会议3.提前挑好人4.准备项目思维导图5.提前审阅项目6.为确保项目按期交付 把控好时间7.给员工提前打好招呼 (提醒加班)8.建立好安全机制9 ...

  5. 路由器/交换机Console口登录密码丢失后如何恢复

    Console口登录密码丢失后如何恢复 如果忘记了Console口登录密码,用户可以通过以下两种方式来设置新的Console口登录密码. 通过STelnet/Telnet登录路由器/交换机设置新的Co ...

  6. python将对象写入文件,以及从文件中读取对象

    原文地址: http://www.voidcn.com/article/p-fqtqpwxp-wo.html 写入文件代码: >>> import sys, shelve >& ...

  7. Unity使用transform.Rotate进行三维旋转角度出现偏差

    Unity使用transform.Rotate进行三维旋转角度出现偏差 情形 最开始遇到该问题的情况比较复杂,另写了一个例子.情形如下: 一个立方体上挂载脚本: transform.Rotate(25 ...

  8. 【GDKOI2014】JZOJ2020年8月13日提高组T1 阶乘

    [GDKOI2014]JZOJ2020年8月13日提高组T1 阶乘 题目 Description Input 第一行有一个正整数T,表示测试数据的组数. 接下来的T行,每行输入两个十进制整数n和bas ...

  9. 第3.8节 Python百分号占位符的字符串格式化方法

    一.    概念         格式化字符串就是将一些变量转换为字符串并按一定格式输出字符串,包括指定字符的位置.对齐方式.空位补充方式等.Python提供了多种字符串格式设置方法.本节先介绍一种简 ...

  10. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项标记flags相关方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeWidgetItem项可以通过flags()返回项的标记,返回值类型为类型Qt.ItemF ...