【JavaScript】Symbol 静态属性(二)
2021-04-01 18:26
标签:基本数据类型 vsc efi nod 接受 ida 函数 error mozilla 以下内容为学习记录,可以参考 MDN 原文。 symbol 是一种基本数据类型 (primitive data type)。Symbol()函数会返回 symbol 类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的 symbol 注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"。 每个从 Symbol() 返回的 symbol 值都是唯一的。一个 symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。 Symbol() 创建一个新的 Symbol 对象。作为构造函数,它不完整,因为它不支持语法 “new Symbol()”。 Symbol.replace 这个属性指定了当一个字符串替换所匹配字符串时所调用的方法。String.prototype.replace() 方法会调用此方法。 Symbol.search 指定了一个搜索方法,这个方法接受用户输入的正则表达式,返回该正则表达式在字符串中匹配到的下标,这个方法由以下的方法来调用 String.prototype.search()。 Symbol.split 指向一个正则表达式的索引处分割字符串的方法。这个方法通过 String.prototype.split() 调用。 Symbol.species 是个函数值属性,其被构造函数用以创建派生对象。 Symbol.toPrimitive 是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。 Symbol.toStringTag 是一个内置 symbol,它通常作为对象的属性键使用,对应的属性值应该为字符串类型,这个字符串用来表示该对象的自定义类型标签,通常只有内置的 Object.prototype.toString() 方法会去读取这个标签并把它包含在自己的返回值里。 Symbol.unscopables 指用于指定对象值,其对象自身和继承的从关联对象的 with 环境绑定中排除的属性名称。 【JavaScript】Symbol 静态属性(二) 标签:基本数据类型 vsc efi nod 接受 ida 函数 error mozilla 原文地址:https://www.cnblogs.com/jiangbo44/p/13551562.html
环境
概念
const symbol1 = Symbol();
const symbol2 = Symbol(42);
const symbol3 = Symbol(‘foo‘);
console.log(typeof symbol1);
// expected output: "symbol"
console.log(symbol2 === 42);
// expected output: false
console.log(symbol3.toString());
// expected output: "Symbol(foo)"
console.log(Symbol(‘foo‘) === Symbol(‘foo‘));
// expected output: false
构造函数
let sym = new Symbol() // TypeError
静态属性
replace
class Replace1 {
constructor(value) {
this.value = value;
}
[Symbol.replace](string) {
return `s/${string}/${this.value}/g`;
}
}
console.log(‘foo‘.replace(new Replace1(‘bar‘)));
// expected output: "s/foo/bar/g"
search
class Search1 {
constructor(value) {
this.value = value;
}
[Symbol.search](string) {
return string.indexOf(this.value);
}
}
console.log(‘foobar‘.search(new Search1(‘bar‘)));
// expected output: 3
split
class Split1 {
constructor(value) {
this.value = value;
}
[Symbol.split](string) {
const index = string.indexOf(this.value);
return `${this.value}${string.substr(0, index)}/${string.substr(index + this.value.length)}`;
}
}
console.log(‘foobar‘.split(new Split1(‘foo‘)));
// expected output: "foo/bar"
species
class Array1 extends Array {
static get [Symbol.species]() { return Array; }
}
const a = new Array1(1, 2, 3);
const mapped = a.map(x => x * x);
console.log(mapped instanceof Array1);
// expected output: false
console.log(mapped instanceof Array);
// expected output: true
toPrimitive
const object1 = {
[Symbol.toPrimitive](hint) {
if (hint === ‘number‘) {
return 42;
}
return null;
}
};
console.log(+object1);
// expected output: 42
toStringTag
class ValidatorClass {
get [Symbol.toStringTag]() {
return ‘Validator‘;
}
}
console.log(Object.prototype.toString.call(new ValidatorClass()));
// expected output: "[object Validator]"
unscopables
const object1 = {
property1: 42
};
object1[Symbol.unscopables] = {
property1: true
};
with (object1) {
console.log(property1);
// expected output: Error: property1 is not defined
}
文章标题:【JavaScript】Symbol 静态属性(二)
文章链接:http://soscw.com/index.php/essay/71038.html