ES6中新增的基本数据类型----symbol

前言

Symbol 基本数据类型 独一无二得值 Symbol函数创建 接收字符串 对symbol值得描述

let s1 = Symbol('描述')

javascript 复制代码
/**
 * symbol 基本数据类型 表示独一无二的值 Symbol函数创建独一无二得值 参数可以是唯一值得描述
 */
let sy1 = Symbol();//创建好一个独一无二得值
let sy2 = Symbol();
console.log(sy1,sy2)
console.log(sy1 === sy2);
console.log(typeof sy1,sy1 instanceof Object);

let sy1 = Symbol('symbol数据类型');//对独一无二值得描述
let sy2 = Symbol({name:'zhangsan'})
let sy3 = Symbol([1,2,3]);
let sy4 = Symbol(null);
console.log(sy1,sy2,sy3,sy4);

应用:

1.解决命名冲突

无法直接访问 Object.getOwnProperSymbols(); 得到存放symbol属性名数组

let res = Object.getOwnProperSymbols();//Symbol('name'),Symbol('age')

objres\[0]

javascript 复制代码
/**
 * Symbol应用
 * 1.解决命名冲突 
 */
let sy1 = Symbol('name');
let sy2 = Symbol('age');
let obj = {
  name:'zhangsan',
  age:12,
  [sy1]:'terry',
  [sy2]:18,
  [Symbol('email')]:'xxx@briup.com'
};
//为了访问Symbol创建属性 
console.log(Object.getOwnPropertySymbols(obj));
var ss = Object.getOwnPropertySymbols(obj);//[ Symbol(name), Symbol(age), Symbol(email) ]
console.log(obj[ss[0]],obj[ss[1]]);


console.log(obj[Symbol('email')]);//无效 undefined
console.log(obj[sy1]);//可以访问属性
console.log(obj[sy2]);
// 遍历对象 使用symbol值创建属性无法遍历 
for(let key in obj){
  console.log(key)
}
2.消除魔术字符串

代码对于字符串依赖关系强,形成强耦合 形成魔术字符串

javascript 复制代码
/** 
 * 2.消除魔术字符串 代码对字符串依赖性非常强 形成强耦合关系 形成了魔术字符串
 */
function Area(shape,options){
  let area = 0;
  switch(shape){
    case 'triangle':
      area = options.width * options.height * 0.5;
      break;
    case 'square':
      area = options*width * options.height;
      break;
    case 'circle':
      area = Math.PI * options.r * options.r;
      break;
    default:
      area = -1;
  }
  return area;
}
let res = Area('triangle',{width:100,height:100,r:50});
console.log(res);


function Area(shape,options){
  let area = 0;
  switch(shape){
    case Shape.SJX:
      area = options.width * options.height * 0.5;
      break;
    case Shape.ZFX:
      area = options.width * options.height;
      break;
    case Shape.CIRCLE:
      area = Math.PI * options.r * options.r;
      break;
    default:
      area = -1;
  }
  return area;
};
// 枚举 类型可以罗列出来 性别:男 女 
let Shape = {
  SJX:Symbol('三角形'),
  ZFX:Symbol('正方形'),
  CIRCLE:Symbol('圆')
}

let res = Area(Shape.ZFX,{width:100,height:100,r:50});
console.log(res);
3.全局注册表

可以使用Symbol.for全局注册一个Symbol值

Symbol.for('hello');

Symbol.for('hello');

Symbol.keyFor 检测Symbol有没有全局注册过 注册过返回Symbol值得描述或者undefined

javascript 复制代码
/**
 * 全局注册表 Symbol.for
 */
// 可以创建一个symbol值的时候进行全局注册 
let sy1 = Symbol.for('name');
let sy2 = Symbol.for('name');
console.log(sy1 === sy2);

let sy3 = Symbol('age');
let sy4 = Symbol('age');
console.log(sy3 === sy4);

// Symbol.keyFor 检测symbol值有没有在全局注册过 注册过返回symbol值得描述 没有返回undefined
console.log(Symbol.keyFor(sy1));
console.log(Symbol.keyFor(sy2));
console.log(Symbol.keyFor(sy3));
console.log(Symbol.keyFor(sy4));
相关推荐
彧azz17 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
嵌入式学习菌17 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
matlab代码18 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
CharlesYu0118 小时前
前端性能优化的第一性原理,是不断缩短“用户发起意图 → 获得可用结果”之间的时间
前端
matlab代码18 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
平头哥技术团队19 小时前
Day 21 _ 页内锚点_给每段起个 id,目录写 href=_#id_,点一下页面就滚到那一段
前端·html·html5
wuyk55519 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin1997010801619 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas
尘客-追梦19 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt
持敬chijing20 小时前
Python-数据类型-列表
开发语言·python·青少年编程