ES6新特性-Symbol类型

一.基础概念

Symbol表示独一无二的值,是原始数据类型,不是对象。可以接受一个字符串作为参数,同时symbol创建的值也不能进行相应的加减运算。

二.用法

1.Symbol的创建

let sy = Symbol(“kk”);
console.log(sy); // Symbol(KK) 
typeof(sy); // "symbol" 
// 注意的是当两个参数相同时,他们返回的结果时不一致的,因为symbol类型时独一无二的。
let sy1 = Symbol("kk"); sy === sy1; // false

2.Symbol向对象中添加方法
先创建一个对象,接着在对象中定义一个[Symbol(“say”)]方法,这样可以防止方法重名。注意的是定义Symbol类型方法需要使用[]。
情况一:对象中不存在同名方法

let game = {
	name: '狼人杀',
	[Symbol('say')]: function() {
		console.log('发言');
	},
	[Symbol('zibao')]: function() {
		console.log('自爆');
	}
}
console.log(game); // {name: "狼人杀", Symbol(say): ƒ, Symbol(zibao): ƒ}

情况二:对象中存在同名方法(需要先定义一个对象来存放Symbol对象)

// 向game对象中添加方法up, down
let game = { 
	name: '俄罗斯方块',
	up: function(){ console.log('上升')},
	down: function(){ console.log('下降') }
};

// 声明一个对象
let methods = {
	up: Symbol('up'),
	down: Symbol('down')
};
// 添加方法
game[methods.up] = function() {
	console.log('methods.up改变形状');
}
game[methods.down] = function() {
	console.log('methods.down快速下降');
}

console.log(game);
// down: ƒ ()
// name: "俄罗斯方块"
// up: ƒ ()
// Symbol(down): ƒ ()
// Symbol(up): ƒ ()

3.调用Symbol向对象中的方法
调用方法:
情况一:(利用getOwnPropertySymbols获取symbol对象,接着按数组格式输出)

const langrensha = Object.getOwnPropertySymbols(game);
console.log(langrensha);
ganme[langrensha[0]]();

情况二:(调用之前存放symbol类型的对象中方法)
gamemethods.down;

game[methods.down]();

三. Symbol常用的内置值

1.Symbol.match

对象的Symbol.match属性,指向一个函数。当执行str.match(myObject)时,如果该属性存在,会调用它,返回该方法的返回值。

class MyMatcher {
    [Symbol.match] (str){
        return "Hello World!".indexOf(str);
    }
}
console.log('e'.match(new MyMatcher())); //1

2.Symbol.replace

对象的Symbol.replace属性,指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值。

const x = {
    [Symbol.replace] (...s) {
        return console.log(s);
    }
}
'Hello'.replace(x, 'World') // ["Hello", "World"]

3.Symbol.search

对象的Symbol.search属性,指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值。

class MySearch {
    constructor(value) {
        this.value = value;
    }
    [Symbol.search](str){
        return str.includes(this.value);
    }
}
console.log("foobar".search(new MySearch("foo"))); //true

4.Symbol.split

对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时返回该方法的返回值。

class MySplit {
    constructor(value){
        this.value = value;
    }
    [Symbol.split](str) {
        let index = str.indexOf(this.value);
        if(index === -1){
            return str;
        }
        return [
            str.substr(0,index),
            str.substr(index + this.value.length),
        ]
    }
}
console.log("foobar".split(new MySplit("foo"))); //["","bar"]
console.log("foobar".split(new MySplit("bar"))); //["foo",""]
console.log("foobar".split(new MySplit("baz"))); //foobar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值