• ES6新特性之Symbol的数据类型


    symbol的特点

    • Symbol的值是唯一的,用来解决命名冲突的问题
    • Symbol值不能与其他数据进行计算
    • Symbol定义的对象属性不能使用for…in遍历循环,可以使用Reflect.ownKeys来获取对象的所有键名

    基本使用

    创建symbol:

      	let s = Symbol() 
        console.log(s,typeof s);
        // Symbol() 'symbol'
    
        let s2 = Symbol("小刘同学")
        let s3 = Symbol("小刘同学")
        console.log(s2==s3);
        // false
    
        // /Symbol.for 创建
        let s4 = Symbol.for("小刘同学")
        let s5 = Symbol.for("小刘同学")
        console.log(s4==s5);
        // true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    不能与其他数据进行运算

     	let result = s+100
        let result = s > 100
        let result = s + s
        // 报错: Cannot convert a Symbol value to a numberat
    
    • 1
    • 2
    • 3
    • 4

    七种数据类型 USONB

    u  undefined
    s  string  Symbol
    o  object
    n  null  number 
    b  Boolean
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Symbol创建对象属性:

     let block = {
            name:"俄罗斯方块",
            up:function(){console.log("改变形状");},
            down:function(){console.log("向下移动");}
        }
        // 我们要往game对象里面添加方法,但是怕game对象中已经存在同名的方法,所以我们这是就可以使用Symbol
    
        let methdos = {
            up:Symbol(),
            dawn:Symbol()
        }
        block[methdos.up]=function(){
            console.log("我可以改变形状");
        }
        block[methdos.dawn]=function(){
            console.log("我可以快速下降");
        }
        console.log(block);
        // {name: '俄罗斯方块', up: ƒ, down: ƒ, Symbol(): ƒ, Symbol(): ƒ}
    
        // 方法二:
        let game = {
            name:"狼人杀",
            [Symbol("say")]:function(){
                console.log("可以开始发言");
            },
            [Symbol("zibao")]:function(){
                console.log("自爆");
            }
        }
        console.log(game);
        // object
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    调用方法:

      let say = Symbol("say")
        let youxi1 = {
            name:"狼人杀",
            [say]: function(){ console.log("我可以发言") },
            [Symbol('zibao')]: function(){ console.log('我可以自爆'); } 
        }
        youxi1[say]();
        // 我可以发言
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Symbol内置值:

    除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行;

    内置Symbol的值调用时机
    Symbol.hasInstance当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法
    Symbol.isConcatSpreadable对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。
    Symbol.species创建衍生对象时,会使用该属性
    Symbol.match当执行 str.match(myObject) 时,如果该属性存在,会调用它,返回该方法的返回值。
    Symbol.replace当该对象被 str.replace(myObject)方法调用时,会返回该方法的返回值。
    Symbol.search当该对象被 str. search (myObject)方法调用时,会返回该方法的返回值。
    Symbol.split当该对象被 str. split (myObject)方法调用时,会返回该方法的返回值。
    Symbol.iterator对象进行 for…of 循环时,会调用 Symbol.iterator 方法,返回该对象的默认遍历器
    Symbol.toPrimitive该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。
    Symbol. toStringTag在该对象上面调用 toString 方法时,返回该方法的返回值
    Symbol. unscopables该对象指定了使用 with 关键字时,哪些属性会被 with环境排除

    特别的Symbol内置值的使用,都是作为某个对象类型的属性去使用;

    演示:

    	class Person{
    		static [Symbol.hasInstance](param){
    			console.log(param);
    			console.log("我被用来检测类型了");
    			return false;
    		}
    	}
    	
    	let o = {};
    	console.log(o instanceof Person);
    	const arr = [1,2,3];
    	const arr2 = [4,5,6];
    	// 合并数组:false数组不可展开,true可展开
    	arr2[Symbol.isConcatSpreadable] = false;
    	console.log(arr.concat(arr2));
    	// 运行结果数组没有展开
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    【聚类】之浅谈(对比K-means跟DB-scan)
    Git的简介以及基本使用
    Vue-2.9单页应用程序
    Ubuntu上阅读Android源码工具
    二维多孔介质图像的粒度分布研究(Matlab代码实现)
    Shell(5)变量的运算和判断
    Dialog动画相关
    【Web开发】基于 Jekyll 中的 Chirpy 模板搭建博客网站(一):成功经验篇
    不确定性弥漫的零食市场,三只松鼠如何交出确定性答案?
    推荐一款管理系统专用低代码工具,一天开发一个系统不是梦
  • 原文地址:https://blog.csdn.net/qq_42251357/article/details/125530748