ES6学习笔记(十一)Symbol

国内用户稳定开通ChatGPT Plus会员的完整实操指南 ChatGPT作为当前最先进的AI对话模型,其技术原理基于Transformer架构和大规模语言预训练。通过深度学习技术,ChatGPT能够理解自然语言并生成高质量回复,在代码生成、文档分析等场景具有重要技术价值。对于需要高频使用的开发者而言,ChatGPT Plus会员提供了优先访问权和GPT-4模型支持等核心功能。在实际应用场景中,国内用户常面临支付限制和区域封锁等挑战。本文针对这些痛点,重点解析如何通过可靠的支付渠道和账号安全策略,实现稳定的会员开通方案,帮助用户突破技术使用壁垒,充分发挥AI助手在开 阅读详情

在JavaScript中,原本是有六种数据类型:undefined,null,数值,字符串,布尔值,对象。在ES6种,新增了Symbol这种数据类型

Symbol的构建


Symbol值通过Symbol函数来生成,表示独一无二的值,其方法可以传入一个字符串作为参数,表示对Symbol值的描述。但不管是否传入参数,参数是否相同,Symbol值都是独一无二的,没有两个Symbol值会相等。

var s1=Symbol()

var s2=Symbol()

s1===s2

//false



var s1=Symbol('s')

var s2=Symbol('s')

s1===s2

//false

若传入的参数不为字符串,那么会将其转为字符串,如果参数是对象,那么会调用参数的toString方法

var s=Symbol(1,2,3)
s
//Symbol(1)


var s=Symbol(true)
s
//Symbol(true)


var obj={}
var s=Symbol(obj)
s
//Symbol([object Object])



var obj = {
  toString() {
    return 'abc';
  }
};

var sym = Symbol(obj);
sym // Symbol(abc)

Symbol不能参与其他类型的运算

let sym = Symbol('My symbol');

"your symbol is " + sym

// TypeError: can't convert symbol to string

`your symbol is ${sym}`

// TypeError: can't convert symbol to string

Symbol可以使用String方法和toString方法显示地转为字符串,也可以使用Boolean方法转为布尔值(都为true),但不能转为数值

let sym = Symbol('My symbol');

String(sym) // 'Symbol(My symbol)'

sym.toString() // 'Symbol(My symbol)'

let sym = Symbol();

Boolean(sym) // true

!sym  // false

if (sym) {

  // ...

}

Number(sym) // TypeError

sym + 2 // TypeError

作为属性名的Symbol


Symbol值由于其独一无二的特性,用来做为属性的键名很合适,不会被其它模块的属性名覆盖。

Symbol值作为属性名要使用方括号定义,不能使用点运算符

var mySymbol = Symbol();

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

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

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

// 以上写法都得到同样结果a[mySymbol] // "Hello!"

var mySymbol = Symbol();
var a = {};
a.mySymbol = 'Hello!';
a[mySymbol] // undefined
a['mySymbol'] // "Hello!"

如上面代码中使用了点运算符,被理解为是用字符串作为属性名

使用Symbol值来定义常量也十分合适,可以保证常量的值都是不相等的

const COLOR_RED    = Symbol();
const COLOR_GREEN  = Symbol();
function getComplement(color) {
  switch (color) {
    case COLOR_RED:
      return COLOR_GREEN;
    case COLOR_GREEN:
      return COLOR_RED;
    default:
      throw new Error('Undefined color');
    }
}

这样子只有使用唯一的常量值才能触发对应得代码块。

还有一点需要注意,Symbol 值作为属性名时,该属性还是公开属性,不是私有属性。

消除魔术字符串


在阮一峰的ES6入门中提到魔术字符串是“在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值”。如下:

function getArea(shape, options) {
  let area = 0;
  switch (shape) {
    case 'Triangle': // 魔术字符串      
      area = .5 * options.width * options.height;
      break;
    /* ... more code ... */
  }
  return area;
}

