• Symbol


    Ecmascript-6
    ES6 发布时间2015-6月,又称ECMAScript 2015

    http://kangax.github.io/compat-table/es6/

    概述

    对象的属性名都是字符串,容易造成属性冲突; 而ES6引入Symbol的原因就是为了从根本上防止属性名的冲突
    原始数据类型

    Undefined
    Null
    Boolean
    String
    Number
    Object

    新的原始数据类型 Symbol

    Symbol的值是通过Symbol函数生成的,这就是说,对象的属性名现在又两种类型,一种是原来的字符串,另一种就是Symbol类型;凡是属性名是属于symbol类型的,都是独一无二的;
    可以保证不会与其他的属性名产生冲突

    var s = Symbol('params'); //params 参数可以生成一个对Symbol的描述值; 方便控制台打印的时候显示
    typeof s // "Symbol"
    
    params只是一个描述字段;相同的描述生成的Symbol值还是不同的
    

    作为属性名的Symbol

     var myS = Symbol('test');
     
     var a = {};
     a[myS] = 'hello world';
     
     var a = {
    	 [myS]: 'Hello world'
     };
     
     var a = {};
     Object.defineProperty( a, myS, {value: 'Hello World!'});
     
    a[mySymbol] //
    
    • 不能通过 . 操作符操作Symbol属性
    • 由于Symbol不是字符串类型,为了与字符串属性进行区分;通过添加[]方括号的方式来处理
    • 应用在switch语句中可确保常量值的唯一

    实例:消除魔术字符串

    • 魔术字符串-代码中多次出现,与代码形成了强耦合的某个具体字符串和数值
    • 定义一个公共的量来处理

    属性名的遍历

    • 不会出现在for...in/for...of的循环中也不会被Object.keys()/Object.getOwnPropertyNames()返回但是他也不是私有属性
    • 有一个Object.getOwnPropertySymbols方法。可以获取指定对象的所有Symbol属性名
    • 以上特性,可以使其定义一些非私有的内部调用的方法

    Symbol.for(), Symbol.keyFor()

    • Symbol.for()
    • 以参数去查找,如果有,则返回这个Symbol值,如果没有,重新建一个Symbol值并返回
    • 但是需要两者都是调用Symbol.for() 才会相等
    var s = Symbol('test2'); 
    var ss = Symbol.for('test2');  
    ss == s //false
    
    var s = Symbol.for('test2'); 
    var ss = Symbol.for('test2');  
    ss == s //true
    
    • Symbol.keyFor() 返回已经登记过[Symbol.for('xx')]的symbol的key值;若未登记则为undefined
    var s = Symbol.for('test');
    var ss = Symbol.keyFor(s);
    console.info(ss) // test
    

    内置的Symbol的属性

    • [Symbol.hasInstance] 判断该对象是否为某个构造函数的实例
    • [Symbol.isConcatSpreadable] 表示对象在使用Array.prototype.concat()时,是否可以展开
    • [Symbol.species] 指向一个方法,该对象作为构造函数创造实例时,会调用这个方法
    • [Symbol.match] 对象的Symbol.match属性,指向一个函数。当执行str.match(obj)是,如果改属性存在,会调用这个函数
    • [Symbol.replace] 指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值
    • [Symbol.search] 指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值
    • [Symbol.split] 指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值
    • [Symbol.iterator] 即该对象进行for...of循环时,会调用这个方 法,返回该对象的默认遍历器
    • [Symbol.toPrimitive] 对象的一个属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该方法对象的原始类型值
    • [Symbol.toStringTag] 可以用来定制指向Object.prototype.toString方法时,如果这个属性存在;它的返回值会出现在toString方法返回的字符串之中。表示对象的类型
    • [Symbol.toStringTag] 可以用来定制[object Object/Array 后面的Object/Array
  • 相关阅读:
    ajax入门之建立XHR对象 (1)
    JavaScript中的函数有什么特点? 应该怎样优化?
    什么是JavaScript中的面向对象? 与其他编程语言的面向对象有什么区别? 什么是原型?
    Web页面加载,如何分析页面性能?如何进行优化?
    一个页面从输入 URL 到页面加载完的过程中都发生了什么事情?
    关于清除浮动与闭合浮动
    如何更加安全快速的使用富文本编辑器
    用Python实现一个爬取XX大学电费通知的小脚本
    在Sublime Text3上面更加方便愉快的写php
    如何搭建一个WAMP环境
  • 原文地址:https://www.cnblogs.com/pengsn/p/12908718.html
Copyright © 2020-2023  润新知