要点:
Symbol:
基本特点:
- 独一无二的值,通过Symbol函数生成
- 对象的属性名现在可以有string和symbol两种类型,
- 属性名属于 Symbol 类型,就是独一无二的,可以保证不会与其他属性名产生冲突
- Symbol()函数前面不能用
new
,因为symbol是原始类型而不是对象,也不能添加属性 - 可以接受一个字符串或者对象做参数,对象为参数时候,会调用该对象的
toString
方法,将其转为字符串,然后才生成一个 Symbol 值。 - 参数是对Symbol值的描述,相同参数symbol函数的返回值不相等
- Symbol值不能与其他的数据类型运算,但是可以转换为字符串和布尔值
Symbol.prototype.description:
- 创建Symbol的时候可以添加一个描述,读取之前要先转换为字符串
var s=Symbol('foo')//s的描述就是字符串foo
String(s)
s.toString()//"Symbol(foo)"
s.description// "foo" ES2019写法更方便
作为属性名的symbol:
Symbol 值作为对象属性名时,不能用点运算符。
let mySymbol = Symbol();
// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';//正确写法
//以下三行为错误写法
const mySymbol = Symbol();
const a = {};
a.mySymbol = 'Hello!';
a['mySymbol']//hello
a[mySymbol]//undefined
// 第二种写法
let a = {
[mySymbol]: 'Hello!'
};
// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上写法都得到同样结果
a[mySymbol] // "Hello!"
let s = Symbol();
let obj = {
[s]: function (arg) { ... }
};
obj[s](123);
//简略写法(增强的对象写法)
let obj = {
[s](arg) { ... }
};
//
属性名的遍历:
Object.getOwnPropertySymbols()
可以获取到指定对象的所有Symbol属性名,是当前对象的所有用作属性名的 Symbol 值组成的数组,不支持for...in
、for...of、``Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify(),Reflect.ownKeys()
可以同时返回普通对象名和Symbol属性名
Symbol.for()和Symblo():
- 两者都可以生成Symbol值
- 前者会注册在全局环境中等待搜索,后者不会
- Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key
显式类型转换:
- Number()函数
- 数字->数字
- 字符串->0(空字符串) ,NaN(不可以转换为数字),数字(可以转换为数字)
- 布尔值->true 1 ,false 0
- undefined->NaN
- null->0
- 对象->先ValueOf(),再toString()方法,最后Number()
- String()函数
- 数值->对应的数字字符串
- 布尔值->true “true”,false “false”
- undefined->”undefined”
- null->”null”
- 对象->先调用toString(),再ValueOf()方法,最后String()
Boolean()函数
四则运算
- 判断语句
- Native调用:console alert等