浅谈ES6新增数据类型:Symbol
面试中喜闻乐见的问题就是问我们的ES6新增了哪些个新特性 这篇文章一起学习一下新增的数据类型:Symbol
JS的原始数据类型:6种
Boolean,String,Undefined,NULL,Number,Symbol(ES6新增)
原始的数据类型种不包含object这点需要注意。
Symbol是用来干什么的:用来区分我们的属性名的,用来定义对象的唯一属性名。
console.log(typeof Symbol("Alice")) // 输出:symbol
我们通过Symbol函数来生成symbol;
var symbol1=Symbol();
var symbol2=Symbol("Zhangxin");
Symbol类型的值是一个独一无二的值,Symbol函数的参数只是表示对当前Symbol值的描述,因此相同参数的Symbol函数的返回值是不相等的。
- console.log(Symbol() === Symbol()); // 输出:false
var symbol=new Symbol();

Symbol定义的属性 也不能直接去和String类型的属性进行连接操作:
console(Symbol('aa')+"bb");

另外的 下面是Symbol类型和其他类型的转换结果;
var symbol=Symbol("zhangxin");
console.log(symbol.toString());
console.log(Boolean(symbol));
if(symbol)
{
console.log("Y");
}
else{
console.log("N");
}
console.log(Number(symbol));