getArea('Triangle', { width: 100, height: 100 }); // 魔术字符串

Triangle就是一个魔术字符串,它与代码强耦合,但是修改一处又得修改多处,这样就会导致代码的维护出现困难。消除魔术字符串可以通过使用变量来实现,只要变量最终的值不与其他值冲突就可以,这种情况很适合使用Symbol值。

const shapeType = {
  triangle: Symbol()
};

function getArea(shape, options) {
  let area = 0;
  switch (shape) {
    case shapeType.triangle:
      area = .5 * options.width * options.height;
      break;
  }
  return area;
}

getArea(shapeType.triangle, { width: 100, height: 100 });

Symbol值作为属性时的遍历


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]='a'
obj[b]='b'

for (let i in obj)
    console.log(i)
//undefined

Object.keys(obj)
//[]

Object.getOwnPropertyNames(obj)
//[]

JSON.stringify(obj)
//"{}"

Object.getOwnPropertySymbols(obj)
//[Symbol(a), Symbol(b)]

使用Reflect.ownKeys也可以遍历到Symbol键名,除此外,常规的键名也能遍历到。

var a=Symbol('a');

var b=Symbol('b');

var obj={
    foo:1
}

obj[a]=1;

obj[b]=2;

Reflect.ownKeys(obj);
//["foo", Symbol(a), Symbol(b)]

重用Symbol值


Symbol值有时也有要重用的时候,但是Symbol值是独一无二的,无法重用。这是可以使用Symbol.for方法来登记Symbol值,以达到重用的效果。Symbol.for接受一个参数,搜索全局中是否有该参数作名称的Symbol值,若有,则返回该Symbol值,达到重用的效果,若没有,则新建并返回一个以该参数作名称的Symbol值。

let s1 = Symbol.for('foo');

let s2 = Symbol.for('foo');

s1 === s2 // true

Symbol.for和Symbol都可以新建一个Symbol值,不同的是,前者新建的Symbol值会登记,多次创建若传入参数相同则返回相同的Symbol值,而后者的不会,其每次新建的Symbol值都是独一无二的。

Symbol.for("bar") === Symbol.for("bar")
// true

Symbol("bar") === Symbol("bar")
// false

Symbol.keyFor返回一个已登记的Symbol值的key,即被Symbol.for创建的Symbol值得key。

let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"
let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

上面代码中,s1对应的Symbol值是被登记的,而s2对应的Symbol值是没被登记的,所以Symbol.keyFor(s1)返回”foo”,而Symbol.keyFor(s1)返回undefined

要注意的是,Symbol.for为 Symbol 值登记的名字,是全局环境的,可以在不同的 iframe 或 service worker 中取到同一个值。

iframe = document.createElement('iframe');
iframe.src = String(window.location);
document.body.appendChild(iframe);


iframe.contentWindow.Symbol.for('foo') === Symbol.for('foo')
// true

内置的Symbol值


ES6提供了11个内置的Symbol值,在调用某些对象的方法和操作时会调用这些值指向的方法

Symbol.hasInstance 

对象的Symbol.hasInstance属性指向一个内部方法,当其他对象在使用instanceof运算符判断是否为该对象实例时,会调用该方法

class MyClass {
  [Symbol.hasInstance](foo) {
    return foo instanceof Array;
  }
}

[1, 2, 3] instanceof new MyClass() // true

上面代码中,[1,2,3]使用instanceof运算符判断是否为MyClass的实例时调用了MyClass的[Symbol.hasInstance](foo)。

Symbol.isConcatSpreadable

Symbol.isConcatSpreadable属性用于表示对象用于Array.prototype.concat()时是否可以展开。对于数组,默认是可以展开的,所以在Symbol.isConcatSpreadable属性为true和undefined时可以展开,为false时不可展开。(Symbol.isConcatSpreadable属性默认为undefined)

