IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> ES6新特性之Symbol的数据类型 -> 正文阅读

[JavaScript知识库]ES6新特性之Symbol的数据类型

symbol的特点

  • Symbol的值是唯一的,用来解决命名冲突的问题
  • Symbol值不能与其他数据进行计算
  • Symbol定义的对象属性不能使用for…in遍历循环,可以使用Reflect.ownKeys来获取对象的所有键名

基本使用

创建symbol:

  	let s = Symbol() 
    console.log(s,typeof s);
    // Symbol() 'symbol'

    let s2 = Symbol("小刘同学")
    let s3 = Symbol("小刘同学")
    console.log(s2==s3);
    // false

    // /Symbol.for 创建
    let s4 = Symbol.for("小刘同学")
    let s5 = Symbol.for("小刘同学")
    console.log(s4==s5);
    // true

不能与其他数据进行运算

 	let result = s+100
    let result = s > 100
    let result = s + s
    // 报错: Cannot convert a Symbol value to a numberat

七种数据类型 USONB

u  undefined
s  string  Symbol
o  object
n  null  number 
b  Boolean

Symbol创建对象属性:

 let block = {
        name:"俄罗斯方块",
        up:function(){console.log("改变形状");},
        down:function(){console.log("向下移动");}
    }
    // 我们要往game对象里面添加方法,但是怕game对象中已经存在同名的方法,所以我们这是就可以使用Symbol

    let methdos = {
        up:Symbol(),
        dawn:Symbol()
    }
    block[methdos.up]=function(){
        console.log("我可以改变形状");
    }
    block[methdos.dawn]=function(){
        console.log("我可以快速下降");
    }
    console.log(block);
    // {name: '俄罗斯方块', up: ?, down: ?, Symbol(): ?, Symbol(): ?}

    // 方法二:
    let game = {
        name:"狼人杀",
        [Symbol("say")]:function(){
            console.log("可以开始发言");
        },
        [Symbol("zibao")]:function(){
            console.log("自爆");
        }
    }
    console.log(game);
    // object

调用方法:

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

Symbol内置值:

除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行;

内置Symbol的值调用时机
Symbol.hasInstance当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法
Symbol.isConcatSpreadable对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。
Symbol.species创建衍生对象时,会使用该属性
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 方法,返回该对象的默认遍历器
Symbol.toPrimitive该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。
Symbol. toStringTag在该对象上面调用 toString 方法时,返回该方法的返回值
Symbol. unscopables该对象指定了使用 with 关键字时,哪些属性会被 with环境排除

特别的Symbol内置值的使用,都是作为某个对象类型的属性去使用;

演示:

	class Person{
		static [Symbol.hasInstance](param){
			console.log(param);
			console.log("我被用来检测类型了");
			return false;
		}
	}
	
	let o = {};
	console.log(o instanceof Person);
	const arr = [1,2,3];
	const arr2 = [4,5,6];
	// 合并数组:false数组不可展开,true可展开
	arr2[Symbol.isConcatSpreadable] = false;
	console.log(arr.concat(arr2));
	// 运行结果数组没有展开
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 10:40:34  更:2022-07-03 10:41:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:56:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码