JS 数类型:
- 基本数据类型:
number
,string
,boolean
,null
,undefined
,Symbol(新增)
- 复杂数据类型:
object
除了新增的Symbol
之外,其他的Set
,Map
,WeakSet
,WeakMap
,TypeArray
均为object
。
Symbol
静态属性和静态方法统称为静态成员,可以通过构造函数.直接调用。
-
Symbol()
函数会返回Symbol
类型的值,该类型的值具有静态属性和静态方法,但它不支持语法new Symbol()
a = window.Symbol() //Symbol()是一个全局函数
a //Symbol()
- 每个从
Symbol()
返回的Symbol
值都是唯一的;
a = window.Symbol()
b = window.Symbol()
a === b //false
- 一个
Symbol
的值能作为对象属性的标识符,在ES6之前,对象属性名只能是字符串.
a = window.Symbol
var obj = {}
obj[a] = 'aaaaa'
Symbol的值可以作为对象的属性名.PNG
-
Symbol
是一种基本数据类型,不是对象。
a = Symbol()
typeof a //symbol
- 在ES6之前,无法做到真正有一个私有属性,但是
Symbol
可以创造一个隐藏属性.
{
let a = Symbol()
let obj = {
name: 'aaaa',
[a]: '隐藏' //不能写成a,这是字符串a
}
window.object = obj;
}
Symbol创造隐藏属性.PNG
Set
Set
对象允许你存储任何类型的唯一值,无论是原始值还是对象引用。
new Set([1,2,1,4,3,5,3,4])
//Set(5) {1, 2, 4, 3, 5} //返回的是一个对象
- 面试题,数组去重
//ES5
var a = [1, 2, 5, 4, 5, 3, 2, 1, 3];
function uniq(array) {
var result = [];
var hash = {};
for (var i = 0; i < array.length; i++) {
hash[array[i]] = true; //把数组的值作为对象的key,存储起来,并且赋值true,相同的数值不进行多次处理
}
console.log(hash);
for (let key in hash) {
result.push(key); //把hash对象的key push到数组里
}
return result;
}
console.log(uniq(a)); //['1','2','3','4','5']
/*
缺点:
1: 返回的新数组里面的数字不是真实的数字,是字符串数字,因为在ES6之前,对象的属性名只能是字符串
2. 无法区别原数组中的数字和字符串数字,比如'4'和4,会被认为是一个
3. 无法统计对象,比如[1,2,3,{name:object}] //返回的新数组是["1", "2", "3", "[object Object]"]
*/
//ES6
//set对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用
var a = [1, 2, 5, 4, 5, "4", 3, 2, 1, 3, { name: "object" }];
function uniq(array) {
return Array.from(new Set(array));
//等价于[...new Set(array)]
}
//new Set(array)得到的是对象,所以Array.form将对象变为数组
console.log(uniq(a)); //[1, 2, 5, 4, "4", 3, {…}]
Map对象
Map对象
保存键值对,任何值(对象或者原始值)都可以作为一个键或一个值。
Map对象
最大的优点就是弥补了对象只能用自古城窜作为key的这一缺点,Map对象
使得任何都可以作为key。
var map = new Map()
var a = {}
map.set(a,'hi') //设置
map.get(a) //获取
- 获取键值对里面的key
for(let key of map.keys()){
console.log(key)
}
- 获取键值对里的value
for(let value of map.values()){
cosnole.log(value)
}
- 获取每一对键值对
for(let key of map.entries()){
console.log(key)
}
WeakSet对象
WeakSet对象
允许你将弱引用保持对象存储在一个集合中,弱引用不属于GC(垃圾回收)的计算范围,即弱引用的属性依旧可以被回收。
var Wset = new WeakSet()
var o = {}
Wset.add(o)
o = null //可以被回收,Wset为弱引用
var set = new Set()
var o = {}
set.add(o)
o = null //不可以被回收,set为弱引用
-
WeakSet对象
与set对象
的区别二:WeakSet对象
不能获取到键值对,即没有entries
WeakMap对象
WeakMap对象
是一组键值对的集合,其中键是弱引用,并且只能是对象,而值可以使任意值。
- 区别:
WeakMap对象
不能获取到键值对,即没有entries
网友评论