概述

为了减少对象的属性名冲突,ES6引入新的原始数据类型Symbol,JS的第七种数据类型。

Symbol 能够保证每个属性的名字都是独一无二,这样就能从根本上防止属性名冲突。

Symbol 值能够通过Symbol函数生成,也就是说,对象的属性名现在可以有2种类型,一种就是原来的字符串,另一种就是新增的Symbol 类型。

let s = Symbol()
console.log(s) // Symbol()
  • Symbol函数前不使用new命令,因为生成的Symbol是一个原始类型的值,不是对象,那么,也就不能添加属性(类似于字符串的数据类型)

  • Symbol函数乐意接受一个字符串作为参数,表示Symbol实例的描述,主要是为了在控制台显示,或者转化为字符串为了区分(注意,相同参数返回值是不相同的!)

let s1 = Symbol('s1')
let s2 = Symbol('s2')
let s3 = Symbol('s2')
console.log(s1,s2) // Symbol(s1) Symbol(s2)
console.log(s1.toString(),s2.toString()) // Symbol(s1) Symbol(s2)
console.log(s2 == s3) // false
console.log(s2 === s3) // false

作为属性名的Symbol

Symbol值可以作为标识符用于对象的属性名,保证不会出现同名的属性。这对于一个对象有多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。

let mySymbol = Symbol()
/** 第一种写法 */
let a1 = {}
a1[mySymbol] = 'holle!'
/**第二种写法 */
let a2 = {
[mySymbol]: 'holle!'
}
/**第三种写法 */
let a3 = {}
Object.defineProperty(a3, mySymbol, { value: 'holle!'}) console.log(a1[mySymbol]) // holle!
console.log(a2[mySymbol]) // holle!
console.log(a3[mySymbol]) // holle!

注意:Symbol值作为对象的属性名不能使用点运算符,点后面是字符串,不是Symbol类型!

同理。在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号中

Symbol定义常量

常量使用Symbol值的最大的好处就是,其他任何值都不可能有相同的值了。

let log = {}
log.levels = {
DEBUG: Symbol('debug'),
INFO: Symbol('info'),
WARN: Symbol('warn')
} console.log(log.levels.DEBUG, log.levels.INFO) // Symbol(debug) Symbol(info)

消除魔术字符串

魔术字符串是指,在代码中多次出现、与代码形成强耦合的某一个具体字符串或数值。风格良好的代码,应该尽量消除魔术字符串,而又含义清晰的变量代替。

/* 字符串Triangle就是一个魔术字符串。它多次出现,与代码形成“强耦合”,不利于将来的修改和维护。 */
function getArea(shape, options) {
let area = 0;
switch (shape) {
case 'Triangle': // 魔术字符串
area = .5 * options.width * options.height;
break; /* ... more code ... */
}
return area;
} getArea('Triangle', {
width: 100,
height: 100
}); // 魔术字符串

常用的消除魔术字符串的方法,就是把它写成一个变量。

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

我们把Triangle写成shapeType对象的triangle属性,这样就消除了强耦合。

可以发现shapeType.triangle等于哪个值并不重要,只要确保不会跟其他shapeType属性的值冲突即可。

const shapeType = {
triangle: Symbol()
};

属性名的遍历

Symbol 属性遍历:Object.getOwnPropertySymbols 方法获取指定对象的所有Symbol 属性。

let keySymbolName = Symbol('name')
let keySymbolAge = Symbol('age')
var a = {
[keySymbolName]: 'houfee',
[keySymbolAge]: 24
}
let arr = Object.getOwnPropertySymbols(a)
console.log(arr); //  [Symbol(name), Symbol(age)]

