首先,为什么说叫所谓呢?因为在2007年之前Js给予我们typeof解析数据类型的一共有六种(一直有争议,但是我们暂时就按typeof来算)

'function''Number''Object''boolean''String''undefined'

但当我们去 typeof Symbol () 的时候,会惊奇的发现,返回了一个

‘symbol’

首先肯定要有疑问,这货是啥?当然第一种想法其实就是肯定很强大。因为前六种已经强大的一种地步了,这货肯定也一定非常强大。首先我们先带着我们的好奇心一步一步来看看这个鬼东西。首先先验证一下它是不是对象。通过我先说一下我对对象研究的他有三种机制:

  • 只要是对象就可以引用。

  • 只要是对象都可以赋予私有属性。

  • 对象都不相等。

那么var a = Symbol();a.b = 10;//  赋予私有属性a.b // undefined看来这货不是个对象,既然不是对象我们来看看它的一些别的特性。首先在 api 上 Symbol 提供了两个方法第一个是 for 另外一个是 keyFor 。

var s1 = Symbol.for('abc');var s2 = Symbol.for('abc');Symbol() === Symbol() //falses1 === s2    //trueSymbol.keyFor(s1)// 'abc'

当然这两个看起来比较容易 似乎就是一个赋予一个值然后就会把原来的值吐出来,当然真是原来的值么?带着这样的疑问我又继续做了一些实验。

var s1 = Symbol.for([1,2,3]);Symbol.keyFor(s1); //  "1,2,3" 字符串的 1,2,3 var s1 = Symbol.for(function (){});Symbol.keyFor(s1); "function (){}"   字符串的fn;

你会发现这货你存的东西只会以字符串的东西吐出来。当然这个东西官方说由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。也就是说可以作为存在 json 中让 key 永远不相等。OK ,那么就完全可以这样:

 var a = {};       a[Symbol()]= 'Hello!';       a[Symbol()]= 'Hello!';       a[Symbol()]= 'Hello!';       console.log(a);      Object          Symbol(): "Hello!"          Symbol(): "Hello!"          Symbol(): "Hello!"      __proto__: Object 

