面试中喜闻乐见的问题就是问我们的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函数的返回值是不相等的。

  1. console.log(Symbol() === Symbol()); // 输出:false

 console.log(Symbol("Zhangxin") === Symbol("Zhangxin")); // 输出:false
Symbol不是一个构造函数 所以不能使用newSymbol方法来创建
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的更多相关文章

  1. ES6新增数据类型Symbol

    Symbol的含义? ES6(2015) 引入了第七种原始数据类型Symbol,Symbol英文文意思为 符号.象征.标记.记号,在 js 中更确切的翻译应该为独一无二的 Symbol的使用? Sym ...

  2. es6 新增数据类型Symbol

    es6在string number boolean null undefined object之外又新增了一种Symbol类型. Symbol意思是符号,有一个特性—每次创建一个Symbol值都是不一 ...

  3. 浅谈ES6新特性

    ES6的了解 新增模板字符串(为JavaScript提供了简单的字符串插值功能).箭头函数(操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs.).for-o ...

  4. 浅谈ES6原生Promise

    浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游 ...

  5. ES6的新增数据类型:Symbol

    简介:Symbol类型是es6新增的一个数据类型,Es5的基本数据类型(undefined,null,Object,function,Number,string) Symbol值通过Symbol函数生 ...

  6. 浅谈ES6

    ECMAScript6.0(简称ES6)是javaScript语言的下一代标准,已经在2015年6月正式发布了.它的目标,使得javaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言 ...

  7. ES6新数据类型Symbol

    Symbol 需计算字面量属性时使用 const benz = Symbol('benz'); const car = { [benz]: 'benz car' }; const info = Sym ...

  8. 浅谈ES6中的Class

    转载地址:https://www.cnblogs.com/sghy/p/8005857.html 一.定义类(ES6的类,完全可以看做是构造函数的另一种写法) class Greet { constr ...

  9. 浅谈 es6 箭头函数, reduce函数介绍

    今天来谈一下箭头函数, es6的新特性 首先我们来看下箭头函数长什么样子, let result = (param1, param2) => param1+param2; 上述代码 按照以前书写 ...

随机推荐

  1. Vue+Element+Select获取选中的对象

              案例演示:获取select当前选中的所有内容 <el-select v-model="value8" filterable placeholder=&qu ...

  2. istio路由配置

    istio路由配置   istio的代理配置参考文档: 中文文档: https://istio.io/zh/docs/reference/config/istio.networking.v1alpha ...

  3. springboot 默认异常处理

    SpringBoot默认有自定义异常处理的体系,在做SpringBoot项目的时候,如果是抛出了运行时异常,springBoot并会对异常进行处理,返回如下异常信息: { "timestam ...

  4. liunx定时任务

    为当前用户创建cron服务 1.  键入 crontab  -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...

  5. js 快速生成数组的方法

    //实现方法一:循环赋值var arr1 = new Array(100);for(var i=0;i<arr1.length;i++){ arr1[i] = i;}console.log(ar ...

  6. dockerfile语法规则

    编写Dockerfile 在前面的章节,我们学习了通过docker命令来下载镜像,运行镜像,在容器中部署自己的程序,最后将容器提交到自己的镜像中.但是,这并不是Docker推荐的镜像构建方式.在这一章 ...

  7. 小白的python之路Linux部分10/27&28

     用户 创建流程模拟 总代码 [root@localhost ~]# vim /etc/passwd #1 [root@localhost ~]# mkdir /home/rose [root@loc ...

  8. Angular No name was provided for external module 'XXX' in output.globals 错误

    Angular 7 开发自定义库时,引用ngZorroAntd,build过程中出现 No name was provided for external module 'ng-zorro-antd' ...

  9. JQuery案例一:实现表格隔行换色

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. R语言的精度和时间效率比较(简单版)

    R语言的最大数值 在R语言里面,所能计算的最大数值可以用下面的方法获得: ###R可计算最大数值 .Machine 在编程的时候注意不要超过这个数值.当然,普通情况下也不可能超过的. R语言的最大精度 ...