ES6 之 第七种数据类型Symbol的更多相关文章

  1. 【面试题】JS第七种数据类型Symbol详解

    JS第七种数据类型Symbol详解 点击打开视频讲解更加详细 一.什么是Symbol? Symbol是ES6中引入的一种新的基本数据类型,用于表示一个独一无二的值.它是JavaScript中的第 七种 ...

  2. Symbol -- JavaScript 语言的第七种数据类型

    ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制,保证 ...

  3. ES6学习笔记(八)第七种类型Symbol

    1.概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种 ...

  4. 细说 JavaScript 七种数据类型

    在 JavaScript 规范中,共定义了七种数据类型,分为 “基本类型” 和 “引用类型” 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined ...

  5. JavaScript 七种数据类型

    在 JavaScript 规范中,共定义了七种数据类型,分为 “基本类型” 和 “引用类型” 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined ...

  6. JavaScript的七种数据类型

    我知道这个话题网上说法非常多,甚至还有分出什么"Array,Function"之类的阿猫阿狗的类型.今天来整理这个话题的时候,先贴一张MDN官方的说法: 这个分法是对的,也是目前来 ...

  7. JavaScript中七种数据类型·中·一

    Standing on Shoulders of Giants; 说到JavaScript里的类型很容易就让人想起 42和"42",分别是string型和number型,但是他们可 ...

  8. php 七种数据类型介绍

    PHP有7个数据类型.七个类型: 字符串, 整数, 浮动, 布尔, 数组, 对象, 资源. 字符串 字符串保持字符,如“一”.“abc”,“www.manongjc.com”等.PHP字符串是区分大小 ...

  9. 面试中经常问到的Redis七种数据类型,你都真正了解吗?

    前言 Redis不是一个简单的键值对存储,它实际上是一个支持各种类型数据结构的存储.在传统的键值存储中,是将字符串键关联到字符串值,但是在Redis中,这些值不仅限于简单的字符串,还可以支持更复杂的数 ...

随机推荐

  1. java核心-多线程(9)- ThreadLocal类

    1.背景     ThreadLocal类我想一般的码农或初级程序员在平时开发中基本上接触不到,但是面试老师会问.往高级点走会遇到这个类.这个类不是为了解决资源的竞争问题,而是为每个线程提供同一个容器 ...

  2. 抓包工具fiddler的Https证书设置

    一.工具(option)--设置(setting)-- https-- 动作(actions)-- (open windows certificate manger)-- 搜索(fiddler)删除所 ...

  3. centos7安装google-chrome和chromedriver

    1.root用户下进入到etc/yum.repos.d目录下  [root@f7d6b9f2-1291-4d2f-8805-aef94deac9f7 yum.repos.d]# pwd  /etc/y ...

  4. 自制spring中bean加载机制,仅做笔记自用

  5. 侯捷C++学习(二)

    #include <iostream>using namespace std;class complex{ public: complex (double r= 0, double i = ...

  6. 关于连接查询主要是左右连接查询中,where和on的区别

    工作中,今天用到左连接查询,我自己造的数据,需要根据条件进行筛选,但是筛选不符合我的要求,最终发现是左右连接中where和on的区别,在作怪,工作中用的表关联太多,我下面简化要点,仅仅把注意点写个简单 ...

  7. js实现二叉查找树

    二叉树的特点:   像一颗树一样,从顶端往下延伸,最顶端的为根节点,每个节点下面子节点的数不超过两个,没有任何子节点的节点被称为叶子节点, 除了根节点和叶子节点的被称为中间节点. 二叉查找树: 每个节 ...

  8. Photoshop 更换证件照底色

    1.打开photoshop CS6. 2.打开照片 (上栏)文件---->打开 或者,直接把照片拖进ps中.  3.复制图层 右击背景,点击复制图层 (复制图层的作用是,如果对图层操作错误,可以 ...

  9. 201771010142-张燕 实验一 软件工程准备—<软件工程的初步了解和学习目标>

    实验一 软件工程准备 项目 内容 软件工程 https://www.cnblogs.com/nwnu-daizh/ 软件工程准备要求 https://www.cnblogs.com/nwnu-daiz ...

  10. Bulma CSS - CSS类

    Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 Bulma是一 ...