ES6中Symbol是为了防止属性名冲突而引入的,是独一无二的。Symbol值是通过Symbol函数生成。Symbol值不能与其他类型的值运算否则会报错且Symbol的值可以转换为字符串或者是布尔值但是不能转换为数值。如果你想比较两个Symbol是否全相等,请在value前面加上typeof。

var test = Symbol('hi');
var ceshi = Symbol('hi');
var a = Symbol( typeof '1' );
var b = Symbol( typeof '1' );
if( test === ceshi ){ //值不同
console.log("值相同");
}else{
console.log("值不同");
}
if( test.toString() === ceshi.toString() ){ //输出的字符串相同
console.log('输出的字符串相同');
}else{
console.log('输出的字符串不相同');
}
if ( a === b ) { //true
console.log(a===b);
}else{
console.log(a!=b);
}

  当然Symbol是可以作为属性名的,如果变量里面含相同的Symbol那么后者将覆盖前者

//第一种写法(个人推荐)
var hi = Symbol();
var a = { [hi] : 'hi' , };
var a = { [hi] : 'hello' , };
var b = { [hi] : 'hello' , };
console.log(a[hi]); //hello
console.log(b[hi]); //hello
//第二种写法
var hi = Symbol();
var a = {};
a[hi] = 'Hello!';
console.log(a[hi]); //hello
//第三种写法
var hi = Symbol();
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
console.log(a[hi]); //hello

  Symbol.for()与Symbol()方法都会生成新的Symbol,他们的区别是前者会被登记在全局环境中供搜索,后者并不会。如果是用Symbol.for()生成的Symbol那么使用Symbol.keyFor()方法会返回一个已登记的Symbol类型值的key(意思就是Symbol.keyFor()方法找不到用Symbol生成因为他没有被登记在全局环境中!)

var test = Symbol.for('这是Symbol.for');
var ceshi = Symbol('这是Symbol');
console.log(Symbol.keyFor(test)); //这是Symbol.for
console.log(Symbol.keyFor(ceshi)); //undefined
  此外ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
  对象的Symbol.hasInstance属性指向一个内部方法,对象使用instanceof运算符时会调用这个方法,判断该对象是否为某个构造函数的实例。
    代码示例:证明x确实是Myclass的实例

class MyClass { } ;
var x = new MyClass();
console.log(x instanceof MyClass); // true
console.log(MyClass[Symbol.hasInstance](x));//true

  对象的Symbol.isConcatSpreadable属性等于一个布尔值,表示该对象使用Array.prototype.concat()时是否可以展开,为false则不允许会出现下方黄色,为true则正常展开。

let arr1 = [ 'a' , 'b' ];
let arr2 = [ '1' , '2' ];
arr2[Symbol.isConcatSpreadable] = false ;
console.log(arr1.concat( 'c' )); //[ 'a', 'b', 'c' ]
console.log(arr2.concat('3')); //[ [ '1', '2', [Symbol(Symbol.isConcatSpreadable)]: false ],'3' ]

  对象的Symbol.species属性指向对象作为构造函数创造实例时会调用这个方法如果this.constructor[Symbol.species]存在就会使用这个属性作为构造函数来创造新的示例对象。

// 扩展 Array 的构造函数
class MyArray extends Array {
static get [Symbol.species]() {
return Array;
}
}
var a = new MyArray(1,2,3);
var mapped = a.map(x => x * x);
console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true

  其他Symbol内置方法请参考https://itbilu.com/javascript/js/41apamqfe.html#symbol-species