let arr1 = ['c', 'd'];
['a', 'b'].concat(arr1, 'e') // ['a', 'b', 'c', 'd', 'e']
arr1[Symbol.isConcatSpreadable] // undefined
let arr2 = ['c', 'd'];
arr2[Symbol.isConcatSpreadable] = false;
['a', 'b'].concat(arr2, 'e') // ['a', 'b', ['c','d'], 'e']
arr2[Symbol.isConcatSpreadable] = true;
['a', 'b'].concat(arr2, 'e') // ['a', 'b', 'c', 'd', 'e']

上面代码中可以看到,没有设置Symbol.isConcatSpreadable属性时,默认可以展开,其值为undefined,将其设置为false后,即不能展开,将其设置回true后,又可以展开了。

类似数组正好相反,默认不能展开,即Symbol.isConcatSpreadable属性为true时可展开,为undefined和false时不可展开

let obj = {length: 2, 0: 'c', 1: 'd'};
['a', 'b'].concat(obj, 'e') // ['a', 'b', obj, 'e']
obj[Symbol.isConcatSpreadable] = true;
['a', 'b'].concat(obj, 'e') // ['a', 'b', 'c', 'd', 'e']
obj[Symbol.isConcatSpreadable] = false;
['a', 'b'].concat(obj, 'e') // ['a', 'b', obj, 'e']

Symbol.isConcatSpreadable属性也可以定义在类里面。定义的位置可以是在实例上,也可以在类本身,效果相同

class A1 extends Array {
  constructor(args) {
    super(args);
    this[Symbol.isConcatSpreadable] = true;
  }
}

class A2 extends Array {
  constructor(args) {
    super(args);
  }
  get [Symbol.isConcatSpreadable] () {
    return false;
  }
}

let a1 = new A1();
a1[0] = 3;
a1[1] = 4;
let a2 = new A2();
a2[0] = 5;
a2[1] = 6;
[1, 2].concat(a1).concat(a2)
// [1, 2, 3, 4, [5, 6]]

Symbol.species

Symbol.species属性指向一个构造函数,创建衍生对象时,会使用该属性

class MyArray extends Array {
}
const a = new MyArray(1, 2, 3);
const b = a.map(x => x);
const c = a.filter(x => x > 1);

b instanceof MyArray // true
c instanceof MyArray // true

像上面的代码中,b和c是a的衍生对象,虽然b和c是使用数组方法生成的,但它们实际上是MyArray的实例。为了让其变为Array的实例,可以使用该属性返回Array

class MyArray extends Array {
  static get [Symbol.species]() { return Array; }
}

const a = new MyArray();

const b = a.map(x => x);

b instanceof MyArray // false

b instanceof Array // true

上面代码中,因为定义了该属性,所以在使用该实例来构建衍生对象时,衍生对象的实例会是Array实例。

总结来说,Symbol.species属性是用于当我们要创建一个继承其他类的实例的衍生对象时,如果想让其变为其继承的类的实例的话,就可以使用这个属性。

“它主要的用途是,有些类库是在基类的基础上修改的,那么子类使用继承的方法时,作者可能希望返回基类的实例,而不是子类的实例。”---------阮一峰的ES6入门

Symbol.match

对象的Symbol.match属性,指向一个函数,当使用str.match(object)时,如果该属性存在,会调用该属性,返回对应的值。

class MyMatcher {
  [Symbol.match](string) {
    return 'hello world'.indexOf(string);
  }
}

'e'.match(new MyMatcher()) // 1

上面’e’这个字符串调用了match方法,参数为MyMatcher类的实例对象,所以调用了该对象的Symbol.match属性指向的函数,即返回了'hello world'.indexOf('e'),所以最后返回了1。

Symbol.replace

对象的Symbol.replace属性,指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值。

const x = {};

x[Symbol.replace] = (...s) => console.log(s);

'Hello'.replace(x, 'World') // ["Hello", "World"]

