ES5-ES6-ES7_Symbol数据类型
Symbol数据类型简介
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。
凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
Symbol函数前不能使用new命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。
也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型
let s = Symbol(); //变量s就是一个独一无二的值。typeof运算符的结果,表明变量s是 Symbol 数据类型,而不是字符串之类的其他类型
console.log(typeof s); //symbol
console.log(s); //Symbol() // Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,
// 主要是为了在控制台显示,或者转为字符串时,比较容易区分
let s1 = Symbol('foo');
let s2 = Symbol('bar');
console.log(s1,s2); //Symbol(foo) Symbol(bar)
console.log(s1.toString(),s2.toString()); //Symbol(foo) Symbol(bar)
Symbol数据类型的简单使用
//如果 Symbol 的参数是一个对象,就会调用该对象的toString方法,将其转为字符串,然后才生成一个 Symbol 值
const obj = {
toString() {
return 'abc';
}
};
const sym = Symbol(obj);
console.log(sym); // Symbol(abc) //Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。
// 没有参数的情况
let s3 = Symbol();
let s4 = Symbol();
console.log(s3 === s4);// false // 有参数的情况
let s5 = Symbol('foo');
let s6 = Symbol('foo');
console.log(s5 === s6); // false // Symbol 值不能与其他类型的值进行运算,会报错
// 但是,Symbol 值可以显式转为字符串
// Symbol 值也可以转为布尔值,但是不能转为数值
let symb = Symbol('My symbol');
//console.log("your symbol is " + symb); // TypeError: can't convert symbol to string
console.log(String(symb)); //Symbol(My symbol)
console.log(symb.toString()); //Symbol(My symbol)
console.log(Boolean(symb)); // true
console.log(!symb ); //false
//console.log(Number(symb)); // TypeError: Cannot convert a Symbol value to a number
//console.log(symb + 2); // TypeError: Cannot convert a Symbol value to a number
作为对象属性名的 Symbol
由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。
这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖,下面有两种写法
var mySymbol = Symbol('mySymbol');
const obj = {};
obj[mySymbol] = 'hello';
console.log(obj); //{ mySymbol: 'hello' }
console.log(obj[mySymbol]); //hello
var mySymbol = Symbol('mySymbol');
const obj = {
[mySymbol] : 'hello'
}
console.log(obj); //{ mySymbol: 'hello' }
console.log(obj[mySymbol]) //hello
属性名的遍历
Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。
var mySymbol = Symbol('mySymbol');
const obj = {userName: 'huang'};
obj[mySymbol] = 'hello';
console.log(obj[mySymbol]) // hello
for (let i in obj){
console.log(i) //mySymbol属性没有遍历出来
}
但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名
var obj = {};
var a = Symbol('a');
var b = Symbol('b');
obj[a] = 'Hello';
obj[b] = 'World';
//Object.getOwnPropertySymbols方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
var objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols); //[ Symbol(a), Symbol(b) ]
内置Symbol值
除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
Symbol.iterator——对象的Symbol.iterator属性,指向该对象的默认遍历器方法
// 等同于在指定的数据结构内部署了iterator接口
// 当使用for of遍历某个一个数据结构的时候,首先去找Symbol.iterator,找到了就去遍历,没有找到就不能遍历并且报错obj is not iterator
const obj = {
[Symbol.iterator]: function () {
let index = 0;
return {
next: function () {
return index < this.length ? {value: this[index++],done: false} : {value: undefined, done: true};
}
}
}
};
ES5-ES6-ES7_Symbol数据类型的更多相关文章
- ES6的数据类型
首先ES6包含了ES5里面的数据类型,有undefined,null,boolean,String,Number,Object,而ES6又新增了一种数据类型是Symbol,这种的Symbol数据类型是 ...
- Atitit js版本es5 es6新特性
Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...
- 简述ES5 ES6
很久前的某一天,一位大神问我,你知道ES6相对于ES5有什么改进吗? 我一脸懵逼的反问,那个啥,啥是ES5.ES6啊. 不得不承认与大神之间的差距,回来深思了这个问题,结合以前的知识,算是有了点眉目. ...
- React/React Native的 ES5 ES6 写法对照
ES5 ES6 模块 var React = require("react-native); var { Image, Text, View } = React; import Re ...
- Atitit js es5 es6新特性 attilax总结
Atitit js es5 es6新特性 attilax总结 1.1. JavaScript发展时间轴:1 1.2. 以下是ES6排名前十的最佳特性列表(排名不分先后):1 1.3. Es6 支持情况 ...
- 【转】React Native中ES5 ES6写法对照
很多React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component),然而网上搜到的很多教程和例子都是 ...
- 【ES5 ES6】使用学习
[ES5 ES6]使用学习 转载: ============================================================= 1.Promise 2.下划线转驼峰,驼 ...
- JavaScript Learning Paths(ES5/ES6/ES-Next)
JavaScript Learning Paths(ES5/ES6/ES-Next) JavaScript Expert refs https://developer.mozilla.org/en-U ...
- es5,es6,typescript,nodejs
es5新特性 讲到js必讲的几个概念,作用域,闭包,IIFE自执行函数 es5主要是对Object,Array,Function做了扩展,还有josn工具 es6新特性 增加了新的数据类型 WeakM ...
- React Native 的ES5 ES6写法对照表
模块 引用 在ES5里,如果使用CommonJS标准,引入React包基本通过require进行,代码类似这样: //ES5 var React = require("react" ...
随机推荐
- 图解vs2015生成JSON实例
在开发的过程中那个会使用到JSON数据,在使用的时候需要将它反序列化进行使用 如果说JSON存在很多实例情况手动敲肯定显得很繁琐而且很容易出错,VS提供了粘贴JSON类的方法. 这是我的JSON文件 ...
- C# 中 FindControl 方法及使用
FindControl 的使用方法 FindControl (String id): 在页命名容器中搜索带指定标识符的服务器控件.(有点类似javascript中的getElementById(st ...
- URL 与 URI 介绍
URL: 统一资源定位符 ( Uniform Resource Locator ) URI: 统一资源标识符 ( Uniform Resource Identifier ) URL 地址:https: ...
- SD Consultant Year End Activities
SD Consultant Year End Activities What are the year ending activities to be done for SAP SD? S.No ...
- 浅谈Kotlin(四):控制流
浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 本篇介绍Kotlin ...
- Testlink1.9.17使用方法(第一章 前言)
第一章 前言 QQ交流群:585499566 一.Testlink主要功能: 测试项目管理 测试需求管理 测试用例管理 测试计划的制定 测试用例对测试需求的覆盖管理 测试用例的执行 大量测试数据的度量 ...
- 学习用Node.js和Elasticsearch构建搜索引擎(5):mac本机部署canal
1.背景介绍 最近做的一个项目需要快速检索数据,经过商讨后采用了ElasticSearch作为快速检索数据引擎,但是数据如何同步到ES中是个问题,我们最开始计划了定时任务.mysql trigger等 ...
- JHipster开发环境安装
本文演示如何在CentOS7上安装Jhipster以及其依赖组件. 这里采用官方推荐的Yarn安装方法,操作系统版本为CentOS 7.4. 1 安装JDK 推荐版本:OpenJDK 1.8.0-64 ...
- 2018-05-11-机器学习环境安装-I7-GTX960M-UBUNTU1804-CUDA90-CUDNN712-TF180-KERAS-GYM-ATARI-BOX2D
layout: post title: 2018-05-11-机器学习环境安装-I7-GTX960M-UBUNTU1804-CUDA90-CUDNN712-TF180-KERAS-GYM-ATARI- ...
- NFV一种提高进程消息高可用性的方法
1.背景及概述 1.1 背景 在做NFV的过程中,由于控制面进程被放置到不同虚拟机中,中间可能跨越路由器,因此期间网络有可能震荡,这种情况下保证高可用性就必须有保护机制,本文正是在这种背景下的考虑. ...