面试中喜闻乐见的问题就是问我们的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-计算属性和侦听器

    1.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> { ...

  2. 学号 20175212 《Java程序设计》第3周学习总结

    学号 20175212 <Java程序设计>第3周学习总结 教材学习内容总结 一. Java--面向对象语言 核心内容为对象,一切围绕着对象.以下为三个重要性质: 封装性:将数据和对数据的 ...

  3. 初学python之感悟

    python的强大有目共睹,现将初学python,觉得其中比较重要的知识罗列如下: 类似于数组的东西:列表.元组.集合.字符串以及字典,这几个东西充分体现了python的强大和逆天. 列表: x=[1 ...

  4. 如何改变checkbox的样式

    <!doctype html> <html>       <head>         <meta charset="utf-8"> ...

  5. 关于人人网的form查找和打印

    from lianxi import sessionimport json# urlurl = 'http://www.renren.com/ajaxLogin/login?1=1&uniqu ...

  6. Postgresql插入或更新操作upsert

    幂等性的一个要求是多次操作的结果一致.对于update操作,多次直接的结果都是最后update的值,是满足需求的. 但对于insert,如果已经插入,第二次会报错,duplicate error, 主 ...

  7. Hibernate的增删改查(事务)

    Hibernate的事务: 1. 设置事务隔离级别都是用  自己进行存储的 二进制      十进制 read uncommitted   读未提交        0001         1 rea ...

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

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

  9. Java互联网应用和企业级应用的区别

    企业级应用是为了满足企业日常运营所产生的IT应用,其目的是满足企业自己,对交付厂家而言,俗称2B业务:互联网应用则是面向个人用户,俗称2C业务.就个人经验,企业应用主要关注业务服务的能力,针对该企业的 ...

  10. Unity 关于AssetBundle读取场景

    一. 1.关于如何打包成ab包,就不多说了,网上很多教程,siki学院也有siki老师的免费视频教程挺详细的,可以看看 http://www.sikiedu.com/my/course/74 2.为了 ...