展开

关键词

Javascript Symbol 解惑 什么是Symbol创建Symbol如何使用Symbol

但是 Symbol 只能通过构造函数 Symbol() 进行创建:const sym = Symbol();或者,我们可以传入一个字符串参数(descriptor)用于描述该Symbol:const sym = Symbol(cat);注意:传入的参数对 Symbol 值的产生并无影响,因为就算每次传入的参数都一样,生成的Symbol值也是不等的。 该参数的作用仅用于描述被创建的Symbol,以便debug时可以识别出Symbol的含义。 Symbol,不一样的是:创建的 Symbol 是全局的(在全局Symbol表中注册),而如果全局已经存在相同 key 的Symbol,则直接返回该Symbol。 ()等方法不能识别Symbol属性,简而言之Symbol属性对用户是“隐藏”的(但并不是private的,因为有其他途径可以获取Symbol属性),例如:?

35020

Symbol

Symbol 值不是对象,所以不能添加属性Symbol 值不能与其他类型的值进行运算,会报错Symbol 值可以显式转为字符串Symbol 值也可以转为布尔值,但是不能转为数值作为属性名的 Symbol 由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性Symbol 值作为对象属性名时,不能用点运算符实例:消除魔术字符串魔术字符串指的是 Symbol 值如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的 Symbol方法生成,那么外部将无法引用这个值,当然也就无法改写。 内置的 Symbol 值除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法对象的Symbol.hasInstance属性,指向一个内部方法对象的