Symbol.replace方法会收到两个参数,第一个参数是replace方法正在作用的对象,上面例子是Hello,第二个参数是替换后的值,上面例子是World。上面代码用扩展运算符获取这两个参数,所以s为这两个参数作为成员的数组。

Symbol.search

对象的Symbol.search属性,指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值。

class MySearch {
  constructor(value) {
    this.value = value;
  }
  [Symbol.search](string) {
    return string.indexOf(this.value);
  }
}

'foobar'.search(new MySearch('foo')) // 0

上面代码中在调用search方法时调用了Mysearch类中Symbol.search属性指向的方法,即返回了查找的字符串在调用该方法的字符串中的位置。

Symbol.split

对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值。

class MySplitter {
  constructor(value) {
    this.value = value;
  }
  [Symbol.split](string) {
    let index = string.indexOf(this.value);
    if (index === -1) {
      return string;
    }
    return [
      string.substr(0, index),
      string.substr(index + this.value.length)
    ];
  }
}

'foobar'.split(new MySplitter('foo'))
// ['', 'bar']'

foobar'.split(new MySplitter('bar'))
// ['foo', '']

'foobar'.split(new MySplitter('baz'))
// 'foobar'

Symbol.iterator

对象的Symbol.iterator属性,指向该对象的默认遍历器方法。

class Collection {
  *[Symbol.iterator]() {
    let i = 0;
    while(this[i] !== undefined) {
      yield this[i];
      ++i;
    }
  }
}

let myCollection = new Collection();
myCollection[0] = 1;
myCollection[1] = 2;

for(let value of myCollection) {
  console.log(value);
}

// 1
// 2



Symbol.toPrimitive

对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。

Symbol.toPrimitive被调用时,会接受一个字符串参数,表示当前运算的模式,一共有三种模式。

Number:该场合需要转成数值

String:该场合需要转成字符串

Default:该场合可以转成数值,也可以转成字符串

let obj = {
  [Symbol.toPrimitive](hint) {
    switch (hint) {
      case 'number':
        return 123;
      case 'string':
        return 'str';
      case 'default':
        return 'default';
      default:
        throw new Error();
     }
   }
};

2 * obj // 246  返回number 即变为123
3 + obj // '3default'  返回default 即变为'default'
obj == 'default' // true
String(obj) // 'str'

Symbol.toStringTag

对象的Symbol.toStringTag属性,指向一个方法。在该对象上面调用Object.prototype.toString方法时,如果这个属性存在,它的返回值会出现在toString方法返回的字符串之中,表示对象的类型。也就是说,这个属性可以用来定制[object Object]或[object Array]中object后面的那个字符串。

class Collection {
  get [Symbol.toStringTag]() {
    return 'xxx';
  }
}

let x = new Collection();
Object.prototype.toString.call(x) // "[object xxx]"

上面的代码在使用Collection实例调用toString方法时调用了Symbol.toStringTag属性指向的方法,返回了其定义好的内容。

ES6 新增内置对象的Symbol.toStringTag属性值如下。

  • JSON[Symbol.toStringTag]:'JSON'
  • Math[Symbol.toStringTag]:'Math'
  • Module 对象M[Symbol.toStringTag]:'Module'
  • ArrayBuffer.prototype[Symbol.toStringTag]:'ArrayBuffer'
  • DataView.prototype[Symbol.toStringTag]:'DataView'
  • Map.prototype[Symbol.toStringTag]:'Map'
  • Promise.prototype[Symbol.toStringTag]:'Promise'
  • Set.prototype[Symbol.toStringTag]:'Set'
  • %TypedArray%.prototype[Symbol.toStringTag]:'Uint8Array'等
  • WeakMap.prototype[Symbol.toStringTag]:'WeakMap'
  • WeakSet.prototype[Symbol.toStringTag]:'WeakSet'
  • %MapIteratorPrototype%[Symbol.toStringTag]:'Map Iterator'
  • %SetIteratorPrototype%[Symbol.toStringTag]:'Set Iterator'
  • %StringIteratorPrototype%[Symbol.toStringTag]:'String Iterator'
  • Symbol.prototype[Symbol.toStringTag]:'Symbol'
  • Generator.prototype[Symbol.toStringTag]:'Generator'
  • GeneratorFunction.prototype[Symbol.toStringTag]:'GeneratorFunction'

