10.symbol

Symbol基本使用

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefinednull、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

Symbol特点

  1. Symbol的值是唯一的,用来解决命名冲突的问题
  2. Symbol值不能与其他数据进行运算
  3. Symbol定义的对象属性不能使用for...in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名
//创建Symbol
let s= Symbol();
console.log(s,typeof s);//Symbol() "symbol"
let s2 = Symbol('Study');
let s3 = Symbol('Study');
console.log(s2 === s3);//false;

//Symbol.for 创建
let s4 = Symbol.for('Study');
let s5 = Symbol.for('Study');
console.log(s4,typeof s4);//Symbol('Study') "symbol"
console.log(s4 === s5);//true;

//不能与其他数据进行运算
//let result = s + 100;
//let result = s > 100;
//let result = s + s;

七种数据类型

USONB //记忆点you are so niubility

u undefined
s string symbol
o object
n null number
b boolean

Symbol创建对象属性

//面向对象中添加方法 up down
let game = {
    
}

//声明一个对象
let methods = {
    up:Symbol(),dowm:Symbol()
};

game[methods.up] = function(){
    console.log("我可以上升");
}
game[methods.down] = function(){
    console.log("我可以下降");
}
console.log(game);//出现up,down对象



let youxi = {
    name:'狼人杀',[Symbol('say')]:function(){
        console.log('我可以发言')
    },[Symbol('zibao')]:function(){
        console.log('我可以自爆')
    }
    
}

Symbol内置值

Symbol.hasInstance

// Symbol.hasInstance
class MyClass {
    [Symbol.hasInstance] (foo) {
        return foo instanceof Array;
    }
}
[1,2,3] instanceof new MyClass() // true

// symbol.hasInstance:会在[1,3]  instanceof 时 自动调用 [Symbol.hasInstance] (foo) 方法...
// 等价于. ([1,3]) => { return [1,3] instanceof Array}

Symbol.isConcatSpreadable

class A1 extends Array {
    construcor(args) {
        super(args);
        this[Symbol.isConcatSpreadable] = true;
    }
}
class A2 extends Array {
    constructor(args) {
        super(args);
        this[Symbol.isConcatSpreadable] = false;
    }
}
let a1 = new A1();
a1[0] = 3;
a1[1] = 4;
let a2 = new A2();
a2[0] = 5;
a2[1] = 6;
[1,2].concat(a1).concat(a2)
// [1,3,4,[5,6]]
// Symbol.isConcatSpreadable:表示对象使用Array.prototype.concat()时,是否可以展开

Symbol.species

// Symbol.species
// 使用格式
class MyArray extends Array {
    // 覆盖父类 Array 的构造函数
    static get [Symbol.species] () { return Array; }
}

// 实例.
class MyArray extends Array {
    static get [Symbol.species] () { return Array; }
}
var a = new MyArray(1,3);
var mapped = a.map (x => x * x);

mapped instanceof MyArray // false
mapped instanceof Array // true

// 注:在static get[Symbol.species] () 中 将构造函数改为了 返回Array类,故使用instance MyArray 返回 false.

Symbol.match

// Symbol.match
class MyMatcher {
    [Symbol.match] (string) {
        return 'hello world'.indexOf(string);
    }
}
'e'.match(new MyMatcher))  // 1
// 注:等同于 [Symbol.match] ('e') { return 'hello world'.indexOf('e')}

Symbol.replace

// Symbol.replace
const x= {};
x[Symbol.replace] = (...s) => console.log(s);
'Hello'.replace(x,'World') 
// 注:在执行'Hello'.replace操作时,实际上执行:(['Hello','World']) => console.log ('["Hello","World"]');
// Symbol.replace会在执行String.prototype.replace方法时调用函数.

在这里插入图片描述


Symbol.search

// Symbol.search
class MySearch {
    constructor (value) {
        this.value = value;
    }
    [Symbol.search] (string) {
        return string.indexOf(this.value);
    }
}
'foobar'.search(new MySearch('foo')) // 0
// 注: [Symbol.search] (string),在执行String.prototype.search方法时调用.
// 本例相当于执行: ('foobar') { return 'foobar'.indexOf('foo')}
}

Symbol.split

