一、Symbol类型介绍
Symbol类型是JavaScript ES6新增的一种数据类型,它可以作为对象属性的标识符使用。Symbol类型的值是唯一的,且不可变更。Symbol类型的值可以作为对象属性名,这样就可以避免对象属性名的冲突。
二、Symbol类型是字符串吗?
Symbol类型与字符串类型不同,Symbol类型的值是独一无二的,不可变性的。
三、Symbol类型数据
Symbol类型数据是一种基本数据类型,可以使用Symbol()构造函数创建。每次调用Symbol()函数都会创建一个新的Symbol值。可以给Symbol()函数传递一个字符串参数,这个字符串是Symbol值的描述信息,便于调试。但是不能依靠这个参数来判断两个Symbol值是否相等。
// 创建一个Symbol类型的值 let symbol1 = Symbol(); let symbol2 = Symbol("description"); console.log(symbol1); // Symbol() console.log(symbol2); // Symbol(description)
四、Symbol类型叫什么?
Symbol类型的英文名称为“Symbol”,中文名称为“符号”。
五、Symbol类型有什么作用?
主要的作用是创建具有唯一标识符的对象属性,以避免属性名的冲突。除此之外,Symbol类型还可以用于控制对象的行为,例如:迭代器(Iterator),元属性(MetaProperty)等。
六、Symbol类型是什么?
Symbol类型是JavaScript中基本数据类型之一,它是一种预定义好的对象,可以使用Symbol()构造函数来创建。
七、Symbol类型可变吗?
Symbol类型的值是不可变的,即使我们能够访问到它们,但是也不能修改它们。一旦创建一个Symbol类型的值,就会一直存在于内存中。
八、Symbol类型的值可以转换为数字吗?
不能。
九、js Symbol类型
在JavaScript ES6之前,JavaScript没有原生的Symbol类型。可以使用字符串或其他常量来表示唯一标识符,但这些标识符并不是真正意义上的唯一的。
与其他现代编程语言一样,JavaScript引入了Symbol类型,作为一种真正的、唯一的标识符。和其它基本数据类型一样,Symbol类型的值也具备以下特点:
- Symbol值可以转换成字符串和布尔值类型,但它们本身不是字符串或布尔值。
- Symbol值可以作为对象的属性名使用,而字符串类型的属性名则不会避开属性名的污染。
- 标准库中已经定义好了许多Symbol值,我们可以直接使用它们。
十、Symbol的所有形式
1、Symbol.iterator
Symbol.iterator是用来定义一个对象的默认迭代器的。当一个对象需要被迭代时,只需要实现一个Symbol.iterator方法即可。比如,在for…of循环中使用数组、字符串、Map、Set等数据结构对象的时候,就是用该对象的Symbol.iterator方法来生成一个迭代器对象。
// 使用Symbol.iterator来定义对象的default迭代器 let obj = { data: [1,2,3], [Symbol.iterator]() { let index = 0; let data = this.data; let len = data.length; return { next() { if (index < len) { return { value: data[index++], done: false }; } else { return { value: undefined, done: true }; } } }; } }; // 执行迭代器 for (let i of obj) { console.log(i); }
2、Symbol.hasInstance
Symbol.hasInstance是一个用来检查一个对象是否为某个构造函数的实例的方法。
class CustomNumber { static [Symbol.hasInstance](instance) { return typeof instance === "number" } } console.log(1 instanceof CustomNumber); // true console.log("foo" instanceof CustomNumber); // false
3、Symbol.isConcatSpreadable
Symbol.isConcatSpreadable定义数组是否可以展开为单独的参数,被concat方法使用。默认情况下,可遍历的都可以被展开。
let arr1 = [1,2,3]; let arr2 = [4,5,6]; arr2[Symbol.isConcatSpreadable] = false; console.log(arr1.concat(arr2)); // [1,2,3,[4,5,6]]
4、Symbol.toPrimitive
Symbol.toPrimitive是一个类型转换函数,用于将一个对象转换为原始值。在将对象转换为原始值时,会优先使用该对象上的这个方法。该方法接受一个字符串参数,表示转换的类型。
// Symbol.toPrimitive方法实现 let user = { name: "John", money: 1000, [Symbol.toPrimitive](hint) { console.log(hint); // 'string'/'number'/'default' return hint == "string" ? `{name: "${this.name}"}` : this.money; } }; // 对象转换为字符串值 console.log(`User: ${user}`); // User: {name: "John"} // 对象转换为数字值 console.log(+user); // 1000 // 对象和数字相加 console.log(user + 100); // 1100
五、总结
JavaScript Symbol类型作为一种唯一的标识符类型,可以有效的解决对象属性名冲突的问题,也可以通过迭代器、元属性等形式对对象进行控制和操作。需要注意的是,Symbol类型的值是不可变的,不能转换为数字和字符串类型。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/150744.html