作为对象属性名的Symbol:
由于每一个Symbol值都是不相等的,这意味着Symbol值可以用于对象的属性名,保证不会出现同名的属性,这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。
对象的属性名可以有两种类型,一种是原来的字符串,另一种是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
通过方括号结构和Object.defineProperty,将对象的属性名指定为一个Symbol值。
方法一:
var name=Symbol():
var obj={[name]:"Zhangxin"};
方法二:
var name=Symbol();
var obj={};
obj[name]="Zhangxin"
方法三:
var obj = {};
Object.defineProperty(obj, name, { value: 'Zhangxin' });
参考文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号之中,如果不放在方括号中,该属性名就是字符串,而不是代表的Symbol值。
var name = Symbol();
var obj1 = {
[name]: "Zhangxin"
};
console.log(obj1.name); // 输出:undefined
console.log(obj1[name]); // 输出:Zhangxin
Symbol值作为对象属性名时,不能用点运算符。由于点运算符后面总是字符串,所以不会读取name作为标识名所指代的那个值,导致属性名实际上是一个字符串,而不是一个Symbol值。
var obj = {};
var name = Symbol();
obj.name = 'Zhangxin';
console.log(obj.name);
console.log(obj[name]);
console.log(obj['name']);
3、作为对象函数名的Symbol
var func = Symbol();
var obj = {
func: function() {
console.log("YES");
}
};
obj.func(); // 输出:YES
4、获取对象属性的两种方法
1) Object.getOwnPropertySymbols()方法
返回只包含Symbol类型的属性名的数组
2) Object.getOwnPropertyNames()方法
返回只包含字符串类型的属性名的数组
var obj = {};
var age = Symbol("age");
var job = Symbol("job");
obj[age] = "Zhangxin";
obj[job] = "student";
obj.age = 23;
var symbols = Object.getOwnPropertySymbols(obj);
var names = Object.getOwnPropertyNames(obj);
console.log(symbols.length); // 输出:2
console.log(symbols); // 输出:[Symbol(age), Symbol(job)]
console.log(obj[symbols[0]]); // 输出:Zhangxin
console.log(names.length); // 输出:1
console.log(obj[names[0]]); // 输出:23
5、Symbol.for()和Symbol.keyFor()方法
1) Symbol.for()方法
类似于单例模式,首先在全局中搜索有没有以该参数为名称的Symbol值,如果有则返回该Symbol值,否则新建并返回一个以该参数为名称的Symbol值。
var symbol1 = Symbol.for('Zhangxin');
var symbol2 = Symbol.for('Zhangxin');
console.log(symbol1 === symbol2) // 输出:true
2) Symbol.keyFor()方法
返回一个已创建的Symbol类型值的key,实质是检测该Symbol是否已创建。
var symbol1 = Symbol.for("Zhangxin");
console.log(Symbol.keyFor(symbol1)); // 输出:"Zhangxin"
var symbol2 = Symbol("Zhangxin");
console.log(Symbol.keyFor(symbol2)); // 输出:undefined
浅谈ES6新增数据类型:Symbol的更多相关文章
- ES6新增数据类型Symbol
Symbol的含义? ES6(2015) 引入了第七种原始数据类型Symbol,Symbol英文文意思为 符号.象征.标记.记号,在 js 中更确切的翻译应该为独一无二的 Symbol的使用? Sym ...
- es6 新增数据类型Symbol
es6在string number boolean null undefined object之外又新增了一种Symbol类型. Symbol意思是符号,有一个特性—每次创建一个Symbol值都是不一 ...
- 浅谈ES6新特性
ES6的了解 新增模板字符串(为JavaScript提供了简单的字符串插值功能).箭头函数(操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs.).for-o ...
- 浅谈ES6原生Promise
浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游 ...
- ES6的新增数据类型:Symbol
简介:Symbol类型是es6新增的一个数据类型,Es5的基本数据类型(undefined,null,Object,function,Number,string) Symbol值通过Symbol函数生 ...
- 浅谈ES6
ECMAScript6.0(简称ES6)是javaScript语言的下一代标准,已经在2015年6月正式发布了.它的目标,使得javaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言 ...
- ES6新数据类型Symbol
Symbol 需计算字面量属性时使用 const benz = Symbol('benz'); const car = { [benz]: 'benz car' }; const info = Sym ...
- 浅谈ES6中的Class
转载地址:https://www.cnblogs.com/sghy/p/8005857.html 一.定义类(ES6的类,完全可以看做是构造函数的另一种写法) class Greet { constr ...
- 浅谈 es6 箭头函数, reduce函数介绍
今天来谈一下箭头函数, es6的新特性 首先我们来看下箭头函数长什么样子, let result = (param1, param2) => param1+param2; 上述代码 按照以前书写 ...
随机推荐
- _proto_理解
一个对象就是一个属性集合,并拥有一个独立的prototype(原型)对象.这个prototype可以是一个对象或 者null. 一个对象的prototype是以内部的[[Prototype]]属性来引 ...
- kindle完结书单
1.一个人的好天气---青山七惠 2.嫌疑人X的献身---东野圭吾 3.活着---余华 4.最漫长的旅行---Nicholas Sparks 5.解忧杂货店---东野圭吾 6.追风筝的人---卡勒德· ...
- IIS环境配置和项目部署
本人实际工作项目中IIS部署,亲测可用~~ 具体步骤: 1.打开控制面板 2.打开程序和功能 3.打开或关闭Windous功能 然后勾选相关内容: 4.添加应用程序 先打开iis管理器页面(控制面板— ...
- angular6 http.service.ts
import { Injectable, isDevMode } from '@angular/core'; import { HttpClient, HttpParams, HttpHeaders ...
- ckeditor文本对齐方式添加,图片上传
最近用的AdminBSBMaterialDesign-master模板,里边用到了ckeditor编辑器 但发现里边没有基本的文本对齐方式,找了好一会,好多方法都不管用,最后在config.js中添加 ...
- 相似的RGB颜色——算法面试刷题3(for google),考察二分
在本题中,每个大写字母代表从“0”到“f”的一些十六进制数字. 红绿蓝三元色#AABBCC可以简写为#ABC. 例如,#15c是颜色#1155cc的简写. 现在,假设两种颜色#ABCDEF和#UVWX ...
- 从码农到技术总监分享Leader经验
从一个毕业的IT小伙或者一个码农成长为一个管理者,有很多需要转变的思想,那么当你遇到了瓶颈,或许我的经验能帮到你,感谢. 系统的掌握了.NET,JAVA技术,能够熟练的使用springcloud + ...
- zabbix3.4.7实操总结一
一.zabbix_server的配置说明 #需要修改的内容为如下:[root@localhost ~]# cd /usr/local/zabbix/etc/[root@localhost etc]# ...
- log4j的详细配置
https://www.cnblogs.com/juddhu/archive/2013/07/14/3189177.html(原文链接) 先说下我的需求 1,可以记录日记在我们的java开发项目周期中 ...
- 怎样用div做三角形
20181204 用盒子模型做三角形的效果: <div></div> width:0px; height:0px; border:10px solid red; border- ...