ES6中的 Symbol

目录

1.概述

2.symbol值的生成

3.作为属性名的Symbol值

4.symbol数据的总结注意


ES5中:5个基本数据类型 :number,boolean,string,null,undefined

               引用数据类型:对象(数组,函数都可称为对象)

ES6中:1个基本数据类型:Symbol(独一无二的)

后面还会学的 Bigint

所以问JS的数据类型有哪几种

回答:number,boolean,string,null,undefined,Symbol,Bigint,对象  共8种

引入:

<script>
    //JS中 
    var b = new Number(200);
    var b = 200; //显示写法   隐式写法是var b = new Number(200);
    b.age = 20;
    console.log(b);  //一个new Number(200);
    console.log(b.age); //另外一个new Number(200);  两个是不同的
</script>

1.概述

Symbol()是一个内置全局函数,生成一个独一无二的的数据。

symbol是一个ES6标准中新增的一种基本数据类型,

Symbol类型数据的原理:保证每一个属性名都是独一无二的,从根本上防止属性名的冲突

2.symbol值的生成

symbol 的值是通过 Symbol() 函数生成

    <script>
        let data = Symbol();
        console.log(data);  //红色字体:Symbol() 表示Symbol数据
        console.log(typeof data); //"symbol"类型
    </script>

注意点:Symbol(),虽然像Array(),Object()等这些函数一样,是官方内置的函数,但是利用其生成symbol数据时却不用加new ,这是因为生成的 Symbol 是一个原始类型的值,并不是对象。

let A = new Object();   //像这种生成对象都要加new

//生成symbol类型数据就不加new
let data = Symbol();

每一个 symbol 的值都是唯一的,Symbol() 函数可以接受一个字符串作为参数,表示对该值的描述,因此即使定义 symbol 使用相同的参数互相之间也不是相同的

    <script>
        let a1 = Symbol("G");
        let a2 = Symbol("G");
        console.log(a1 == a2); //false 不严格情况下都不相等,严格情况下更不相等
                               //这里通俗理解为:两个不同的人,叫相同的名字G,你能说是同一个不?
    </script>

3.作为属性名的Symbol值

 symbol 类型的值可以作为对象的属性标识符使用,这也是 symbol 类型设计的目的。
现在对象属性名可以为两种类型一种就是原本的字符串类型一种即为新增的 symbol 类型。由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。

    <script>
        let mySymbol = Symbol();
        let mySymbol1 = Symbol();
        console.log(mySymbol);  //Symbol类型数据  Symbol()
        let a = {};
        a[mySymbol]= "hello";
        a[mySymbol1] = "girl";
        console.log(a);  //{Symbol(): 'hello', Symbol(): 'girl'}
    </script>

分析:看着a对象的两个属性名Symbol()是一样的,但是因为Symbol类型数据是每一个不一样的 ,所以是两个不同的属性名,只是形式一样而已

注意点:

1.Symbol作为对象属性名时,不能用点运算符。(点运算符后面总是字符串)

        因为点运算符是给对象添加一个属性,而不是像[ 变量名] 一样引用变量的值作为对象的属性。
2.在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中。方括号中的属性名代表了Symbol值。
3.Symbol 值作为属性名时,该属性还是公开属性,不是私有属性。

4.symbol数据的总结注意

1.Symbol()函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。

2.symbol值不能与其他类型的值进行运算

    <script>
        let A = Symbol();
        // console.log("aaaa" + A);//Cannot convert a Symbol value to a string
                                //无法将Symbol值 隐式 转换为字符串
        console.log(1 + A); //Cannot convert a Symbol value to a number
        //console.log(true + A); //布尔值会转为数字,Cannot convert a Symbol value to a                         
                                 //number
    </script> 

3.虽然 symbol值 不能隐式转换为字符串,但是可以手动显示转换为字符串

    <script>
        let A = Symbol();
        console.log(A);   //红色字体:Symbol() symbol类型数据
        console.log(A.toString());//黑色字体Symbol() 字符串类型数据"Symbol()"
    </script> 

那是否可以显示转换为其它数据类型呢?

<script>
    let A = Symbol();
    console.log(Boolean(A)); // true
    console.log(Number(A));; // TypeError: Cannot convert a Symbol value to a number
</script> 

总结:可以显示转换为字符串,和布尔值(不能与布尔值进行运算,比如说加法,布尔值会先转换为数字,但是symbol数据又不能跟数字型进行计算,所以不能。),不能转换为数字型数据。 

4.通过 symbol.description 可以获得定义symbol型数据的描述(Symbol()的参数字符串)

    <script>
        let A = Symbol("girl");
        console.log(A.description); //"girl" 
    </script>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值