你会发现出现了连续的三个 a的属性 都是hello 并且没有覆盖 。也就是说这么写的话可以有效的防止其json重名问题,不过拿起来就非常费劲了。

 for(var i in a){           console.log(i +',' +a[i]) //没有任何的东西       }

当然这就比较可以可疑了,json 用 symbol 存上东西了,但是又用 for in 拿不到。也就说如果直接这么赋值 json 认,但是 for in 循环不认,而且咱们也拿不到。但是换一种方式就没问题了。用变量存的话,虽然虽然 for in 拿不到,但是咱们可以拿到值。

var a = Symbol('aaa');      b = {};      b[a] = 10 ;      console.log(b[a])//10

轻松拿到值。其实不难看出来 Symbol 对 for in 不是很友好,但是 对 json 很友好。这时如果使用别的方法拿值呢?顾名思义,Object.getOwnPropertyNames() 是拿对象私有属性的的方法,我们来试试。

 let b = {};      b[Symbol()]=10;      b[Symbol()]=15;      Object. getOwnPropertyNames(b) //

可以理解为:其实 Symbol 不作为 b 的私有属性存在。拿能不能拿到呢?其实也能拿到。他提供了一个 getOwnPropertySymbols 方法可以让我找到存在内存里的 Symbol 。例如:

 let a = {};      a[Symbol()]=10;      a[Symbol()]=15;      Object.getOwnPropertySymbols(a) //[Symbol(),Symbol()] //这里面以数组的形式返回了 咱们使用的两个Symbol();      Object.getOwnPropertySymbols(a)[0]//Symbol() 第一个Symbol()      a[Object.getOwnPropertySymbols(a)[0]]//10 拿到存在的这个值。

其实知道是数组后 我们就可以循环  obj.getOwnPropertySymbols(a) 这个东西 然后输出值了。其实说回来只是换了一种方法拿值,存值。而这种方法更安全更隐蔽而已。而Symbol还有一些比较特殊的特性。js中的~(按位非) 是一个比较强势的转换number的东西。例如:

~NaN  //-1~function (){}//-1~undefined   //-1var a = function (){};~a()  //-1~new a() //-1

基本任何东西都能转成number,而:

~Symbol  //-1~Symbol() //报错

似乎说明了 其跟function 有着本质的区别,另外呢,Symbol值不能与其他类型的值进行运算,会报错。

var sym = Symbol('My symbol');"your symbol is " + sym     // TypeError: can't convert symbol to string   es5之前的报错`your symbol is ${sym}`     // TypeError: can't convert symbol to string   es6字符串照样的报错

另外,Symbol值也可以转为布尔值,但是不能转为数值。这些都是Symbol的一些小特性。

var sym = Symbol();Boolean(sym) // true!sym  // falseNumber(sym) // TypeErrorsym + 2 // TypeError

其实来说Symbol作为一个新的数据类型 最强的而不是干以上的这些事而是一些配合原型方法的一些开关,可以强化方法的使用。比如说 Symbol.isConcatSpreadable 这个方法,咱们都知道 正常的数组concat方法是连接字符串。

let arr = ['c', 'd'];['a', 'b'].concat(arr2,'e') //['a','b','c','d','e'];

而我们一旦把开关打开后会发现一些意想不到的结果。

let arr2 = ['c', 'd'];arr2[Symbol.isConcatSpreadable] = false;['a', 'b'].concat(arr2, 'e') //['a','b',['c','d'],'e']

会发现以数组的形式插入到里面了。当然他还包括了一些别的方法,例如,他可以测试 ES6 新增的内置对象方法 Symbol.toStringTag 。

JSON[Symbol.toStringTag]:'JSON'Math[Symbol.toStringTag]:'Math'Module对象M[Symbol.toStringTag]:'Module'ArrayBuffer.prototype[Symbol.toStringTag]:'ArrayBuffer'  DataView.prototype[Symbol.toStringTag]:'DataView'Map.prototype[Symbol.toStringTag]:'Map'Promise.prototype[Symbol.toStringTag]:'Promise'Set.prototype[Symbol.toStringTag]:'Set'%TypedArray%.prototype[Symbol.toStringTag]:'Uint8Array'等WeakMap.prototype[Symbol.toStringTag]:'WeakMap'WeakSet.prototype[Symbol.toStringTag]:'WeakSet'%MapIteratorPrototype%[Symbol.toStringTag]:'Map Iterator'%SetIteratorPrototype%[Symbol.toStringTag]:'Set Iterator'%StringIteratorPrototype%[Symbol.toStringTag]:'String Iterator'Symbol.prototype[Symbol.toStringTag]:'Symbol'Generator.prototype[Symbol.toStringTag]:'Generator'GeneratorFunction.prototype[Symbol.toStringTag]:'GeneratorFunction' 

不过,用 ES5 之前的方法依然也可以检验出来内置对象,所以 Symbol 就是更规范化而已,就用 map 举例。

Object.prototype.toString.call(new Map())//'[object Map]'

别的内置对象也是同理。Symbol.unscopables 也是Symbol一个比较有意思的东西。可以找到对象内哪些属性被with排除。

Object.keys(Array.prototype[Symbol.unscopables])//['copyWithin', 'entries', 'fill', 'find', 'findIndex', 'keys']

以数组的形式返回 也就是说 这些属性会被with排除。其实这些只是Smybol的冰山一角,更多的是Symbol是服务于ES6中。让我们继续慢慢探索好了。

php解析js的 arraybuffer_JS的所谓的第七种数据类型Symbol相关推荐

  1. 顶级黑客欢乐解析:宝宝事件中人肉搜索的七种方法

    作为敢抢奥运会头条的男人,宋喆遭遇了围追堵截.这次全民捉奸不仅是娱乐圈的狂欢,科技圈也神乱入了一下: 如果没有广大黑客技术爱好者的参与,狗仔们似乎也无法在几天之内扒出宋喆的身世.爱好.住址.开房记录, ...

  2. js类似matlab_后MATLAB时代的七种开源替代,一种替代堪称完美!

    希望本文对大家有所帮助.另外,也欢迎大家在留言区推荐你知道的替代工具. 1. "近乎完美"替代之SCILAB SCILAB 是一款与 MATLAB 类似的开源软件,可以实现 MAT ...

  3. js去除字符串数字前面的0_JS基础复习-七种基本数据类型

    前言:JS必须死记的七种数据类型 string number boolean null undefined symbol(比较特殊,先不做讨论) object 一.string-字符串 1.定义:字符 ...

  4. JS奇淫技巧:挑战前端黑科技,数值的七种写法,能全看懂的一定是高手

    JS奇淫技巧:数值的七种写法 JS奇淫技巧:挑战前端黑科技,数值的七种写法,能全看懂的一定是高手 你知道吗?在JS编程中,数值可以有很多种写法. 第一种写法: 一般情况而言,数值就是数值. 比如: v ...

  5. PHP解析js的escape()函数编码数据

    // php解析js的escape()函数编码数据function js_unescape($str){$ret = '';$len = strlen($str);for ($i = 0; $i &l ...

  6. 【行情采集】解析JS 1秒获取5000支股票瞬时行情(送代码,含筛选方法)

    提示:采集行情仅用于个人量化分析,不做为交易依据 解析JS 1秒获取5000支股票瞬时行情(送代码,含筛选方法) 前言 一.JS采集? 二.代码如下 总结 前言 量化分析,行情先行. 一.JS采集? ...

  7. Python爬取鬼吹灯2(周建龙)(PyV8解析js)

    Python爬取鬼吹灯2有声小说(PyV8解析js) 偶然在一个网站http://www.ting56.com/ 上面看到有鬼吹灯2的周建龙老师的作品,又不想在电脑上面听,于是就想用python爬下来 ...

  8. 【行情采集】解析JS 0.5秒获取版块(可分行业、概念、地域)今日、5日内、10日内资金流向(送代码)

    提示:采集行情仅用于个人量化分析,不做为交易依据 解析JS 0.5秒获取版块(可分行业.概念.地域)今日.5日内.10日内资金流向(送代码) 前言 一.为什么要观察资金流? 1.资金流定义 2.资金流 ...

  9. java解析js代码----笔记

    笔记直接贴代码了 package top.demo.js;import javax.script.Invocable; import javax.script.ScriptEngine; import ...

最新文章

  1. YOLOv5在建筑工地中安全帽佩戴检测的应用
  2. 如果你想成为年入 50w+ 的架构师,我建议你先看看这个...
  3. matlab调用q外部exe文件,Matlab GUI调用外部程序生成exe,DOS窗口输入问题
  4. 如何使用async和await这对组合设计统一的取Access Token的函数
  5. 人脸识别撞脸名画_范冰冰深夜晒自拍撞脸荷兰名画,三万元名牌包抢镜,两套餐具亮了...
  6. Java开发面试书籍,28天肝完阿里面试通关宝典
  7. Android项目中的armeabi,armeabi-v7a和x86
  8. (超详细笔记整理)动力节点_老杜 | JavaSE进阶 【P486之后】
  9. 关于android studio menu键的问题
  10. java开发高薪工程师,Java开发工程师如何获得高薪
  11. 计算机竞赛奖学金申请书,计算机专业奖学金申请书
  12. python语言中整数1010的二进制、八进制_C语言中的二进制数、八进制数和十六进制数...
  13. 微软服务器安装显卡驱动,微软虚拟机显卡及驱动的设置
  14. Unity项目--LoyPoly风格的FPS Demo(附试玩地址)
  15. 创意爱心白云动态MAC壁纸分享来了
  16. 我们分析了金庸小说中出现的1367个人物名字,发现了一些相当惊人的事情
  17. 向excel里面插入网络图片
  18. invalid button size rid: 5fd188c8-1d752f57-0d53f85f
  19. SpringBoot2核心技术最好的一篇文章——2. 核心技术
  20. 【SAP】ABAP Submit调用报表程序

热门文章

  1. centos6.x redhat6.x 升级openssh8.7
  2. Springboot/Cloud集成Sentinel进阶实战
  3. http发送jsonn报文get/post请求
  4. SQL入门试炼创建表
  5. Spring Cloud Alibaba 雪崩效应和容错解决方案
  6. html-网页基本标签
  7. intl扩展 mac 安装php_mac下php安装intl扩展代码分享
  8. 五子棋项目结束总结_居家活动系列总结
  9. 服务器配置再生龙系统,PXE引导再生龙安装步骤
  10. java构造方法 this_Java中的构造方法this、super的用法详解