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 相关文章推荐
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 Javascript
JavaScript中各种编码解码函数的区别和注意事项
Aug 19 Javascript
IE6不能修改NAME问题的解决方法
Sep 03 Javascript
原生javascript获取元素样式属性值的方法
Dec 25 Javascript
30个精美的jQuery幻灯片效果插件和教程
Aug 23 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
Jul 06 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
Jan 06 Javascript
Angular X中使用ngrx的方法详解(附源码)
Jul 10 Javascript
JS原生轮播图的简单实现(推荐)
Jul 22 Javascript
基于vue2.0动态组件及render详解
Mar 17 Javascript
vue 中的keep-alive实例代码
Jul 20 Javascript
微信小程序实现上传照片代码实例解析
Aug 04 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个人网站架设连环讲(一)
2006/10/09 PHP
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
PHP学习之整理字符串
2011/04/17 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
Javascript 数组排序详解
2014/10/22 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
javascript常用函数(1)
2015/11/04 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
Vue路由跳转问题记录详解
2017/06/15 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
学习python的几条建议分享
2013/02/10 Python
Python文件操作基本流程代码实例
2017/12/11 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
python 将列表里的字典元素合并为一个字典实例
2020/09/01 Python
python推导式的使用方法实例
2021/02/28 Python
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
计算机专业推荐信范文
2013/11/27 职场文书
圣诞晚会主持词
2015/07/01 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js