学习了es6语法的symbol类型,整理笔记,闲时复习。

Symbol

是es6新增的第七种原始数据类型(null,string,number,undefined,boolean,object),是为了在对象中对属性名滥用而导致的冲突问题。

ps: 既然是数据类型,不是对象,那么就不能用new命令,因此不能添加属性

let a = Symbol('a')
console.log(a) // Symbol(a)
console.log(typeof a) // symbol

简单来说:一旦声明一个变量为symbo类型,说明这个变量是唯一的,独一无二的,覆盖不了的

let a = Symbol('abc')
let b = Symbol('abc') let c = 'abc'
let d = 'abc' console.log(a === b) // false
console.log(c === d) // true
现在,在对象的属性名有两种类型,一个是以字符串的形式,另一个以Symbol的形式
若以symbol的形式去写,那么就要按照规范去写,加上中括号[],来表明使用了symbol类型,获取时,而不是按照字符串类型的属性名去获取,而以中括号去获取。
let name = Symbol()
let obj = {
[name]: 'peter',
age: 25,
name: 'Peter'
}
console.log(obj) // {age: 25, name: "Peter", Symbol(): "peter"}
console.log(obj.name) // Peter
console.log(obj[name]) // peter
通过例子可知:获取对象时,得到是两个不一样的name属性名,说明symbo和字符串是两种不一样的值,获取方式也不一样,按照点获取的是字符串,中括号是symbol类型的值。

关于在对象声明时对symbol类型的写法有三种:

let sy = Symbol();
// 第一种写法
let a = {};
a[sy] = 'Hello!';
console.log(a) // {Symbol(): "Hello!"}
//第二种写法
let a = {
[sy]: 'Hello!'
};
console.log(a) // {Symbol(): "Hello!"}
// 第三种写法
let a = {};
Object.defineProperty(a, sy, { value: 'Hello!' });
console.log(a) // {Symbol(): "Hello!"}
实例:

const shapeType = {
triangle: Symbol(),
rectangle: Symbol(),
}; function getArea(shape, options) {
let area = 0;
switch (shape) {
case shapeType.triangle:
area = .5 * options.width * options.height;
break;
case shapeType.rectangle:
area = options.width * options.height;
break;
}
return area;
} let a = getArea(shapeType.triangle, { width: 100, height: 100 });
let b = getArea(shapeType.rectangle, { width: 100, height: 100 });
console.log(a) //
console.log(b) //

Symbol方法:

Object.getOwnPropertySymbols() 返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值
symbol在对象上作为一个属性名,不会被循环的方法所识别,不会出现在for...in、for...of循环中,不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回,所以它有自己获取symbol值的方法。

let name = Symbol('name');
let age = Symbol('age')
let obj = {
[name]: 'peter',
[age]: 25
}
let a = Object.getOwnPropertySymbols(obj)
console.log(a) // [Symbol(name), Symbol(age)]

Reflect.ownKeys() 返回所有类型的键名,包括常规键名和 Symbol 键名

let name = Symbol('name');
let obj = {
[name]: 'peter',
age: 25,
enum: 2
}
console.log(Reflect.ownKeys(obj)) // ["age", "enum", Symbol(name)]

Symbol.for() 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。

这个方法就是重新使用已有symbol的值,在遍历判断时常用

let a = Symbol.for('abc');
let b = Symbol.for('abc');
let c = Symbol.for('ab');
console.log(a === b) // true
let a = Symbol.for('abc')
let b = Symbol('abc')
console.log(a) // Symbol(abc)
console.log(a === b) // false
由此可知:a虽然用Symbol.for声明了symbol类型,但是却和symbol声明不一样,说明两者不是同一个值。
 
 

对应的笔记和实例,我放到了GitHub,https://github.com/sqh17/notes

有什么问题请私信或留下评论,一起加油。

 
 
参考资料:
阮一峰大大的es6标准入门:http://es6.ruanyifeng.com

es6学习笔记--新数据类型Symbol的更多相关文章

  1. ES6学习笔记三:Symbol、Set、Map

    一:Symbol ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(Boolean). ...

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

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

  3. es6学习笔记--新数据结构Set,Map以及WeakSet,WeakMap

    在javascript中,存储数据的方式大部分就是以数组或者对象形式存储的,es6出现了4种新集合Set,Map,WeakSet,WeakMap来存储数据,简化了编程. 集合--Set 类似于数组,但 ...

  4. es6学习笔记-class之一概念

    前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...

  5. JS&ES6学习笔记(持续更新)

    ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...

  6. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  7. ES6学习笔记之块级作用域

    ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...

  8. ES6学习笔记(三):教你用js面向对象思维来实现 tab栏增删改查功能

    前两篇文章主要介绍了类和对象.类的继承,如果想了解更多理论请查阅<ES6学习笔记(一):轻松搞懂面向对象编程.类和对象>.<ES6学习笔记(二):教你玩转类的继承和类的对象>, ...

  9. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

随机推荐

  1. numpy模块中的sum(axis)方法

    1.sum函数声明 sum(a, axis=None, dtype=None, out=None, keepdims=<class 'numpy._globals._NoValue'>) ...

  2. java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...

  3. AM335x(TQ335x)学习笔记——触摸屏驱动编写

    前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱 ...

  4. freemarker自定义标签报错(六)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Encountered "\"\u4f60\u597d\uff01\& ...

  5. INF 右键安装驱动以及卸载

    INF 右键安装驱动以及卸载 之前写过一篇文章是关于INF文件详解的,大家可以参看INF文件详解,这次写的是关于INF右键安装,这样比较方便.卸载的话也是一句话,可以大大减少安装时间: 先将INF文件 ...

  6. 基于jQuery的一个提示功能的实现

    最近有点忙,没有时间更新自己的博客,只能说我在原地踏步了,不知道你们进步了没有? 今天给大家分享一个提示的实现,有点简单,适合小白同学学习.下面是效果图 提示的功能: 当鼠标进入“我的菜单”的子菜单时 ...

  7. 动态规划 POJ3616 Milking Time

    #include <iostream> #include <cstdio> #include <algorithm> using namespace std; st ...

  8. jsonp的案例

    一,转发一 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性.看起来不知道什么意思,实践一下就知道了. 1.随便建两个网页 一 ...

  9. javax顶层接口分析

    1.Servlet接口分析 此接口是Servlet的最顶层接口,其中定义了Servlet生命周期相关的方法,所有Servlet都必须实现.此接口中的方法有以下几个: public void init( ...

  10. Mybatis常见面试题

    Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是 ...