12620
  • 广告
    关闭

    50+款云产品免费体验

    提供包括云服务器,云数据库在内的50+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Symbol

    Transfer-Encoding (传输编码) 是常见的 HTTP 头 字段,表示将实体安全传递给用户所采用的编码形式。与另外一个更为常见的 Content-...

    5320

    es6 Symbol

    1.Symbol 值通过Symbol 函数生成,凡是属性名属于Symbol 类型,就是  独一无二的,可以保证不会与其他属性名冲突。       没有参数的时候    let s1 = Symbol();    let s2 = Symbol();    s1 === s2; false       有参数的情况    let s1 = Symbol (foo);    let s2 = Symbol(foo);    s1 === s2 false2.作为属性名的 Symbol  由于每个Symbol 值都是不相等的,用于对象的属性名,就能保证不会重复出现 const obj = {};      let a = Symbol(a);      let b = Symbol(b);      obj = Hello;      obj = World;       Symbol..iterator    Symbol.toPrimitive Symbol.toStringTag

    32970

    ES6——Symbol

    let s = Symbol(); typeof s symbolSymbol创建Symbol 值通过Symbol函数生成,不能使用new,否则会报错。 let s1 = Symbol(foo);let s2 = Symbol(bar); s1 Symbol(foo)s2 Symbol(bar) s1.toString() Symbol(foo)s2 let sym = Symbol(My symbol); your symbol is + sym TypeError: cant convert symbol to string`your symbol let sym = Symbol(My symbol); String(sym) Symbol(My symbol)sym.toString() Symbol(My symbol)Symbol 值也可以转为布尔值 let sy = Symbol(KK);console.log(sy); Symbol(KK)typeof(sy); symbol 相同参数 Symbol() 返回的值不相等let sy1 = Symbol

    16540

    ES6之symbol

    SymbolSymbol值通过Symbol函数生成,由于生成的值是一个原始类型,不是对象,所以不能使用new关键字,否则会报错。Symbol值是唯一的,不会和其他属性名产生冲突。 ; false Uncaught TypeError: Symbol is not a constructorvar symbol = new Symbol(); 注:Symbol值不能和其他值运算 (s1 + symbol); Symbol参数Symbol函数可以接受一个字符串作为参数,表示对这个Symbol值的描述。 = Symbol(obj); console.log(foo); Symbol(foo)console.log(bar); Symbol(bar)console.log(o); Symbol(hello const directions = { UP : Symbol( UP ), DOWN : Symbol( DOWN ), LEFT : Symbol( LEFT ), RIGHT: Symbol(

    32040

    latex math symbol

    20020

    ES6之symbol

    ES6引入了一种新的原始数据类型Symbol,是第七种数据类型,表示独一无二的值。 = Symbol(sym1);var sym2 = Symbol(sym2);console.log(sym1);Symbol(sym1)console.log(sym2);Symbol(sym2)如果是对象 Symbol参数只表示当前值的描述,因为Symbol表示独一无二,所以所有的Symbol都不相等,不管有没有参数:var sym1 = Symbol();var sym2 = Symbol();console.log 通过symbol的独一无二很适合把这个变量通过对象属性变成Symbol。 最后总结一下,Symbol是新增的数据类型,表示独一无二:var sym1 = Symbol();var sym2 = Symbol();console.log(sym1 == sym2);false用来做属性的

    12610

    ES6之Symbol

    如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。 Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。 Symbol.for()会生成一个全局的Symbol,会和之前for生成的Symbol进行覆盖,所以他们是相等的,参见Demo。Symbol.keyFor(symbol):返回一个全局已登记的描述。 keyFor只能获得for声明全局Symbol的描述。无法获得Symbol的描述。Symbol.prototype.description:实例属性,获得Symbol生成时候的描述。 Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。 解决const stu1 = Symbol(李四)const stu2 = Symbol(李四)const grade = { 可计算属性名配合symbol : { address: yyy, tel

    3310

    undefined symbol: sq

    Cannot load usrdevsoftapachemoduleslibphp5.so into server: usrdevsoftapachemoduleslibphp5.so: undefined symbol

    17720

    cannot resolve symbol XXX

    原因:出现这种情况的原因是在IDEA或者myeclipse编译器中没有导入相关的jar包(jar包相当于类的集合,可以使用其中的类);针对IDEA出现cannot resolve symbol XXX解决办法 (Myeclipse需要下载jar包,IDEA只需在pom.xml中添加相关依赖的jar包就行):1、首先确定自己写的是maven类型的项目2、比如我的是这种错误,cannot resolve symbol

    3.6K30

    ES6 Symbol实战

    ES6 Symbol实战前言我们先来看看ES6 Symbol是什么 如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。 Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。 let s1 = Symbol(foo); let s2 = Symbol(bar); s1 Symbol(foo) s2 Symbol(bar) s1.toString() Symbol(foo ) s2.toString() Symbol(bar) 注意,Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。 作为属性名的 Symbol 由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。

    18030

    重温 ES6 Symbol

    Symbol 特性1.Symbol 通过工厂函数创建,不能以 new 的方式创建,所以使用 instanceof 运算符返回的结果为 falsevar sym = Symbol();var sym1 = new Symbol(); TypeErrorsym instanceof Symbol false2.Symbol 使用 typeof 运算符返回 “symbol”var sym = Symbol (foo);typeof sym; symbol3.Symbol 工厂函数能支持一个可选的参数,用于描述当前的 symbolvar sym2 = Symbol(foo);var sym3 = Symbol (foo);4.Symbol 是唯一的,Symbol(foo) == Symbol(foo) 返回 falseSymbol(foo) === Symbol(foo); false5.Symbol 与数值或字符串进行运算时 的一些特性,然后介绍了 Symbol 几个应用场景,若想进一步了解 Symbol,可以阅读一下冴羽大神写的ES6 系列之模拟实现 Symbol 类型这一篇文章。

    20520

    es6(四):Symbol,Set,Map

    1.Symbol:Symbol中文意思“象征”Symbol:这是一种新的原始类型的值,表示独一无二的值(可以保证不与其它属性名冲突)Symbol()函数前面不能使用new,因为生成的Symbol(下面指 s)是一个原始类型的值,不是对象1 let s=Symbol()2 console.log(typeof s)symbolSymbol可以接受一个字符串作为参数,作为对Symbol的描述1 let s1 =Symbol(s1)2 let s2=Symbol(s1)3 Symbol是独一无二的值,所以进行比较返回的永远是false4 console.log(s1===s2)Symbol的主要运用场景之一是对象属性名不会产生覆盖 1 let name1=Symbol()2 let obj={3 name1:apple,此处name1是字符串4 :blueSymbol的name1在对象中必须用中括号括起来,否则被认为是字符串5 } 6 console.log(obj.name1,obj,obj)前面两种是获取apple写法,后面是获取Symbol(即blue)的写法2.Set:新的数据结构,类似数组,但是成员的值是唯一的(所以可以用来去重

    24660

    Ecmascript语法之Symbol

    Symbol值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的Symbol类型。 var s1 = Symbol(foo);var s2 = Symbol(bar); s1 Symbol(foo)s2 Symbol(bar) s1.toString() Symbol(foo)s2 没有参数的情况var s1 = Symbol();var s2 = Symbol(); s1 === s2 false 有参数的情况var s1 = Symbol(foo);var s2 = Symbol var sym = Symbol(My symbol); your symbol is + sym TypeError: cant convert symbol to string`your symbol var sym = Symbol(My symbol); String(sym) Symbol(My symbol)sym.toString() Symbol(My symbol)另外,Symbol

    30690

    元编程之symbol

    更重要的,对象如果暴露出去了,那人家就可以看见key值,也可以直接修改了symbol做唯一keyconst only = Symbol();const obj = {};obj = xxx;此时,只有定义了 symbol的作用域之下才能用到它了,暴露对象出去,就算在console里面给人家看见一个symbol,想修改它或者读取它也无能为力。 此外,symbol是不可枚举的:const only = Symbol();const obj = { a: 1, b: 2 };obj = xxx;Object.keys(obj);同样,JSON.stringify 、for in等等也是会把symbol跳过了。 但是,想像其他变量那样子用怎么办,也就是以不同姿势使用同样的方法,期望得到同样的值,期望近似与symbol(a)和symbol(a)是完全相等这种效果 这时候,Symbol.for刚刚好满足需求了:const

    19320

    重学ES6之Symbol

    新的基本数据类型Symbol声明方法。 let s1 = Symbol()let s2 = Symbol(desc)s2.desctipion let s3 = Symbol.for(xx)s3.keyFor(s3) 返回xx 寻找全局声明 s3的描述 存在就返回,不存在返回undefined api symbol.description 实例属性,获得描述 注意symbol并不是对象 而且symbol声明是独一无二的 但是Symbol.for (a) { 张三:{ tel:666 } } 使用symbol解决const str = Symbol(张三)const str2 = Symbol(张三)let a = { :{ tel:333 Object.getOwnPropertySymbol()可以获取,但是只能获取到symbol定义的属性。 Reflect.ownKeys()可以获取普通属性和symbol

    6330

    Js中Symbol对象

    Js中Symbol对象 ES6引入了一种新的基本数据类型Symbol,表示独一无二的值,最大的用法是用来定义对象的唯一属性名,Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法 每个从Symbol()返回的symbol值都是唯一的,一个symbol值能作为对象属性的标识符。 描述 对于每一个Symbol的值都是不相等的,所以Symbol作为对象的属性名,可以保证属性不重名。 symbol,并放入全局symbol注册表中。 和Symbol()不同的是,用Symbol.for()方法创建的的symbol会被放入一个全局symbol注册表中。 key: 一个字符串,作为symbol注册表中与某symbol关联的键,同时也会作为该symbol的描述。

    26900

    Yet Another Intro for Symbol

    First of all, symbol is a built-in primitive type. And its guaranteed to be unique. And the properties under the Symbol key are hidden from any mechanisms other code will typically use be accessed by Object.getOwnPropertySymbols and Reflect.ownKeys (which will return both string and symbol => typeof val === symbol const buildInSymbols = new Set( Object.getOwnPropertyNames(Symbol) .map(key => Symbol) .filter(isSymbol))Symbol.hasInstanceA method determining if a constructor object recognizes

    1800

    JavaScript和TypeScript中的symbol

    JavaScript 中的符号可以用 Symbol() 工厂函数创建符号:const TITLE = Symbol(title) Symbol 没有构造函数。该参数是可选描述。 const PROD: unique symbol = Symbol(Production mode)const DEV: unique symbol = Symbol(Development mode : unique symbol = Symbol(ORANGE)const COLOR_YELLOW: unique symbol = Symbol(YELLOW)const COLOR_GREEN: unique symbol = Symbol(GREEN)const COLOR_BLUE: unique symbol = Symbol(BLUE)const COLOR_INDIGO: unique symbol = Symbol(INDIGO)const COLOR_VIOLET: unique symbol = Symbol(VIOLET)const COLOR_BLACK: unique symbol

    24720

    扫码关注云+社区

    领取腾讯云代金券