// Symbol.split
class MySplitter {
    constructor (value) {
        this.value = value;
    }
    [Symbol.split] (string) {
        var index = string.indexOf(this.value);
        if (index = -1){
            return string;
        }
        return [
            string.substr(0,index),string.substr(index + this.value.length)
        ];
    }
}
'foobar'.split(new MySplitter('foo'))   // ['','bar']
'foobar'.split(new MySplitter('bar'))   // ['foo','']
'foobar'.split(new MySplitter('baz'))   // ['foobar'] 
// 注: [Symbol.split]](string) 在执行String.prototypr.string方法时触发
// 本例改写了split方法,将string分为2部分,一部分(未匹配的)不变,另一部分(匹配到的)置为空,若string中无匹配值,则完整返回...

Symbol.iterator

// Symbol.iterator
class Collection {
    *[Symbol.iterator] () {
        let i = 0;
        while (this[i] !== undefined) {
            yield this[i];
            ++i;
        }
    }
}
let myCollection = new Collection();
myCollection[0] = 1;
myCollection[1] = 2;
for (let value of myCollection) {
    console.log (value);
} 
// 1 
// 2
// 注:在执行for ... of 循环时 触发Symbol.iterator方法
// yield 在for循环时会保存当前的元素...

Symbol.toPrimitive

// Symbol.toPrimitive
let obj = {
    [Symbol.toPrimitive] (hint) {
        swtich (hint) {
            case 'number':
                return 123;
            case 'string':
                return 'str';
            case 'default':
                return ‘default';
            default:
                throw new Error ();
        }
    }
}
2 * obj ;  // 246
3 + obj ;   // '3default'
obj == 'default'   // true
String(obj)    // 'str'
// 注:在对象被转为原始类型的值时,会调用这个方法

Symbol.toStringTag

// Symbol.toStringTag
class Collection {
    get [Symbol.toStringTag] () {
        return 'xxx',}
}
var x = new Collection();
Object.prototype.toString.call(x);     // "[object xxx]"
// 注:当执行Object.prototype.toString方法时,触发Symbol.toStringTag

Symbol.unscopables

// Symbol.unscopables
// 无unscopables
class MyClass {
    foo() { return 1;}
}
var foo = function () { return 2;};
with (MyClass.prototype) {
    foo();    // 1
}
// 有unscopables
class MyClass {
    foo() { return 1; }
    get [Symbol.unscopables] () {
        return { foo: true};
    }
}
var foo = function () { return 2;};
with (MyClass.prototype) {
    foo();     // 2
}
// 注:unscopables属性指定了使用with关键字时哪些属性会被with环境排除.
// 在本例中指定了foo属性被排除....

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