Symbol.unscopables

对象的Symbol.unscopables属性,指向一个对象。该对象指定了使用with关键字时,哪些属性会被with环境排除。

Object.keys(Array.prototype[Symbol.unscopables])

// ['copyWithin', 'entries', 'fill', 'find', 'findIndex', 'includes', 'keys']

上面的代码说名列出来的这7个属性会被with命令排除

// 没有 unscopables 时

class MyClass {
  foo() { return 1; }
}

var foo = function () { return 2; };
with (MyClass.prototype) {
  foo(); // 1
}

// 有 unscopables 时

class MyClass {
  foo() { return 1; }
  get [Symbol.unscopables]() {
    return { foo: true };
  }
}

var foo = function () { return 2; };
with (MyClass.prototype) {
  foo(); // 2
}

上面代码在MyClass中将Symbol.unscopables属性指向的对象中的foo设置为true,使得在使用with命令时忽略了其中的foo,返回了外部的foo。


参考自阮一峰的《ECMAScript6入门》


ES6学习笔记目录

 

ES6学习笔记(一)let和const

ES6学习笔记(二)参数的默认值和rest参数

ES6学习笔记(三)箭头函数简化数组函数的使用

ES6学习笔记(四)解构赋值

ES6学习笔记(五)Set结构和Map结构

ES6学习笔记(六)Iterator接口

ES6学习笔记(七)数组的扩展

ES6学习笔记(八)字符串的扩展

ES6学习笔记(九)数值的扩展

ES6学习笔记(十)对象的扩展

ES6学习笔记(十一)Symbol

ES6学习笔记(十二)Proxy代理

ES6学习笔记(十三)Reflect对象

ES6学习笔记(十四)Promise对象

ES6学习笔记(十五)Generator函数

ES6学习笔记(十六)asnyc函数

ES6学习笔记(十七)类class

ES6学习笔记(十八)尾调用优化

ES6学习笔记(十九)正则的扩展

ES6学习笔记(二十)ES Module的语法

