ES6之Symbol
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
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的更多相关文章
- ES6(六) --- Symbol
概述: ES5 中属性名都是字符串,这容易就造成命名的冲突,特别是在混入模式(mixin模式)下.为解决这个问题ES6 引入了Symbol, Symbol是一种新的基本数据类型,表示独一无二的值! ...
- Es6(Symbol,set,map,filter)
首先再讲这几个新东西之前,先说一个Es6中新出的扩展运算符(...) 1.展开运算符,就是把东西展开,可以用在array和object上 比如: let a=[,] let b=[,...a,]//[ ...
- ES6 之 Symbol
1. 基本用法 Symbol 是ES6引入的一种新的原始数据类型,表示独一无二的值. 前六种基础数据类型是 undefined null Boolean String Number Object Sy ...
- JS的ES6的Symbol
一.Symbol 1.什么是Symbol: Symbol是ES6新添加的原始类型(ES5已有原始数据类型:String,Number,boolean,function,undefined,object ...
- ES6的Symbol
let s = Symbol(); alert(typeof(s)); // Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比 ...
- es6(9)--Symbol
//Symbol生成一个独一无二的值,生成的值不会相等 { //声明1 let a1=Symbol(); let a2=Symbol(); console.log(a1===a2);//false / ...
- ES6 中 Symbol.split的用法
class Split1 { constructor(value) { this.value = value; } [Symbol.split](string) { var index = strin ...
- ES6初识-Symbol
Symbol的概念 变量是独一无二的 let a1=Symbol(); let a2=Symbol(); a1和a2严格意义不相等 let a3=Symbol.for('a3'); let a4=Sy ...
- ES6中的Symbol类型
前面的话 ES5中包含5种原始类型:字符串.数字.布尔值.null和undefined.ES6引入了第6种原始类型——Symbol ES5的对象属性名都是字符串,很容易造成属性名冲突.比如,使用了一个 ...
随机推荐
- Iterator & Iterable 和 Comparable&Comparator
java.lang.Iterator & java.lang.Iterable Iterator和Iterable的区别和联系 iterator是具有迭代状态的对象.它允许你检查它是否有更多的 ...
- 照虎画猫写自己的Spring——依赖注入
前言 上篇<照虎画猫写自己的Spring>从无到有讲述并实现了下面几点 声明配置文件,用于声明需要加载使用的类 加载配置文件,读取配置文件 解析配置文件,需要将配置文件中声明的标签转换为F ...
- asp.net web api 构建api帮助文档
1 概要 创建ASP.NET Web Api 时模板自带Help Pages框架. 2 问题 1)使用VS创建Web Api项目时,模板将Help Pages框架自动集成到其中,使得Web Api项目 ...
- [贪心][高精]P1080 国王游戏(整合)
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...
- AIO5系统中关于赠品处理的方法
最近频繁有人问我,关于赠品在AIO5系统中如何处理.首先AIO5系统支持赠品处理关于赠品,在AIO5系统中走的是[其他出库单]路径:仓库--仓库作业--其他出库单--新增(如下图) 通常赠品对应的业务 ...
- YOLO 算法框架的使用一(初级)
YOLO官方框架使用C写的,性能杠杠的,YOLO算法,我就不做过多介绍了.先简单介绍一下这个框架如何使用.这里默认是yolo2,yolo1接近过时.环境 推荐ubuntu 或者centos YOLO是 ...
- Activity切换动画---点击哪里从哪放大
emmmm,这次来梳理一下 Activity 切换动画的研究.首先,老规矩,看一下效果图: 效果图 这次要实现的动画效果就是类似于上图那样,点击某个 view,就从那个 view 展开下个 Activ ...
- c# winform treelistview的使用(treegridview)
TreeView控件显示的内容比较单一,如果需要呈现更详细信息TreeListView是一个不错的选择. 先看效果: 首先需要引用文件System.Windows.Forms.TreeListView ...
- JS 判断某个字符串是否存在与数组中
<script> function in_array(stringToSearch, arrayToSearch) { for (s = 0; s < arrayToSearch.l ...
- Python 冒泡法排序
def sequence(disorder='', separators=''): arrays = disorder.split(separators) def desc(): for i in r ...