原文连接:https://www.cnblogs.com/dupd/p/5951311.htmlES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范。commonjs主要应用于服务器,实现同步加载,如nodejs。AMD规范应用于浏览器,如requirejs,为异步加载。同时还有CMD规范,为同步加载方案如seaJS。ES6在语言规格的层面上,实现了模块功能,而且...
以为Es6,javascript第一次支持了module。ES6的模块化分为导出(export)与导入(import)两个模块,其中在项目中,我们会经常看到一种用法import * as obj from,这种写法是把所有的输出包裹到obj对象里。示例一 1 2 3 4 5 6 7 // index.js export function fn1(data){ console.log(1) } export f.
视频讲解关于异步处理,ES5的回调使我们陷入地狱,ES6的Promise使我们脱离魔障,终于、ES7的async-await带我们走向光明。今天就来学习一下 async-await。async-await和Promise的关系经常会看到有了 async-await、promise 还有必要学习吗、async await优于promise的几个特点,接收了这些信息后,就蒙圈了。现在才知道...
TypeScript什么是TypeScript?TypeScript是由微软开发的一款开源的编程语言TypeScript是JavaScript的超集,遵循最新的ES5 ES6规范,TypeScript扩展了JavaScript的语法TypeScript更像后端 Java c# 这样的面向对象语言可以让js开发大型企业项目谷歌也在大力支持TypeScript的推广,React ,VUE 都集成了TypeScriptTypeScript安装安装-- 安装npm install -g type
export class AppComponent { title = 'Tour of heroes'; hero: Hero = { id: 1, name: '张三' };}export class Hero { id: number; name: string;}就是这一段,看起来有点晕,这里是实例化一个Hero类型的对象hero,还是创建一个变量?后面是赋值,但是不知道什么意思?hero: Hero = { id: 1, na.
用 async/await 来处理异步昨天看了一篇vue的教程,作者用async/ await来发送异步请求,从服务端获取数据,代码很简洁,同时async/await 已经被标准化,是时候学习一下了。先说一下async的用法,它作为一个关键字放到函数前面,用于表示函数是一个异步函数,因为async就是异步的意思, 异步函数也就意味着该函数的执行不会阻塞后面代码的执行。 写一个async 函数async function timeout() {return 'hello world'
es6的语法已经出了很长的时间了,在使用上也可以通过babel这类的编译工具转译为浏览器可以识别的es5的语法,但是依旧有很多开发在写代码的时候,依旧没有用es6的语法,而是习惯使用老的语法,这篇文章主要会介绍解构赋值基本用法以及在实际使用场景中相比es5语法的优势,让大家从根本上了解es6语法的优势基本用法数组解构让我们一起先来看数组解构的基本用法:let [a, b, c] ...
参考链接1 参考链接2写法1 - 使用 function 关键字function greeter(fn: (a: string) => void) { fn("Hello, World");}function printToConsole(s: string) { console.log(s);}greeter(printToConsole);(a: string) => void上述语法的含义:表示一个函数,接收一个字符串作为输入参数,没有返回参数。可
ES6简介-ECMAScript是javascript标准-ES6就是ECMAScript的第6个版本-ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。ES6新增加的功能:1.let
ES6  在ES5的基础上增加了一些新的特性和写法,特别在函数写法上,增加了箭头函数 1.正经的函数写法//普通的传递值的写法functionsum1(x,y){returnx+y;}constres=sum1(2,3);console.log(res);//传递对象的方式,调用时需要传递一个对象过去function
ES5及ES6es表示ECMASCript,他是从es3,es5,es6,es5是2009.12月发布的,es6是2015.6月发布的。vue2完全支持es5的(vue3完全支持es6的),react完全支持es6es5的新特性严格模式(对应的相反的称为怪异模式)'usestrict'//一般用于相关的设计上面书写一个严格模式底下的代码就需要按照严格模
ES5的严格模式所谓严格模式,从字面上就很好理解,即更严格的模式,在这种模式下执行,浏览器会对JS的要求更苛刻,语法格式要求更细致,更符合逻辑。怪异模式:就是我们之前一直使用的开发模式,就叫怪异模式。因为很多时候出来的结果是非常怪异的,所以才称之为怪异模式。'usestrict'//一般用
相同点export与exportdefault均可用于导出常量、函数、文件、模块可在其它文件或模块中通过import+(常量|函数|文件|模块)名的方式,将其导入,以便能够对其进行使用不同点一、在一个文件或模块中,export、import可以有多个,exportdefault仅有一个//model.jsle
24.class类 25.class中的extend 26.super关键字 27.super应用 28.class属性 30.静态成员和实例成员 31.构造函数问题 32.构造函数原型 33.原型链 34.js查找机制 35.原型对象中this指向 36.扩展内置对象方法 37.call方法 38.借用父构造函数
什么是ES6ES的全称是ECMAScript,它是由ECMA国际标准化组织,制定的一项脚本语言的标准化规范。泛指2015年发布的es2015版极其后续版本ES6中新增语法letES6中新增的用于声明变量的关键字。注意:使用let关键字声明的变量才具有块级作用域,使用var声明的变量不具备块级作用域特
命名修饰符let:不能重复声明变量、块级作用域leta=1;leta=2;//报错const:初始化常量,必须给初始值,否则报错、在同一个作用域内,const定义的常量不能修改其值、块级作用域consta=10a=100//报错,不能重复声明解构constobj={name:'jack'age:18sex:'
ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。1{2leta=10;3varb=1;4}56a//ReferenceError:aisnotdefined.7b//1上面代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><metahttp-equiv="X-UA-Compatib
一,RegExp构造函数es5中,RegExp构造函数的参数有两种情况。1,参数是字符串,第二个参数表示正则表达式的修饰符(flag)。2,参数是一个正则表达式,返回一个原有正则表达式的拷贝。es6中,如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而
一、字符的Unicode表示法JavaScript允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的Unicode码点。表示法只限于码点在\u0000~\uFFFF之间的字符,超过该范围需要用两个双字节表示ES6改进:将码点放入大括号,就能正确解读该字符。转换参考:https://blog.csdn.net/hezh1994/ar