资讯专栏INFORMATION COLUMN

Symbol特性

lentoo / 2012人阅读

摘要:值通过函数生成,使用,结果为函数前不能使用命令,否则会报错。函数的参数只是表示对当前值的描述,相同参数的函数的返回值是不相等的。值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性。方法返回一个已登记的类型值的。

ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。 1. Symbol 值通过 Symbol 函数生成,使用 typeof,结果为 "symbol"
var s = Symbol();
console.log(typeof s); // "symbol"
2. Symbol 函数前不能使用 new 命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。 3. instanceof 的结果为 false
var s = Symbol("foo");
console.log(s instanceof Symbol); // false
4. Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
var s1 = Symbol("foo");
console.log(s1); // Symbol(foo)
5. 如果 Symbol 的参数是一个对象,就会调用该对象的 toString 方法,将其转为字符串,然后才生成一个 Symbol 值。
const obj = {
  toString() {
    return "abc";
  }
};
const sym = Symbol(obj);
console.log(sym); // Symbol(abc)
6. Symbol 函数的参数只是表示对当前 Symbol 值的描述,相同参数的 Symbol 函数的返回值是不相等的。
// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol();

console.log(s1 === s2); // false

// 有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo");

console.log(s1 === s2); // false
7. Symbol 值不能与其他类型的值进行运算,会报错。
var sym = Symbol("My symbol");

console.log("your symbol is " + sym); // TypeError: can"t convert symbol to string
8. Symbol 值可以显式转为字符串。
var sym = Symbol("My symbol");

console.log(String(sym)); // "Symbol(My symbol)"
console.log(sym.toString()); // "Symbol(My symbol)"
9. Symbol 值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性。
var mySymbol = Symbol();

// 第一种写法
var a = {};
a[mySymbol] = "Hello!";

// 第二种写法
var a = {
  [mySymbol]: "Hello!"
};

// 第三种写法
var a = {};
Object.defineProperty(a, mySymbol, { value: "Hello!" });

// 以上写法都得到同样结果
console.log(a[mySymbol]); // "Hello!"
10. Symbol 作为属性名,该属性不会出现在 for...in、for...of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。但是,它也不是私有属性,有一个 Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名。
var obj = {};
var a = Symbol("a");
var b = Symbol("b");

obj[a] = "Hello";
obj[b] = "World";

var objectSymbols = Object.getOwnPropertySymbols(obj);

console.log(objectSymbols);
// [Symbol(a), Symbol(b)]
11. 如果我们希望使用同一个 Symbol 值,可以使用 Symbol.for。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。
var s1 = Symbol.for("foo");
var s2 = Symbol.for("foo");

console.log(s1 === s2); // true
12. Symbol.keyFor 方法返回一个已登记的 Symbol 类型值的 key。
var s1 = Symbol.for("foo");
console.log(Symbol.keyFor(s1)); // "foo"

var s2 = Symbol("foo");
console.log(Symbol.keyFor(s2) ); // undefined

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95527.html

相关文章

  • ES6 系列之模拟实现 Symbol 类型

    摘要:值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性。的结果为因为不是通过的方式实现的,所以的结果自然是。这个实现类似于函数记忆,我们建立一个对象,用来储存已经创建的值即可。方法返回一个已登记的类型值的。 前言 实际上,Symbol 的很多特性都无法模拟实现……所以先让我们回顾下有哪些特性,然后挑点能实现的……当然在看的过程中,你也可以思考这个特性是否能实现,如果可以实现,该...

    wangjuntytl 评论0 收藏0
  • Javascript Symbol 隐匿的未来之星

    摘要:通常,它做为一个偏功能性的标记来表示,在全剧中它是唯一的。并且使用来生成,会在存入当前全局上下文中一个结构中,我们称它为顾名思义,它是全局的,所以使用时我们需要谨慎,尤其是在大型项目中。 ES6中基础类型增加到了7种,比上一个版本多了一个Symbol,貌似出现了很长时间,但却因没有使用场景,一直当作一个概念层来理解它,我想,用它的最好的方式,还是要主动的去深入了解它吧,所以我从基础部分...

    wwolf 评论0 收藏0
  • 第七元素

    摘要:今天,我们先看看第七种。这就是引入的原因。实际用途当你第一眼看到,你会在想,什么鬼,不想用。注册表每个是唯一的,即使两个描述一样的也不相等。第一句和第二句都是创建一个,不同的是,不再是每次创建不同的,它会从注册表中找,找到了就会返回。 typeof Symbol(): symbol Javascript 一共有6种数据类型:Undefined、Null、Number、String、Ob...

    王晗 评论0 收藏0
  • JS之对象(2)

    摘要:前言一篇彻底搞懂对象从此不用担心没对象啦本文从对象定义方法对象属性数据类型遍历几种方法对象拷贝和拦截对象属性方法及代码实现几个方面由浅入深介绍对象对象的声明方法字面量构造函数的作用创了一个新对象指向构造函数构造函数有返回会替换出来的对象如果 showImg(https://segmentfault.com/img/bVboXHr?w=550&h=392); 前言 一篇彻底搞懂对象,从此...

    CarterLi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<