• 浅谈ES6新增数据类型:Symbol


    面试中喜闻乐见的问题就是问我们的ES6新增了哪些个新特性 这篇文章一起学习一下新增的数据类型:Symbol

    JS的原始数据类型:6种
    Boolean,String,Undefined,NULL,Number,Symbol(ES6新增)

    原始的数据类型种不包含object这点需要注意。
    Symbol是用来干什么的:用来区分我们的属性名的,用来定义对象的唯一属性名。

    console.log(typeof Symbol("Alice")) // 输出:symbol

    我们通过Symbol函数来生成symbol;

    var symbol1=Symbol();

    var symbol2=Symbol("Zhangxin");

    Symbol类型的值是一个独一无二的值,Symbol函数的参数只是表示对当前Symbol值的描述,因此相同参数的Symbol函数的返回值是不相等的。

    1. console.log(Symbol() === Symbol()); // 输出:false
     console.log(Symbol("Zhangxin") === Symbol("Zhangxin")); // 输出:false
    Symbol不是一个构造函数 所以不能使用newSymbol方法来创建
    var symbol=new Symbol();
    这就会报错:
     

    Symbol定义的属性 也不能直接去和String类型的属性进行连接操作:

    console(Symbol('aa')+"bb");

    另外的 下面是Symbol类型和其他类型的转换结果;

    var symbol=Symbol("zhangxin");

    console.log(symbol.toString());

    console.log(Boolean(symbol));

    if(symbol)

    {

    console.log("Y");

    }

    else{

    console.log("N");

    }

    console.log(Number(symbol));

    作为对象属性名的Symbol:

    由于每一个Symbol值都是不相等的,这意味着Symbol值可以用于对象的属性名,保证不会出现同名的属性,这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。

    对象的属性名可以有两种类型,一种是原来的字符串,另一种是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

    通过方括号结构和Object.defineProperty,将对象的属性名指定为一个Symbol值。

    方法一:

    var name=Symbol():

    var obj={[name]:"Zhangxin"};

    方法二:

    var name=Symbol();

    var obj={};

    obj[name]="Zhangxin"

    方法三:

    var obj = {};

    Object.defineProperty(obj, name, { value: 'Zhangxin' });
    参考文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

    在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号之中,如果不放在方括号中,该属性名就是字符串,而不是代表的Symbol值。

    var name = Symbol();

    var obj1 = {

    [name]: "Zhangxin"

    };

     

    console.log(obj1.name); // 输出:undefined

    console.log(obj1[name]); // 输出:Zhangxin

     

    Symbol值作为对象属性名时,不能用点运算符。由于点运算符后面总是字符串,所以不会读取name作为标识名所指代的那个值,导致属性名实际上是一个字符串,而不是一个Symbol值。

    var obj = {};

    var name = Symbol();

    obj.name = 'Zhangxin';

    console.log(obj.name);

    console.log(obj[name]);

    console.log(obj['name']);

    3、作为对象函数名的Symbol

    var func = Symbol();

    var obj = {

    func: function() {

    console.log("YES");

    }

    };

    obj.func(); // 输出:YES

     

    4、获取对象属性的两种方法

    1) Object.getOwnPropertySymbols()方法

    返回只包含Symbol类型的属性名的数组

    2) Object.getOwnPropertyNames()方法

    返回只包含字符串类型的属性名的数组

    var obj = {};

    var age = Symbol("age");

    var job = Symbol("job");

    obj[age] = "Zhangxin";

    obj[job] = "student";

    obj.age = 23;

    var symbols = Object.getOwnPropertySymbols(obj);

    var names = Object.getOwnPropertyNames(obj);

    console.log(symbols.length); // 输出:2

    console.log(symbols); // 输出:[Symbol(age), Symbol(job)]

    console.log(obj[symbols[0]]); // 输出:Zhangxin

    console.log(names.length); // 输出:1

    console.log(obj[names[0]]); // 输出:23

    5、Symbol.for()和Symbol.keyFor()方法

    1) Symbol.for()方法

    类似于单例模式,首先在全局中搜索有没有以该参数为名称的Symbol值,如果有则返回该Symbol值,否则新建并返回一个以该参数为名称的Symbol值。

    var symbol1 = Symbol.for('Zhangxin');

    var symbol2 = Symbol.for('Zhangxin');

    console.log(symbol1 === symbol2) // 输出:true

    2) Symbol.keyFor()方法

    返回一个已创建的Symbol类型值的key,实质是检测该Symbol是否已创建。

    var symbol1 = Symbol.for("Zhangxin");

    console.log(Symbol.keyFor(symbol1)); // 输出:"Zhangxin"

    var symbol2 = Symbol("Zhangxin");

    console.log(Symbol.keyFor(symbol2)); // 输出:undefined

     

     
  • 相关阅读:
    支付方法及注意事项
    网站负载均衡策略
    工作成长
    java内存机制
    关于前途的一些思考
    git记录
    关于博客
    如何为公司创造价值?
    遍历集合方法总结
    二叉树和红黑二叉树
  • 原文地址:https://www.cnblogs.com/zhangxin123/p/9376589.html
Copyright © 2020-2023  润新知