美文网首页JavaScript
ES6系列 (八)符号(Symbol)

ES6系列 (八)符号(Symbol)

作者: Eastboat | 来源:发表于2019-10-11 23:54 被阅读0次

目标

  • 使用符号作为常量
  • 使用符号作为对象键
  • 使用全局符号创建行为钩子
  • 使用公知符号修改对象行为

符号symbol

作为添加在ES6中的新原语,是js有史以来第一个新增的原语,用来钩住内置js对象的行为的唯一值,分为三类:

  1. 唯一符号
  2. 去全局符号
  3. 公知符号

使用符号作为常量

在以前我经常会使用flag来作为标志,标志一个特殊变量,用作识别,但是会增加命名冲突的可能性


const position_main={
    TOP:'top',
    BOTTOM:'bottom'
}
const position_other={
    T:'top',
    L:'left'
}
function addToolTip(position){
    switch(position){
        case position_main.TOP:
            console.log(`添加在上面`);
            break;
        case position_main.BOTTOM:
            console.log(`添加在下面`);
            break;
        default:
            throw new Error(`出错了`);
            break;
    }  
}
addToolTip(position_other.T)  
//此处我们本来是想输出错误信息,但是他与主要的position_main也匹配了

原因:标志不是唯一的

解决办法:使用唯一符号解决命名冲突问题,创建唯一符号,每一个符号都是独特的

Symbol()===Symbol()  //false
Symbol('top')===Symbol('top')  //false

调用Symbol函数时,每次都在内存中创建了新的值,因此新的符号永远不会等同于内存中其他地方的另一个符号Symbol创建的符号,永远不会发生冲突

//重写上面案例
const position_main={
    TOP:Symbol('top'),
    BOTTOM:Symbol('bottom')
}
const position_other={
    T:'top',
    L:'left'
}
function addToolTip(position){
    switch(position){
        case position_main.TOP:
            console.log(`添加在上面`);
            break;
        case position_main.BOTTOM:
            console.log(`添加在下面`);
            break;
        default:
            throw new Error(`出错了`);
            break;
    }  
}
addToolTip(position_other.T) //Error: 出错了  因为是position_main.TOP唯一值

使用符号作为对象键

开发者会使用前导下划线给对象添加属性,以此表示他们是作为私有属性存在的,如:Store._internals,但是除非使用Object.defineProperty指定,否则这些值是枚举的,意味着他们仍然可以通过for..in或者JSON.stringify()使用

我们可以使用符号作为属性名称得到相同的伪私有属性

const Store={
    [Symbol('_internals')]:{
        //.....使用符号作为属性名称时,必须是计算属性名称
    }
}

此时属性是不可枚举的

使用全局符号创建行为钩子(更新中...)

使用公知符号修改对象行为(更新中...)

相关文章

  • ES6系列 (八)符号(Symbol)

    目标 使用符号作为常量 使用符号作为对象键 使用全局符号创建行为钩子 使用公知符号修改对象行为 符号symbol ...

  • es6-Symbol数据类型

    Symbol Symbol 是一个符号对象,是es6新添加的数据类型,通过Symbol()可以得到一个唯一的值,所...

  • 25.Symbol的使用

    Symbol是什么呢?Symbol是ES6中新增的一个基本数据类型,翻译为符号。那么为什么需要Symbol呢? 在...

  • ES6 Symbol探究

    Symbol 是什么 Symbol ===> 象征;符号;标志在 ES6 中是一种新的数据类型,它的目的是为了给数...

  • ES6 符号

    普通符号 es6 规定,现在属性名除了是字符串之外,还有了一个属性名 symbol 符号是 ES6 新增的一个数据...

  • [ES6] 符号

    普通符号 符号是ES6新增的一个数据类型,它通过函数Symbol(符号名)来创建 符号设计的初衷,是为了给对象设置...

  • 符号-普通符号

    概述 符号是ES6新增的一个数据类型,它通过使用函数 Symbol(符号描述) 来创建。 符号设计的初衷,是为了给...

  • JavaScript 基本(二)symbol类型

    symbol是ES6新增的类型。符号是原始值,且符号实例是唯一的、不可变的。符号的用途是确保对象属性使用唯一标识符...

  • 六: ES6 符号 Symbol

    前言 该部分为书籍 深入理解ES6 第六章(符号与符号属性)笔记 创建符号值 符号没有字面量形式, 这在 JS 的...

  • iOS Crash及其符号化

    符号 维基百科关于符号(Symbol)定义: A symbol in computer programming i...

网友评论

    本文标题:ES6系列 (八)符号(Symbol)

    本文链接:https://www.haomeiwen.com/subject/tgdfmctx.html