ES6之Symbol的更多相关文章

  1. ES6(六) --- Symbol

    概述: ES5 中属性名都是字符串,这容易就造成命名的冲突,特别是在混入模式(mixin模式)下.为解决这个问题ES6 引入了Symbol, Symbol是一种新的基本数据类型,表示独一无二的值!   ...

  2. Es6(Symbol,set,map,filter)

    首先再讲这几个新东西之前,先说一个Es6中新出的扩展运算符(...) 1.展开运算符,就是把东西展开,可以用在array和object上 比如: let a=[,] let b=[,...a,]//[ ...

  3. ES6 之 Symbol

    1. 基本用法 Symbol 是ES6引入的一种新的原始数据类型,表示独一无二的值. 前六种基础数据类型是 undefined null Boolean String Number Object Sy ...

  4. JS的ES6的Symbol

    一.Symbol 1.什么是Symbol: Symbol是ES6新添加的原始类型(ES5已有原始数据类型:String,Number,boolean,function,undefined,object ...

  5. ES6的Symbol

    let s = Symbol(); alert(typeof(s)); // Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比 ...

  6. es6(9)--Symbol

    //Symbol生成一个独一无二的值,生成的值不会相等 { //声明1 let a1=Symbol(); let a2=Symbol(); console.log(a1===a2);//false / ...

  7. ES6 中 Symbol.split的用法

    class Split1 { constructor(value) { this.value = value; } [Symbol.split](string) { var index = strin ...

  8. ES6初识-Symbol

    Symbol的概念 变量是独一无二的 let a1=Symbol(); let a2=Symbol(); a1和a2严格意义不相等 let a3=Symbol.for('a3'); let a4=Sy ...

  9. ES6中的Symbol类型

    前面的话 ES5中包含5种原始类型:字符串.数字.布尔值.null和undefined.ES6引入了第6种原始类型——Symbol ES5的对象属性名都是字符串,很容易造成属性名冲突.比如,使用了一个 ...

随机推荐

  1. 如何有效的去使用一款免费的ERP

    现在市场上免费的软件不少,怎么样去使用一款免费产品是很多人比较头疼的事情. 一般使用免费ERP软件的基本都是小企业,没用过想用又舍不得花钱.如果企业有懂数据库这块儿的管理员,那都还好.如果没有,那建议 ...

  2. socket的简单例子

    最近刚刚开始学了socket的模块,就写了一个服务器与客户端交互的程序 有两种模式: 1.就是先电脑自动回复 2.就是人工服务 接下来就是代码了 服务器端的代码: #Author:陈浩彬 import ...

  3. CSS常见布局解决方案

    最近要准备移动端项目,大半年没好好写过CSS了,今天恶补了一下CSS的一些布局,下面做一些分享. 水平居中布局 1.margin + 定宽 <div class="parent&quo ...

  4. 学习爬虫的day03 (通过代理去爬去数据)

    代理的IP通过去网上找# -*- coding: utf-8 -*- import re import _thread from time import sleep, ctime from urlli ...

  5. 学习爬虫的day02 (用线程去爬虫 提高速度)

    通过lxml的方式去分析数据,将爬到的数据放到file中的html中代码如下# 用线程去爬虫 from urllib.request import Request from urllib.reques ...

  6. [翻译]Python List Comprehensions: Explained Visually || Python列表解析式

    原文1地址: http://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/ 原文2地址: http://blog.tea ...

  7. 【转】《高级前端3.6》JavaScript多线程——Concurrent.Thread.js, WebWork

    原文链接:http://www.cnblogs.com/woodk/articles/5199536.html JavaScript多线程,在HTML5 WebWork没出现之前很多人都是用Concu ...

  8. 安装vue-cli时出现的错误,cmd 卡住

    今天在构建vue 时遇到个问题, cmd 执行 vue init webpack my-project 时 , 出现如下乱码, 然后 页面 卡住在 项目说明 ,操作不了, 最后发现是 nodejs 版 ...

  9. CI框架使用PHPmailer发送邮件找回密码

    之前用PHP+Mysql+jQuery结合ThinkPHP做了一个用户验证邮箱找回密码功能<ThinkPHP之PHP+Mysql+jQuery发送邮箱找回密码>,现在分享一下用CI框架结合 ...

  10. HDU 4556 Stern-Brocot Tree

    题意:求SB树第N层分母分子小于均等于N的数有多少? 搞清楚了SB Tree的性质,这道题就很容易了.因为SB Tree中的数均为最简分数,所以筛一波欧拉函数即可. #include<bits/ ...