zoukankan      html  css  js  c++  java
  • es6+最佳入门实践(6)

    6.Symbol用法

    6.1.什么是Symbol?

    Symbol是es6中一种新增加的数据类型,它表示独一无二的值。es5中我们把数据类型分为基本数据类型(字符串、数字、布尔、undefined、null)和引用数据类型(Object),在es6中新增的Symbol数据类型划分到基本数据类型

    为什么会有这样一种数据类型呢?

    //别人给了你一个定义好的对象
    var obj = {
        name: "xiaoqiang",
        showName: function(){alert(1)}
    }
    //你拿到对象想给这对象添加新的属性和方法的时候,可能会创建出一个name属性和showName方法
    obj.name = "nodeing"
    obj.showName = function(){alert(2)}
    
    //这个时候,新增加的方法和属性就会去把原有的方法覆盖,这样就产生了冲突
    

    由于对象的属性和方法是字符串组成,这样新增方法和属性的时候有可能冲突,在es6中就新增了一种数据类型,表示独一无二的值

    通过Symbol函数可以创建一个独一无二的值

    let s1 = Symbol()
    let s2 = Symbol()
    
    console.log(s1 === s2) //false 说明创建出来的s1和s2 并不是相同的
    console.log(s1, s2); //Symbol() Symbol()
    

    上述代码中,打印出来的值都是Symbol() , 怎样才能区分谁是s1,谁是s2呢?我们可以通过传参的形式来解决

    //传入的参数就是对当前Symbol的描述,用来区分Symbol
    let s1 = Symbol("s1")
    let s2 = Symbol("s2")
    console.log(s1, s2);  //Symbol(s1) Symbol(s2)
    

    6.2.应用场景

    Symbol通常用于设置对象的属性名或者方法,防止新加入的属性或者方法与原来属性或者方法冲突

    let name = Symbol("name");
    
    let name = Symbol("name");
    let show = Symbol("show");
    
    let obj = {
        //设置属性
        [name]: 'xiaoqiang',
        [show](){alert(1)}
    };
    //取值
    console.log(obj[name]);
    //调用方法
    obj[show]()
    

    6.3.注意事项

    注意1: Symbol里面的参数仅仅是对Symbol的描述,没有其他意义,因此,即使描述相同,Symbol也是不同的

    console.log(Symbol("nodeing") === Symbol("nodeing")) //false
    

    注意2:Symbol函数不能使用New关键字调用

    let s1 = new Symbol(); //报错
    

    注意3: Symbol类型在做类型转换的时候不能转成数字

    
    let s1 = Symbol("s1");
    console.log(String(s1));  //Symbol(s1)
    console.log(Boolean(s1));  //true
    console.log(Number(s1)) //报错
    
    

    注意4: Symbol不能做任何运算

    console.log(Symbol("s1") + "nodeing") //报错
    console.log(Symbol("s1") - 100) //报错
    

    注意5: Symbol在作为对象属性或者方法的时候,如果不赋值给一个变量的话,没有办法取值

    let obj = {
        //设置属性
        [Symbol("name")]: 'xiaoqiang'
    };
    //取值
    console.log(obj[Symbol("name")]);
    

    注意6: Symbol没有办法被for in循环遍历

    let name = Symbol('name')
    let age = Symbol('age')
    let obj = {
        a: 1,
        b: 2,
        [name]: 'xiaoqiang',
        [age]: 18
    };
    for(let attr in obj){
        console.log(attr,obj[attr])  //a b
    }
    
    

    可以使用Object.getOwnPropertySymbols查看对象上所有的symbol属性

    console.log(Object.getOwnPropertySymbols(obj))
    

    视频教程地址:http://edu.nodeing.com/course/50

  • 相关阅读:
    Java+7入门经典 -1 简介
    优化算法动画演示Alec Radford's animations for optimization algorithms
    如何写科技论文How to write a technical paper
    开始学习深度学习和循环神经网络Some starting points for deep learning and RNNs
    用500行Julia代码开始深度学习之旅 Beginning deep learning with 500 lines of Julia
    用10张图来看机器学习Machine learning in 10 pictures
    ICLR 2013 International Conference on Learning Representations深度学习论文papers
    ICLR 2014 International Conference on Learning Representations深度学习论文papers
    卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现
    卷积神经网络Convolutional Neural Networks
  • 原文地址:https://www.cnblogs.com/dadifeihong/p/10358121.html
Copyright © 2011-2022 走看看