14.Symbol的内置属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
// Symbol内置值
/**
* 除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部的使用方法
* 以下是MDN文档:
* 除了自己创建的symbol,JavaScript还内建了一些在ECMAScript 5 之前没有暴露给开发者的symbol,它们代表了内部语言行为。它们可以使用以* 下属性访问:
* 1.Symbol.iterator
* 一个返回一个对象默认迭代器的方法。被 for...of 使用。
* 2.Symbol.asyncIterator
* 一个返回对象默认的异步迭代器的方法。被 for await of 使用。
* 正则表达式 symbols
* 3.Symbol.match
* 一个用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用。被 String.prototype.match() 使用。
* 4.Symbol.replace
* 一个替换匹配字符串的子串的方法. 被 String.prototype.replace() 使用。
* 5.Symbol.search
* 一个返回一个字符串中与正则表达式相匹配的索引的方法。被String.prototype.search() 使用。
* 6.Symbol.split
* 一个在匹配正则表达式的索引处拆分一个字符串的方法.。被 String.prototype.split() 使用。
* 其他 symbols
* 7.Symbol.hasInstance
* 一个确定一个构造器对象识别的对象是否为它的实例的方法。被 instanceof 使用。[相当于这个意思: Symbol.hasInstance:当其他对象使用* instanceof运算符,判断是否为该对象的实例时,会调用这个方法]
* 8.Symbol.isConcatSpreadable
* 一个布尔值,表明一个对象是否应该flattened为它的数组元素。被 Array.prototype.concat() 使用。
* 9.Symbol.unscopables
* 拥有和继承属性名的一个对象的值被排除在与环境绑定的相关对象外。
* 10.Symbol.species
* 一个用于创建派生对象的构造器函数。
* 11.Symbol.toPrimitive
* 一个将对象转化为基本数据类型的方法。
* 12.Symbol.toStringTag
* 用于对象的默认描述的字符串值。被 Object.prototype.toString() 使用。
*
* 方法:
* Symbol.for(key)
* 使用给定的key搜索现有的symbol,如果找到则返回该symbol。否则将使用给定的key在全局symbol注册表中创建一个新的symbol。
* Symbol.keyFor(sym)
* 从全局symbol注册表中,为给定的symbol检索一个共享的?symbol key。
*
* Symbol 原型
* 所有 Symbols 继承自 Symbol.prototype (en-US).
*
* 实例属性
* Symbol.prototype.description
* 一个只读的字符串,意为对该 Symbol 对象的描述
*
* 实例方法
* Symbol.prototype.toSource
* 返回该 Symbol 对象的源代码。该方法重写了 Object.prototype.toSource 方法
* Symbol.prototype.toString
* 返回一个包含着该 Symbol 对象描述的字符串。该方法重写了 Object.prototype.toString 方法
* Symbol.prototype.valueOf
* 返回该 Symbol 对象。该方法重写了 Symbol.prototype.valueOf 方法
* Symbol.prototype[@@toPrimitive]
* 返回该 Symbol 对象。
*
*
*
*
*/
// class Person {
// static [Symbol.hasInstance](param) {
// console.log(param);
// console.log("我被用来做类型检测了");
// return false;
// }
// }
// let obj = {};
// console.log(obj instanceof Person); [Symbol.hasInstance](param)整体相当于---instanceof,当调用instanceof方法时会自动调用[Symbol.hasInstance](param)这个方法,可以传入参数,其他方法也是类似的道理
// let arr = [1, 2, 3];
// let arr2 = [4, 5, 6];
// arr2[Symbol.isConcatSpreadable] = false;
// console.log(arr.concat(arr2));
</script>
</body>
</html>