配置xen上VM混杂模式,使其能捕获物理网络流量 本文目的:配置VM和xen相应的物理网卡(pif)和虚拟网卡(vi 阅读详情

相关推荐

常见的十大量化投资策略(附源码)

量化投资策略是利用量化的方法,进行金融市场的分析、判断和交易的策略、算法的总称。著名的量化投资策略有以下10种(注:策略源码模板不能直接用于实盘交易,仅供探讨交流) 01、海龟交易策略 海龟交易策略是一套非常完整的趋势跟随型的自动化交易策略。这个复杂的策略在入场条件、仓位控制、资金管理、止损止盈等各个环节,都进行了详细的设计,这基本上可以作为复杂交易策略设计和开发的模板。 海龟交易策略源码:https://www.myquant.cn/docs/python_strategyies/110 0.

小壁虎的春天 2万+

ES6-11Symbol:Symbol 特点用法以及11个内置的 Symbol 值

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它属于 JavaScript 语言的数据类型之一。除了定义Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值

chenjunxing1992的博客 459

Java使用easyExcel生成excel文件直接写入邮件附件并发送

1.引入pom依赖 <!-- email --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <!-- easyexcel需要依赖poi jar包 --> <depe

weixin_50493320的博客 3910

ES6新特性——symbol数据类型

ES6引入了一种新的原始数据类型symbol,表示独一无二的值;给对象添加属性和方法的 它是JavaScript语言的第七种数据类型,是一种类似于字符串的数据类型。

weixin_51747462的博客 576

Modscan32连接上了却没数据?一文拆解所有报错(从“Device NOT CONNECTED”到“Checksum Error”)

本文深入解析Modscan32连接异常问题,从状态栏报错到数据异常,提供系统化的诊断思路和解决方案。涵盖物理层问题、配置参数错位、端口占用冲突等常见故障,帮助工程师快速定位和解决Modbus通信中的各类错误。

weixin_30384217的博客 397

CTFShow萌新区全攻略:从密码破解到Web渗透的实战解析

本文为CTFShow萌新区新手提供从密码破解到Web渗透的完整实战攻略。文章深入解析了密码学、隐写术、杂项和Web安全四大核心方向,分享了实用的解题工具、思维方法和绕过技巧,旨在帮助初学者建立系统的安全竞赛解题体系,而不仅仅是提供一份题解(WP)。

weixin_29216957的博客 299

ES6 Symbol

一、Symbol数据类型 1.创建symbol // 1.用Symbol创建 let symbol = Symbol() console.log(symbol, typeof symbol); //Symbol() 'symbol' let name1 = Symbol('张三') let name2 = Symbol('张三') console.log(name1, name2); //Symbol(张

m0_58510118的博客 300

TGK-planner编译报错PLUGINLIB_EXPORT_CLASS解决

TGK-planner编译报错解决。

latter97的博客 857

ES6 Symbol 内置值及使用场景

Symbol 基本使用ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。Symbol 特点1) Symbol 的值是唯一的,用来解决命名冲突的问题2) Symbol 值不能与其他数据进行运算3) Symbol 定义 的 对象属 性 不能 使 用 for…in 循 环遍 历 ,但 是可 以 使 用Reflect.ownKeys 来获取对象的所有键名symbol使用场景示例: Symbol的使用场景(1)增加方法

wuxiaopengnihao1的博客 1154

stc8g1k08硬件iic读取aht20温湿度及0.91寸oled显示

使用stc8g1k08读取aht20温湿度及0.91寸oled显示。

qq_61688416的博客 2771

Dify 第 2 篇 Dify 插件离线安装

Dify是一个支持插件扩展的AI平台,其插件市场提供5种类型插件(模型、工具、Agent策略、扩展、插件包)。由于默认pip安装速度慢,可通过dify-plugin-repackaging工具将插件转换为离线包(使用阿里云镜像加速)。该工具提供两种方式:1)自备Python环境执行脚本;2)使用Docker环境(推荐)。脚本支持从Dify市场或GitHub下载插件,并重新打包为含依赖的离线包,便于通过"本地插件"方式快速安装。

甘蓝的专栏 1264

js ES6 中新增的 Symbol 原始数据类型

前言 ES6 的原始数据类型除了 Number 、String 、Boolean 、Object、null 和 undefined 外,还新增了 Symbol 类型。 Symbol 原始数据类型表示独一无二的值,用来定义对象的唯一属性名。 1、创建一个 Symbol 类型的值——Symbol() 函数 Symbol() 函数用来创建一个 Symbol 类型的值。该函数可以接受一个参数:(可选的)一个字符串。该参数表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区.

青蛙king的博客 410

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ES6之Symbol详解

目录一、什么是Symbol?二、Symbol的作用三、Symbol的语法规范1. 基本语法2. Symbol属性的遍历3. Symbol.for(),Symbol.keyFor()四、内置的Symbol值1. Symbol.hasInstance2. Symbol.isConcatSpreadable3. Symbol.species4. Symbol.match/replace/search/...

夕山雨的博客 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ES6——Symbol

【代码】ES6——Symbol。

Rookie_lei的博客 1910

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

es6中symbol详解

