我正在参与掘金创作者训练营第6期, 点击了解活动详情
- 本次我选择的方向是: 新特性、新方法介绍:在写文章的同时还能让你学习新东西(适合新手)
新的数据类型Symbol
在我以前的JavaScript学习中,了解到了两大类数据类型
1.基本数据类型(值类型)
类型 | 中文 | 值 |
---|---|---|
Number | 数值 | 数字 |
String | 字符串 | 文本 |
Boolean | 布尔(逻辑) | true /false |
Null | 空 | / |
Undefined | 未定义 | / |
2.复杂数据类型(引用数据类型)
类型 | 中文 |
---|---|
Object | 对象 |
Array | 数组 |
Function | 函数 |
由此在还没有了Symbol的具体信息前,我提出以下四个问题,也是我接下来学习了解的Symbol的先后步骤
1.Symbol是属于普通数据类型还是复杂数据类型?如果它是普通数据类型,它的值是什么?
2.JavaScript作为一门不太严谨的脚本语言,它的一些新特性有些来自其他语言,Symbol是吗?
3.Symbol作为新的数据类型它的声明方式是什么样的?
4.Symbol产生的原因是什么?它能解决什么问题?它的应用场景是什么?
1.Symbol是属于普通数据类型还是复杂数据类型?如果它是普通数据类型,它的值是什么?
通过查询MDN我知道了Symbol是属于基本数据类型,Symbol()
函数会返回 symbol 类型的值.
但是官方生硬的语言让我摸不着头脑,我决定调出VS code实践一番:
- 测试代码如下 我分别给a和b赋了Symbol()和Symbol(666)的值,在控制台打印
<script>
const a=Symbol()
const b=Symbol('666')
console.log(a);
console.log(b);
</script>
- 控制台输出如下:
- 可以看出输出颜色是红色,不是字符串的黑色,也不是数值和布尔型的蓝色,由此看来真的是一种新的数据类型
- 也没有对象和数组,函数类型的向右展开的箭头说明不是复杂数据类型,而是基本数据类型
- 控制输出可以看出symbol的值是就是赋给变量的值,如果Symbol()小括号中没有内容则为Symbol(),如果Symbol()小括号中有内容则为Symbol(内容)
2.Symbol来自其他语言吗?
我查询到Symbol用来表示一个独一无二的值,
Symbol是JavaScript独创的,在其他语言中没有这个数据类型
3.Symbol作为新的数据类型它的声明方式是什么样的?
- let 变量名=Symbol(参数),注意参数为字符串
- Symbol没有new 构造函数的创造方法 会报错
- 这一点很奇怪,我要试一下,代码如下:
let a=new Symbol()
console.log(a)
- 确实会出错
- MDN解释说:作为构造函数来说它并不完整,因为它不支持语法:"
new Symbol()
"。 - 所以我们只能使用let 变量名=Symbol(参数)的方法来声明Symbol类型
4.Symbol产生的原因是什么?它能解决什么问题?它的应用场景是什么?
- 🏆Symbol产生的原因是:
- 在对象中我们的属性名是字符串类型,这样会导致当属性名重复时,会导致原有的属性名的属性值被覆盖.
- 为了解决这个问题,JavaScript因此创造了Symbol类型
- Symbol这个单词中文意思是标志,符号的意思
- 🏆Symbol作用是用来表示一个独一无二的值,这也和含义中的标志符号相符合,表示独一无二的标识符
- MDN解释:每个从
Symbol()
返回的 symbol 值都是唯一的。一个 symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。 - 🏆Symbol能解决什么问题?
- Symbol是为了解决,字符串类型导致的属性名相同时,数据出错的问题
- 而Symbol是唯一的标识符,即使Symbol()中的参数相同,两个Symbol也不相同
- 为了更好的理解,我敲了代码如下:
const a=Symbol('x666')
const b=Symbol('x666')
const c='x666'
const d='x666'
console.log(a);
console.log(b);
console.log(c);
console.log(d);
console.log(c===d);
console.log(a==b);
console.log(a===b);
控制台输出如下:
我们看到:
- 字符串类型的c,d,字符串内容相同,因此c===d值为true
- Symbol类型的a,b,即使参数相同,无论是a==b还是,a===b都为false,说明a,b值不相同
- 符合Symbol是唯一的标识符,即使Symbol()中的参数相同,两个Symbol也不相同的理解
🏆那么Symbol的应用场景是什么呢?
1.首先是上面多次提到的Symbol作为对象的属性名,来避免属性名重复导致的属性值覆盖问题 实现方法如下:
let sml = Symbol('姓名')
let obj = {
[sml]: '李白',
}
console.log(obj);
// 错误修改方法
obj[Symbol('姓名')]='张三'
console.log(obj);
// 正确修改方法
obj[sml]='张三'
console.log(obj);
控制台输出如下:
由此看出:
- 1.Symbol是唯一的标识符,即使Symbol()中的参数相同,两个Symbol也不相同
- 即使第一次修改的时候Symbol的参数也为'姓名',但是仍然在对象中增加了新的键值对,而没有达到修改属性值的目的
- 2.正确的修改属性值得方法为,对原来作为属性名的变量sml,使用obj[sml]='张三'来修改属性值
2.其他应用场景:
- 以我作为初学者的理解,以下的应用场景我难以理解,先写下来,以待后期功力提升再来补足😭
- 消除魔法字符
- 使用Symbol来替代常量
- 模拟类的私有方法
部分查询资料网站如下: