ES6 Symbol数据类型的应用实例分析


Posted in Javascript onJune 26, 2019

本文实例讲述了ES6 Symbol数据类型的应用。分享给大家供大家参考,具体如下:

Symbol,是ES6中引入的新的数据类型,表示独一无二的值。在面向对象中,每个对象都有字符串类型的属性,新方法的名字就有可能与现有方法产生冲突。Symbol的引入保证每个属性的名字都是独一无二的,这样就从根本上防止属性名的冲突。

ES6之前对象属性的命名方法

var obj = {
 name:'Joh',
 'my name': 'Johnny'
}
console.log(obj.name); // Joh
console.log(obj['my name']); // Johnny

引入Symbol之后,变量可以不再重复

let name1 = Symbol('name');
let name2 = Symbol('name');
console.log(name1 === name2); // false

可以看出,虽然都是调用了Symbol函数,但是返回的Symbol类型的name1和name2并不相等

将Symbol类型转换为字符串类型

let name1 = Symbol('name');
let name2 = Symbol('name');
console.log(name1.toString());// Symbol(name)
console.log(String(name2)); // Symbol(name)

Symbol类型应用于对象的属性

let getName = Symbol('name');
let obj = {
 [getName]() {
  return 'Joh';
 }
}
console.log(obj[getName]()); // Joh

Symbol类型的属性具有一定的隐藏性

let name = Symbol('name');
let obj = {
 age:22,
 [name]:'Joh'
};
console.log(Object.keys(obj)); // 打印不出 类型为Symbol的[name]属性
// 使用for-in也打印不出 类型为Symbol的[name]属性
for(var k in obj) {
 console.log(k);
}
// 使用 Object.getOwnPropertyNames 同样打印不出 类型为Symbol的[name]属性
console.log(Object.getOwnPropertyNames(obj));
// 使用 Object.getOwnPropertySymbols 可以
var key = Object.getOwnPropertySymbols(obj)[0];
console.log(obj[key]); // Joh

使用Symbol类型模拟对象的私有属性

User 模块

'use strict';
let getName = Symbol('getName');
module.exports = class User {
 [getName]() {
  return 'Joh';
 }
 print() {
  console.log(this[getName]());
 }
}

测试User模块

'use strict';
const User = require('./User');
let user = new User();
user.print(); // Joh
let getName = Symbol('getName');
user[getName](); // getName is not defined 报错, 可知 Symbol 可以在面向对象中模拟私有属性

Symbol.for 和 Symbol.keyFor的应用

let name1 = Symbol.for('name');
let name2 = Symbol.for('name');
console.log(name1 === name2); // true
console.log(Symbol.keyFor(name1)); // name 备注:字符串类型的

使用Symbol.for 获取Symbol类型的值,使用Symbol.keyFor来获取之前的字符串

使用for-of来顺序输出数组的单项

let arr = ['a', 'b', 'c'];
for(let item of arr) {
 console.log(item); // 顺序输出 a b c
}

使用Symbol.iterator迭代器来逐个返回数组的单项

let arr = ['a', 'b', 'c'];
var iterator = arr[Symbol.iterator]();
// next 方法返回done表示是否完成
console.log(iterator.next()); // {value: "a", done: false}
console.log(iterator.next()); // {value: "b", done: false}
console.log(iterator.next()); // {value: "c", done: false}
console.log(iterator.next()); // {value: undefined, done: true}
console.log(iterator.next()); // {value: undefined, done: true}

程序的优化:

let arr = ['a', 'b', 'c'];
var iterator = arr[Symbol.iterator]();
// next 方法返回done表示是否完成
var next = iterator.next();
while(!next.done) {
 console.log(next);
 next = iterator.next();
};

Symbol.iterator在面向对象中的应用实例1:

'use strict';
class UserGroup {
 constructor(users) {
  // json {joh:111,lili:1123}
  this.users = users;
 }
 [Symbol.iterator]() {
  let self = this;
  let i = 0;
  const names = Object.keys(this.users);
  const length = names.length;
  // iterator 对象,可以理解为指针
  return {
   next() {
    let name = names[i++];
    let qq = self.users[name];
    return {value: {name, qq}, done: i > length}
   }
  }
 }
}
let group = new UserGroup({'Joh':'595959','Lili':'888116'});
for (let user of group) {
 console.log(user);
}
// { name: 'Joh', qq: '595959' }
// { name: 'Lili', qq: '888116' }

Symbol.iterator在面向对象中的应用实例2:

'use strict';
var obj = {'Joh':'56999', 'Lili':'899888'};
obj[Symbol.iterator] = function() {
 let self = this;
 let i = 0;
 const names = Object.keys(this);
 const length = names.length;
 // iterator 对象,可以理解为指针
 return {
  next() {
   let name = names[i++];
   let qq = self[name];
   return {value: {name, qq}, done: i > length}
  }
 }
}
for (let u of obj) console.log(u);

程序优化之后:

'use strict';
var obj = {'Joh':'56999', 'Lili':'899888'};
let iteratorFun = function () {
 let self = this;
 let i = 0;
 const names = Object.keys(this);
 const length = names.length;
 // iterator 对象,可以理解为指针
 return {
  next() {
   let name = names[i++];
   let qq = self[name];
   return {value: {name, qq}, done: i > length}
  }
 }
}
obj[Symbol.iterator] = iteratorFun;
for (let u of obj) console.log(u);

Symbol.iterator应用于伪数组中

'use strict';
var obj = {
 length:2,
 '0':'abc',
 '1':'ddd'
}
/*
// if this , err: obj is not iterable
for (let i of obj) {
 console.log(i);
}
*/
obj[Symbol.iterator] = [][Symbol.iterator]; // handle this first
// then
for (let i of obj) {
 console.log(i);
}

字符串实现了Symbol.iterator接口

'use strict';
console.log('Joh'[Symbol.iterator]); // [Function: [Symbol.iterator]]
for(let char of 'Lili') {
 console.log(char);
}

同样的,在ES6中在set, map 字符串都能实现 Symbol.iterator接口

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
node.js中的http.response.write方法使用说明
Dec 14 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
Jul 06 Javascript
javascript实现简单的on事件绑定
Aug 23 Javascript
JavaScript中Math对象的方法介绍
Jan 05 Javascript
微信扫码支付零云插件版实例详解
Apr 26 Javascript
vue实现留言板todolist功能
Aug 16 Javascript
利用Console来Debug的10个高级技巧汇总
Mar 26 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
Jun 01 Javascript
vue项目实现github在线预览功能
Jun 20 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
Dec 06 Javascript
vue 使用 canvas 实现手写电子签名
Mar 06 Javascript
js实现简单选项卡制作
Aug 05 Javascript
亲自动手实现vue日历控件
Jun 26 #Javascript
js设置鼠标悬停改变背景色实现详解
Jun 26 #Javascript
ES6 Generator函数的应用实例分析
Jun 26 #Javascript
vue实现简单的日历效果
Sep 24 #Javascript
vue实现记事本功能
Jun 26 #Javascript
ES6 Set结构的应用实例分析
Jun 26 #Javascript
vue.js实现备忘录demo
Jun 26 #Javascript
You might like
php中的实现trim函数代码
2007/03/19 PHP
改变Apache端口等配置修改方法
2008/06/05 PHP
php的memcached客户端memcached
2011/06/14 PHP
php中动态变量用法实例
2015/06/10 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
JS通过ajax动态读取xml文件内容的方法
2015/03/24 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
BootStrap中Datepicker控件带中文的js文件
2016/08/10 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
python多进程实现文件下载传输功能
2018/07/28 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
校本教研工作制度
2014/01/22 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
护士先进个人总结
2015/02/13 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
Golang数据类型和相互转换
2022/04/12 Golang