JavaScript中的符号、集合与映射深度解析
立即解锁
发布时间: 2025-08-22 01:06:05 阅读量: 1 订阅数: 3 


深入理解ECMAScript 6的核心特性与应用
### JavaScript中的符号、集合与映射深度解析
#### 1. 符号相关特性
在JavaScript里,符号(Symbols)是一种全新的原始值类型,它能够创建不可枚举的属性,这些属性若不引用符号就无法被访问。虽然并非真正意义上的私有属性,但它们不易被意外修改或覆盖,所以适用于需要一定保护的功能。
##### 1.1 Symbol.toPrimitive方法
可以通过重写`Symbol.toPrimitive`方法,依据不同的提示(hint)返回不同的值。以下是一个`Temperature`构造函数的示例:
```javascript
Temperature.prototype[Symbol.toPrimitive] = function(hint) {
switch (hint) {
case "string":
return this.degrees + "\u00b0"; // degrees symbol
case "number":
return this.degrees;
case "default":
return this.degrees + " degrees";
}
};
var freezing = new Temperature(32);
console.log(freezing + "!"); // "32 degrees!"
console.log(freezing / 2); // 16
console.log(String(freezing)); // "32°"
```
不同的操作会触发不同的提示值:
| 操作 | 提示值 | 示例 |
| ---- | ---- | ---- |
| + 运算符 | "default" | `freezing + "!"` |
| / 运算符 | "number" | `freezing / 2` |
| String() 函数 | "string" | `String(freezing)` |
##### 1.2 Symbol.toStringTag属性
在JavaScript中,存在多个全局执行环境的问题,例如在网页中包含`iframe`时,页面和`iframe`各自拥有独立的执行环境。当对象在不同环境间传递后,识别对象类型就会成为难题。
在ES6之前,开发者通过调用对象的`toString()`方法来识别数组和原生对象,示例代码如下:
```javascript
function isArray(value) {
return Object.prototype.toString.call(value) === "[object Array]";
}
console.log(isArray([])); // true
function supportsNativeJSON() {
return typeof JSON !== "undefined" &&
Object.prototype.toString.call(JSON) === "[object JSON]";
}
```
ES6通过`Symbol.toStringTag`符号重新定义了原生对象使用`Object.prototype.toString()`方法揭示自身身份的特性。可以为自定义对象定义`Symbol.toStringTag`属性,示例如下:
```javascript
function Person(name) {
this.name = name;
}
Person.prototype[Symbol.toStringTag] = "Person";
var me = new Person("Nicholas");
console.log(me.toString()); // "[object Person]"
console.log(Object.prototype.toString.call(me)); // "[object Person]"
```
不过,`Object.prototype.toString()`方法已不再是完全可靠的对象类型识别方式,因为可以随意设置`Symbol.toStringTag`的值,示例如下:
```javascript
function Person(name) {
this.name = name;
}
Person.prototype[Symbol.toStringTag] = "Array";
Person.prototype.toString = function() {
return this.name;
};
var me = new Person("Nicholas");
console.log(me.toString()); // "Nicholas"
console.log(Object.prototype.toString.call(me)); // "[object Array]"
```
##### 1.3 Symbol.unscopables属性
`with`
0
0
复制全文
相关推荐










