Symbol能干什么!为什么要掌握它?

image

说到Symbol就先来说下 js中的基础数据类型 string、number、boolean、null、undefined,Symbol就是js中的第六种基础数据类型

用一句话来描述Symbol,那就是独一无二!

Symbol的使用


基本使用


consts1 = Symbol('song');

consts2 = Symbol('song');

// Symbol中的标识一般放number、string

console.log(s1 === s2);// Symbol声明的变量不相等

Symbol作为key


consts1 = Symbol('song');

letobj = {

        [s1]:'song',// es6语法[] 可以将symbol的值作为属性

        age:18

}

for(letkeyinobj){// for循环无法遍历symbol属性

        console.log(obj[key])

}

// Reflect.ownKeys方法可以拿到所有的key属性

Reflect.ownKeys(obj).forEach(key=>{

        console.log(obj[key]);

})

Symbol.for


我们上面说symbol是独一无二的,但是有的时候我希望可以复用声明过的symbol,可以使用for语法,如果symbol不存在则声明,如果存在则将创建过的symbol返回回来!


consts1 = Symbol.for('song');

consts2 = Symbol.for('song');

console.log(s1 === s2);

console.log(Symbol.keyFor(s2));// 可以通过keyFor 获取symbok的key

Symbol元编程


元编程:可以去对原生js的操作进行修改,说白了就是可以更改原生js的行为

ES6提供了11个内置的Symbol值

1.Symbol.hasInstance

重写instanceof默认行为


constinstance = {

        [Symbol.hasInstance](value){

                return'a'invalue

        }

}

// 当调用 instanceof 方法,会默认调用instance上的hasInstance方法

console.log({a:1}instanceofinstance)

2.Symbol.isConcatSpreadable

重写数组的展开行为


constarr = [1,2,3];

arr[Symbol.isConcatSpreadable] =false;

console.log(arr.concat([1,2,3]));

3.Symbol.match / split / search / replace

重写字符串的match,split,search方法


constobj = {

        [Symbol.match](value){

                returnvalue.length ===3

        }

}

console.log('abc'.match(obj));

4.Symbol.species

创建衍生对象时,指定构造函数


classMyArray extendsArray{

        constructor(...args){

                super(...args);

        }

        static get [Symbol.species](){

                returnArray;// 创建衍生对象会用Array作为构造函数

        }

}

constarr =newMyArray(1,2,3);

constnewArr = arr.map(item=>item*2);

console.log(newArrinstanceofMyArray);// 默认衍生对象也是MyArray的实例

5.Symbol.toPrimitive

重写数据类型转化


constobj = {

        [Symbol.toPrimitive](type){// type number string default

                return123;

        }

}

console.log(obj*123);

6.Symbol.toStringTag

重写toString方法


constobj = {

        [Symbol.toStringTag]:"xxx"

};

console.log(Object.prototype.toString.call(obj));// [object xxx]

7.Symbol.unscopables

重写哪些属性被with所排除


console.log(Array.prototype[Symbol.unscopables]);// 哪些方法不能再with中使用

with(Array.prototype){// 直接调用数组原型上的方法

        forEach.call([1,2,3],element => {

                console.log(element)

        });

}

classMyClass {

        eat() {}

        get [Symbol.unscopables]() {

                return{ eat:true};// 不能在with下使用

        }

}

with(MyClass.prototype) {

        console.log(eat);

}

还差最后一个Symbol.iterator,留个小尾巴,大家自己踩一踩看看这个有什么用!!这个面试经常会被问哦~

到此我们将Symbol的用法整个过了一遍,当然一般元编程在开发的时候还是很少用到呢!不过我们已经具备改写js语言本身的能力啦

欢迎持续关注公众号:「前端优选」

加我微信:webyouxuan

技术持续更新,请持续关注

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,000评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,745评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,561评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,782评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,798评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,394评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,952评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,852评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,409评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,483评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,615评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,303评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,979评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,470评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,571评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,041评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,630评论 2 359

推荐阅读更多精彩内容

  • 概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添...
    米诺zuo阅读 335评论 0 0
  • 本人是android开发的,由于最近React Native的火热,再加上自己完全不懂JS的语法,俗话说的好"落后...
    Bui_vlee阅读 285评论 0 0
  • Symbol基本类型 Symbol 是一种解决命名冲突的工具。试想我们以前定义一个对象方法的时候总是要检查是否已存...
    faremax阅读 865评论 0 0
  • 原创文章&经验总结&从校招到A厂一路阳光一路沧桑 详情请戳www.codercc.com 主要知识点:创建符号值、...
    你听___阅读 911评论 0 1
  • 冉冉孤生竹 [两汉]佚名 冉冉孤生竹, 结根泰山阿。 与君为新婚, 菟丝附女萝。 菟丝生有时, 夫妇会有宜。 千里...
    修源正本阅读 350评论 2 3