简介:Symbol类型是es6新增的一个数据类型,Es5的基本数据类型(undefined,null,Object,function,Number,string)
Symbol值通过Symbol函数生成
Symbol类型是保证每个属性的名字都是独一无二的,对于一个对象由对个模块构成的情况非常有用
 
 
值的输出:
var a=Symbol(‘foo’)=>Symbol(foo),与其他类型不能运算,可以转换成字符串
 
实例:
var a=Symbol()
var b={}
var c={a:’world'}
b[a]=‘hello'
Object.assign(b,c)=>{a:’world’,Symbol():’hello'}
 
 
Symbol初始化相等吗?
var a=Symbol()
var b=Symbol()
a==b=>false
 
var a=Symbol(‘foo')
var b=Symbol(‘foo')
a==b=>false
 
那么要怎么样两个一样参数的Symbol()才会相等为true呢,以下
var a=Symbol.for(‘foo')
var b=Symbol.for(‘foo')
a==b=>true
Symbol.for()被登记在全局环境中供搜索
Symbol.keyFor()返回一个已等级的Symbol类型值的key跟Symbol.for()是配套的
Symbol.keyFor(a)==>’foo’
 
 
魔术字符串:在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值
 
消除魔术字符串,有魔术字符串
 
function getArea(shape, options) {

  var area = 0;

switch (shape) {
    case 'Triangle': // 魔术字符串
      area = .5 * options.width * options.height;
      break;
    /* ... more code ... */
  }

return area;
}

getArea('Triangle', { width: 100, height: 100 });

 
 
   消除魔术字符串
var shapeType = {
  triangle: 'Triangle'
};

function getArea(shape, options) {
  var area = 0;
  switch (shape) {
    case shapeType.triangle:
      area = .5 * options.width * options.height;
      break;
  }
  return area;
}

 
getArea(shapeType.triangle, { width: 100, height: 100 })
 
 
 
Symbol()作为属性名,该属性不会出现在```for...in```、```for...of ```循环中,也不会出现在Object.keys(),Object.getOwnPropertyNames(),JSON.stringify()返回
比如
var b={}
b[Symbol()]=‘hello'
b[’name’]=‘wenwen'
console.log(b)=>{Symbol():’hello’,name:’wenwen'}
for(key in b){
     console.log(key)=>只会打印name
}
怎么样去获得Symbol()属性
这样子:
Object.getOwnPropertySymbols(b)=>[Symbol()]
还有一种方式可以得到Symbol()属性
Reflect.ownKeys(b)=>[’name’,Symbol()]
 
 
 
Symbol.isConcatSpreadable 
 
对象的Symbol.isConcatSpreadable属性等于一个布尔值,表示该对象使用Array.prototype.concat()时,是否可以展开。
 
var arr=[‘c’,’d']
arr[Symbol.isConcatSpreadable]=false
[‘a’,’b’].concat(arr)=>[‘a’,’b’,[‘c’,’d']]
 
 
Symbol.species
不太懂这个属性
我去
static get [Symbol.species](){return this}
 
 
 
Symbol.match
是指向一个函数
str.match(myObject)
 
class a{
     [Symbol.match](string){
          return ‘hello world’.indexOf(string)
     }
}
 
‘e’.match(new a())==>1
 
 
Symbol.replace
了解这个之前我先看了一下 string.prototype.replace
 
 
js replace例子
var str=‘hello wolrd'
var str1=str.replace(‘world’,’wenwen’)==>’hello wenwen'
var str1=String.prototype.replace.call(str,’world’,’wenwen’)==>’hello wenwen'
 
Symbol.unscopables
指向一个对象,该对象指定使用with关键字时,哪些属性会被with属性排除
 
例子:
Object.keys(Array.prototype{Symbol.unscopables])
 
 
 
 
 
 
 

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. ECMAScript6新增数据类型symbol数据类型

    25.Symbol目的:为了解决对象之间属性名冲突的问题,Symbol它是引用数据类型. Symbol( ),它代表着一个独一无二的值 [name]: '小红',//加中括号代表默认创建了一个Symb ...

  4. 浅谈ES6新增数据类型:Symbol

    面试中喜闻乐见的问题就是问我们的ES6新增了哪些个新特性 这篇文章一起学习一下新增的数据类型:Symbol JS的原始数据类型:6种Boolean,String,Undefined,NULL,Numb ...

  5. ES6 新增基本数据类型Symbol

    ES6 增加了一个新的基本数据类型 symbol. 不过,和其他基本数据类型相比,它有点与众不同,因为它没有字面量的表现形式,而且创建的方式也有点奇怪,只能通过调用全局函数Symbol()来完成. l ...

  6. 理解ES6的新数据类型:Symbol

    ES6之前的数组类型 在ES6之前JS只有6种数据类型,分别是:Undefined.Null.布尔值(Boolean).字符串(String).数值(Number).对象(Object). ES6引入 ...

  7. ES6 之 第七种数据类型Symbol

    概述 为了减少对象的属性名冲突,ES6引入新的原始数据类型Symbol,JS的第七种数据类型. Symbol 能够保证每个属性的名字都是独一无二,这样就能从根本上防止属性名冲突. Symbol 值能够 ...

  8. ES6中的新数据类型——Symbol

    今天小编和大家来聊一聊es6中新增的一个原始数据类型Symbol.在es5中原始数据类型(基本数据类型)有以下六种:Undefind.Null.Bool. String.Number.Object.今 ...

  9. ES6新数据类型Symbol

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

随机推荐

  1. [Leetcode] gas station 气站

    There are N gas stations along a circular route, where the amount of gas at station i isgas[i]. You ...

  2. BZOJ1999 NOIP2007 洛谷P1099 P2491 SDOI 2011

    Description: 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各 ...

  3. HDU 5641

    King's Phone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  4. CopyOnWrite容器?

    CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后, ...

  5. distcc配置

    原理图: OS: ubuntu Server 12.04 1.安装 apt-get install distcc 2.配置 将文件/etc/default/distcc修改为如下格式 STARTDIS ...

  6. Leetcode 144.二叉树的前序遍历

    1.题目描述 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 2.解法 ...

  7. Redrain 通用菜单控件使用方法和说明(附源码和demo)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42889709 大概半年前我写过博客说明怎么改造duilib的原代Menu ...

  8. [LeetCode] Merge Interval系列,题:Insert Interval,Merge Intervals

    Interval的合并时比较常见的一类题目,网上的Amazon面经上也有面试这道题的记录.这里以LeetCode上的例题做练习. Merge Intervals Given a collection ...

  9. 【BZOJ】1455 罗马游戏

    [算法]可并堆(左偏树) #include<cstdio> #include<algorithm> using namespace std; ; int l[maxn],r[m ...

  10. 获取子iframe框架的元素

    我们常常遇到使用iframe框的时候,该iframe框不能根据自己内部的内容撑起来的这种问题 必要条件:不能在跨域的情况下...本地可以放到localhost下进行测试 //父页面index.html ...