ES6中引入了第6种原始类型:Symbol 创建Symbol let firstName = Symbol(); let person = {}; person[firstName] = '欧阳不乖' console.log(person[firstName]); //'欧阳不乖' Symbol函数接受一个可选参数,可以添加一段文本描述即将创建的Symbol,这段属描述不可用于属性访问,但是建议...

团长的博客 4099

ES6—Symbol详解

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

weixin_51781852的博客 1655

ES6中的Symbol类型

小火柴的蓝色理想 &lt;/div&gt;&lt;!--end: blogTitle 博客的标题和副标题 --&gt; &lt;div id="navigator"&gt; 博客园 首页 新随笔 联系 订阅 管理 &lt;div id="blog_stats"&gt; 随笔 - 698&nbsp; 文章 - 0&nbsp; 评论 - 1

思无邪的博客 8808

ES6中的 Symbol

目录1.概述2.symbol值的生成3.作为属性名的Symbol值4.symbol数据的总结注意symbol是一个ES6标准中新增的一种基本数据类型,Symbol类型数据的原理:保证每一个属性名都是独一无二的,从根本上防止属性名的冲突。symbol 的值是通过 Symbol() 函数生成, 每一个 symbol 的值都是唯一的,Symbol() 函数可以接受一个字符串作为参数,表示对该值的描述,因此即使定义 symbol 使用相同的参数互相之间也不是相同的: 3.作为属性名的Symbol值

weixin_47075145的博客 2622

ES6之Symbol

TOC/TOC。

BradenHan的专栏 1378

ES6的Symbol竟然那么强大

之前本文发表于掘金 symbol是es6出的一种类型,他也是属于原始类型的范畴(string, number, boolean, null, undefined, symbol) basic let name = Symbol('xiaohesong') typeof name // 'symbol' let obj = {} obj[name] = 'xhs' console.log(obj[n...

xiaohesong 2724

es6学习4:Symbol

ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol。

Sakuraovu的博客 1578

symbol【ES6】

什么是Symbol,Symbol的特点,创建方法,注意点:不能进行运算、显示转换toString、隐式转换boolean,不能进行for in循环遍历,Object.getOwnPropertySymbols(),Reflect.ownKeys() ,作为常量

qq_53002037的博客 1265

ES6学习笔记——Symbol类型

补充学习一下 Symbol 的知识,包含以下内容: 1、Symbol类型理解与概述; 2、通过Symbol.prototype.description取得描述字符串; 3、Symbol主要作为属性名的用途; 4、Symbol作为属性名时是公有属性,但不被常规的遍历方法所获取; 5、Symbol.for()和Symbol()的区别; 6、内置Symbol值。 文章目录概述1、不可使用new操作符2、接收不同参数的情况3、不能直接参与与其他类型的值的运算Symbol.prototype.description.

华工Web练习生 1437

ES6-Symbol

在这个例子中,我们两次调用Symbol.for('globalSymbol'),尽管是在不同的代码位置,但由于使用了相同的键'globalSymbol',所以sym1和sym2指向的是同一个 Symbol。通过查看description属性的值,开发者可以更清晰地理解代码中各个 Symbol 的作用,尤其是在复杂的项目中,众多的 Symbol 可能会让代码阅读变得困难,description属性能够提供关键的上下文信息。如果没有找到,则在全局 Symbol 注册表中创建一个新的 Symbol,并返回它。

2403_87566238的博客 1009

ES6 Symbol基本用法详解

简介 大家都知道,ES5的对象的属性名都是字符串,这样就很容易造成属性名冲突,从而替代了原有对象的方法,于是,ES6就提供了Symbol,表示独一无二的值,它是一种新的原始数据类型,symbol类型。 注意哦!Symbol是基本数据类型,所以不能使用new命令,否则会报错。 基本用法 let s1 = Symbol([1,2]); let s2 = Symbol('...

麻瓜哇哇哇的博客 4479
上一篇: ES6学习笔记(十)对象的扩展
下一篇: ES6学习笔记(十二)Proxy代理
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值