ES6 Symbol

一、Symbol数据类型

1.创建symbol

        // 1.用Symbol创建
        let symbol = Symbol()
        console.log(symbol, typeof symbol); //Symbol() 'symbol'

        let name1 = Symbol('张三')
        let name2 = Symbol('张三')
        console.log(name1, name2); //Symbol(张三) Symbol(张三)
        console.log(name1 === name2); //false

        // 2.用Symbol.for()创建
        let name3 = Symbol('张三')
        let name4 = Symbol('张三')
        console.log(name3, name4); //Symbol(张三) Symbol(张三)
        console.log(name3 === name4); //true

2.不能与其他数据进行运算;

3.使用场景:给对象添加属性和方法

符号属性,不能被常规方法所遍历,内部私有属性

         let obj = {
            name: '张三',
            [Symbol('say')]: function() {
                console.log('你好');
            },
            [Symbol('run')]: function() {
                console.log('跑');
            }
        }
        console.log(obj);

4.Symbol内置值

Symbol.hasInstance当其他对象使用instanceof 运算符,判断是否为该对象的实例时,会调用这个方法
Symbol.isConcatSpreadable对象的Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。
Symbol.unscopables该对象指定了使用with关键字时,哪些属性会被with环境排除。
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方法,返回该对象的默认遍历器
   // 知名符号
        // 1.

        function A() {}
        const obj = new A()
        console.log(obj instanceof A)
        Object.defineProperty(A, Symbol.hasInstance, {
            value: function(o) {
                console.log(o)
                return 0
            }
        })
        console.log(obj instanceof A)

        // 2.
        const arr = [3]
        const arr2 = [4, 5, 6]
        arr[Symbol.isConcatSpreadable] = false;
        arr2[Symbol.isConcatSpreadable] = false;
        const result = arr.concat(arr2)
        console.log(result)

        const arr = [1]
        const obj = {
            0: 3,
            1: 5,
            length: 2,
            // [Symbol.isConcatSpreadable] : true
        }
        const result = arr.concat(99, obj, "qwe")
        console.log(result)


        // 3
        const obj = {
            a: 1,
            b: 2
        }
        obj[Symbol.toPrimitive] = function() {
            return 123
        }
        console.log(obj + 123)


        // 4.
        class Person {
            [Symbol.toStringTag] = "Person"
        }
        const p = new Person()
        console.log(p)
        const arr = [1, 2, 3]
        console.log(Object.prototype.toString.call(arr))
        console.log(p.toString())

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值