当前位置:   article > 正文

ES6新特性-Symbol类型_es6 新特性symbol

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
  • 1
  • 2
  • 3
  • 4
  • 5

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): ƒ}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

情况二:对象中存在同名方法(需要先定义一个对象来存放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): ƒ ()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

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

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

game[methods.down]();
  • 1

三. 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.Symbol.replace

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

const x = {
    [Symbol.replace] (...s) {
        return console.log(s);
    }
}
'Hello'.replace(x, 'World') // ["Hello", "World"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/909226
推荐阅读
相关标签
  

闽ICP备14008679号