ES6新增数据类型符号(1):普通符号
在编程时,我们会遇到某些属性,我们不需要或者不想要别人访问它,即需要设置私有属性,如下例,我们不需要在外部获取getRandom这一属性
const game = {attack: 30, //攻击力hp: 100, //血量criticalStrike() { //暴击const dmg = parseInt(this.attack * this.getRandom(1, 1.8));console.log(dmg);},getRandom(max, min) {return Math.random() * (max - min) + min;}
}
game.criticalStrike();
console.log(game);
【结果】
放在类中也是同样的,无法设置私有属性,如下例
class Game {constructor(attack, hp) {this.attack = attack;this.hp = hp;}criticalStrike() {const dmg = parseInt(this.attack * this.getRandom(1, 1.8));console.log(dmg);}getRandom(max, min) {return Math.random() * (max - min) + min;}
}
const game = new Game(30, 100);
game.criticalStrike()
console.log(game);
【结果】
而在ES6之前,并没有方法实现属性私有化,因此ES6提供了新的数据类型Symbol,为我们提供设置私有属性的方法,通过符号数据类型创建如下:
const syb = Symbol('这是一个符号');
console.log(syb);
【结果】
【注】符号的特点
1.没有字面量
2.使用typeof得到的类型是Symbol
【例1-1】
const syb = Symbol('这是一个符号');
console.log(typeof syb);
【结果】
3.每次调用Symbol函数得到的符号永远不相等,无论符号名是否相同
【例1-2】
const syb1 = Symbol('符号');
const syb2 = Symbol('符号');
console.log(syb1 === syb2);
【结果】
4.符号可以作为对象的属性名存在,这种属性称之为符号属性
【例1-3】
const syb = Symbol('符号');
const obj = {a: 1,b: 2,[syb]: 3
}
console.log(obj);
【结果】
可以看到,并不能得到第三项的属性值,即第三项为对象的私有属性, 因此文章刚开始出现的问题可以用如下代码解决
const Game = (() => {const getRandom = Symbol('random');return class {constructor(attack, hp) {this.attack = attack;this.hp = hp;}criticalStrike() { //暴击const dmg = parseInt(this.attack * this[getRandom](1, 1.8));console.log(dmg);}[getRandom](max, min) {return Math.random() * (max - min) + min;}}
})();
const game = new Game(30, 100);
console.log(game);
【结果】
关于获取符号属性的几个点:
1)开发者可以通过精心的设计,让这些属性无法通过常规的方式被外界访问
2)符号属性是不能枚举的,因此在for-in循环中无法读取到符号属性,Object.keys方法也无法读取到符号属性
3)Object.getOwnPropertyNames尽管可以得到所有无法枚举的属性,但是仍然无法读取到符号属性
4)ES6新增Object.getOwnPropertySymbols方法,可以读取符号
const syb = Symbol();
const obj = {[syb]: 1,a: 2,b: 3
}
for(const prop in obj) {console.log('forin循环结果:',prop);
}
console.log('Object.keys方法():',Object.keys(obj));
console.log('Object.getOwnPropertyNames方法():',Object.getOwnPropertyNames(obj));
console.log('Object.getOwnPropertySymbols方法():',Object.getOwnPropertySymbols(obj));
【结果】
5.符号无法被隐式转换,因此不能被用于数学运算、字符串拼接或其他隐式转换的场景,但符号可以显式转换为字符串,通过String构造函数进行转换即可,console.log之所以可以输出符号,是它在内部进行了显式转换
ES6新增数据类型符号(1):普通符号相关推荐
- ES6新增数据类型符号(2):共享符号与知名符号
目录 1.共享符号 2.知名符号 1.共享符号 上节课讲到每次调用得到的符号都是不相同的,但是存在需要同一个符号的需求,因此ES6提供了静态方法for,可以根据某个符号名称(符号描述)得到同一个符号, ...
- es6 新增数据类型_ES6新增特性整理
整理这些东西主要是为了方便自己想用的时候能够快速查询,其中不可避免会引用.借鉴到其他大佬的优秀成果,还请多多包涵.如有不妥之处,还请不吝赐教. pany:ES6新特征总结zhuanlan.zhihu ...
- ES6新增数据类型:Symbol
[学习es6新增的数据类型 Symbol] 1.symble 的作用 symbol 是 es6 新增的一个基本的数据类型,定义唯一值的:一般用于给对象添加私有属性. 2.symble 的用法 < ...
- es6 新增数据类型Symbol
es6在string number boolean null undefined object之外又新增了一种Symbol类型. Symbol意思是符号,有一个特性-每次创建一个Symbol值都是不一 ...
- ES6基本数据类型总结
ES5的基本数据类型有:Number,String,Boolean,null,undefined ES6基本数据类型:Number,String,Boolean,null,undefined,symb ...
- java int 无符号_Java 无符号数据类型
Java数据类型教程 - Java无符号数据类型 Java不支持无符号数据类型. byte,short,int和long都是有符号数据类型. 对于有符号数据类型,值范围的一半存储正数,一半用于负数,因 ...
- plc位、字节、字、双字、有符号、无符号数据类型的关系
plc位.字节.字.双字.有符号.无符号的关系 以下内容由深圳市综科智控科技开发有限公司编辑整理 2021/08/18 前言:很多同学在PLC开发过程中,因为数据类型选择错误而出现得到的数据和期望的数 ...
- c++基本数据类型基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:
基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:单精度型:float 双精度型:double 长 ...
- ES6新增 Symbol
Symbol的诞生? Symbol的诞生,也就是Symbol存在的意义 之前我们的对象属性的数据类型都是字符串,没有其他的了.所以会导致属性名重复,导致属性值被覆盖的情况.比如,你使用了一个他人提供的 ...
最新文章
- Linux多线程与同步
- React Native自学--嵌入到原生应用
- java 通配符 日期_java – 使用带有通配符支持的SimpleDateFormat解析日期字符串(例如* yyyy * MM * dd * hh * mm * ss)...
- PHP函数处理方法总结
- 手把手教你如何在阿里云ECS搭建Python TensorFlow Jupyter
- python带通配符的字符串匹配_Bash技巧:实例介绍数个参数扩展表达式以处理字符串变量...
- OOP-ECMAScript - 深入理解Javascript
- python numpy loadtxt
- php微信自动登录,利用php怎么实现一个自动登录微信并获取昵称的功能
- [原创]完美开启Win8中管理员Administrator帐户
- ecshop getRow getAll getOne 返回值的区别
- 苏槐: 数据治理的本质及实践
- RemapKey等:小巧实用的键盘映射工具
- APK应用程序的解包、修改、编辑、汉化、打包及应用
- Android热修复Sophix详解
- 我在Facebook干不下去的10个理由
- tar压缩和解压文件或文件夹
- 王春亮用心接待全国的调养者和学习者
- 使用jquery的bind来检测textarea,input等的文本变化
- 最新小储云商城V1.782免授权源码