Symbol

ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)

let b = Symbol();
typeof b;   // "symbol"

注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。

let c = new Symbol();
console.log(c);   // Symbol is not a constructor

Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分

var s1 = Symbol(‘foo‘);
var s2 = Symbol(‘bar‘);
console.log(s1);   // Symbol(foo)
console.log(s2);   // Symbol(bar)

s1.toString()    //  "Symbol(foo)"
s2.toString()    //  "Symbol(bar)"

注意点:

(1)、Symbol 值作为对象属性名时,不能用 点运算符

var mySymbol = Symbol();
var a = {};

a.mySymbol = ‘Hello!‘;
a[mySymbol] // undefined
a[‘mySymbol‘] // "Hello!"

上面代码中,因为点运算符后面总是字符串,所以不会读取mySymbol作为标识名所指代的那个值,导致a的属性名实际上是一个字符串,而不是一个 Symbol 值

(2)、在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中

let s = Symbol();

let obj = {
  [s]: function (arg) { console.log(arg) }
};

obj[s](123);   // 123

1、Symbol.for()

Symbol.for 方法接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个Symbol 值,否则,就新建并返回一个以该字符串为名称的 Symbol 值

let a3=Symbol.for(‘a3‘);
let a4=Symbol.for(‘a3‘);

console.log(a3===a4);   // true

a3 和 a4 都是 Symbol 值,是使用同样参数的 Symbol.for 方法生成的,搜索时发现同样的值,所以,实际上返回的是同一个Symbol值

2、Object.getOwnPropertySymbols()

Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名,返回值是一个数组

var obj2 = {};
var a = Symbol(‘a‘);
var b = Symbol(‘b‘);

obj2[a] = ‘Hello‘;
obj2[b] = ‘World‘;

var objectSymbols = Object.getOwnPropertySymbols(obj2);

objectSymbols   // [Symbol(a), Symbol(b)]
时间: 2024-08-26 13:47:18

Symbol的相关文章

ios 中 使用自制framework导致 Duplicate symbol 的问题解决方法

使用第三方静态库的时候有时候要求在编译选项linker 中 other linker flag中加入 -ObjC 但如果自制的framework库工程中加入了-ObjC,在Demo工程中如果也加入-ObjC选项时,可能导致 duplicate sysbol的问题 duplicate symbol _OBJC_CLASS_$_ZHAlixPayResult in: /Users/zizhu/Library/Developer/Xcode/DerivedData/NtUniSdkHaiMaDemo-

caffe日常坑系列之:undefined reference to symbol '_ZN2cv6String10deallocateEv'

在使用caffe库编译C++时出现的 解决如下: /usr/bin/ld: /tmp/ccA5JGRP.o: undefined reference to symbol '_ZN2cv6String10deallocateEv'//usr/local/lib/libopencv_core.so.3.2: error adding symbols: DSO missing from command line解决:sudo apt-get autoremove libopencv-dev caffe

Arcgis Runtime for andriod 100 Simple marker symbol

//create a simple marker symbolSimpleMarkerSymbol symbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 12); //size 12, style of circle //add a new graphic with a new point geometryPoint graphicPoint = new Point(-226773, 6550477

《深入理解ES6》之Symbol

ES6在原有的5中原始类型:字符串.数字型.布尔型.null和undefined的基础上,引入了一种原始类型Symbol(可以通过typeof检测变量是否为Symbol类型). Symbol的使用方法 所有使用可计算属性名的地方,都可以使用Symbol. let firstName=Symbol("first name"); let person={ [firstName]:"jia" }; Object.defineProperty(person,firstNam

解决Eclipse中C++代码显示Symbol 'std' could not be resolved的问题

第一次在Eclipse中写C++代码,写了一个简单的hello world程序,还没有等我编译.就报出了各种错误,但是这么简单的代码.怎么可能这么多错误.于是没有理会.编译执行后,能够正常输出!!!Hello World!!!,但是我的代码中还是有非常多红叉,把鼠标放在上面显示:Symbol 'std' could not be resolved 这种信息. 于是问题来了.怎样解决? 方法:写完库函数以后立刻保存.这样写之后的代码就不会报错了 比如:-->首先写#include <iostre

Centos下Apache遇到/usr/lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure错误

错误详情: /usr/local/apache/bin/httpd: symbol lookup error: /usr/lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure 错误产生原因: Centos官方发布了一个新版本的NSS包,如果进行更新就会产生这样的错误 解决方法: 重启Apache(开启了php-fpm也需要重启) 参考文章:Httpd - Symbol Lookup Errors

关于error C2872: &#39;LONG_PTR&#39; : ambiguous symbol

今天用VS2010创建了一个add-in工程,使用常量INVALID_HANDLE_VALUE时,编译器就提示如下错误: error C2872: 'LONG_PTR' : ambiguous symbol 研究发现是dte80a.olb导入的头文件中重定义了此类型. 在stdafx.h中找到 #import <dte80a.olb> raw_interfaces_only named_guids修改这句指令即可: #import <dte80a.olb> raw_interfac

idea传入HttpServletRequest时显示cannot resolve symbol的问题

在使用idea ide的时候,在控制器中我需要获取HttpServletRequest这个request对象,编译时出现cannot resolve symbol的问题,然后网上查找资料,这里记录一下 具体步骤如下: 1,检查tomcat是否配置servlet-api.jar包,具体如下 files->setting 如果这个配置好了,开始下一步 2,右键项目->open module setting,然后如下图所示 3,这两步完成之后,就是配置的环境基本配置好了,现在继续试试,如果仍是can

Android Studio --“Cannot resolve symbol” 解决办法

Android Studio 无法识别同一个 package 里的其他类,将其显示为红色,但是 compile 没有问题.鼠标放上去后显示 "Cannot resolve symbol XXX",重启 Android Studio,重新 sync gradle,Clean build 都没有用. 多半是因为 Android Studio 之前发生了错误,某些 setting 出了问题.解决方法如下: 点击菜单中的 "File" -> "Invalid