ES6

ES6深入浅出之新增的数据类型

Posted by weite122 on 2019-01-15

Symbol

  • Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。Symbol是一个全局对象,Symbol不支持new Symbol()
  • 每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符,这是该数据类型仅有的目的。
1
2
3
4
5
var a = new Object()
a["0"] = "x"
a["m"] = "y"
a[Symbol()] = "z"
a//{0: "x", m: "y", Symbol(): "z"}
  • symbol 是一种基本数据类型。基本数据类型是number,string,bool,null,undefined,Object是复杂类型。

Symbol的用处

  • 创建一个隐藏属性,别人无法访问,但可以自己修改
1
2
3
4
5
6
7
8
9
10
11
{
let a = Symbol()
let Object = {
name : 'ooo',
age: 18,
[a]: '隐藏属性'
}
Object[a] = '新的隐藏属性'
window.object = Object
}
//{name: "ooo", age: 18, Symbol(): "新的隐藏属性"}

Set

  • Set 对象允许你存储任何类型的唯一值(自动去重),无论是基本数据类型或者是对象引用。

  • 另外,NaN和undefined都可以被存储在Set 中, NaN之间被视为相同的值(尽管 NaN !== NaN)

  • 数组去重

    • 用排序算法解决
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var a = [1,2,3,4,5,4,2]
    var b = [1,2,3,4,'4',5,4,2,{name:'object'}]
    function uniq(array){
    var result = []
    var hash = {}

    for(let i=0;i< array.length; i++){
    hash[array[i]] = true
    }
    for(let key in hash){
    result.push(key)
    }
    return result
    }
    console.log(uniq(a))//["1", "2", "3", "4", "5"]
    console.log(uniq(b))//["1", "2", "3", "4", "5", "[object Object]"]
    • PS: 该方法无法区分数字和字符串,无法统计对象,而且得到的结果不是数字。
  • 用Set方法解决

    1
    2
    3
    4
    5
    var a = [1,2,3,4,'4',5,4,2,{name:'object'}]
    function uniq(array){
    return Array.from(new Set(array))
    }
    console.log(uniq(a))//[1, 2, 3, 4, "4", 5, {name:'object'}]

Map

  • Map 对象保存键值对。任何值(对象或者基本类型) 都可以作为一个键或一个值。

  • 对象默认会把key值变成字符串,所以会出现以下错误

    1
    2
    3
    4
    5
    6
    var obj = {name: "weite122"}
    Object.keys(obj)//["name"]
    var a = {}
    obj[a] = "hello"
    obj//{name: "weite122", [object Object]: "hello"}
    Object.keys(obj)// ["name", "[object Object]"]
  • 用map实现对象为key值

    1
    2
    3
    4
    5
    var myMap = new Map()
    var a = {}
    myMap.set(a, 'key值是对象')
    myMap//Map(1) {{…} => "key值是对象"}
    myMap.get(a)//"key值是对象"

WeakSet

  • 对象占内存,内存很贵,所以尽量省着用内存。GC回收就是找出开发者访问不到的对象,清除。 弱引用不属于垃圾回收范围,浏览器很可能把弱引用对象删除。

  • 内存泄露:你不能使用该内存里的东西,别人也无法使用

  • 它和 Set 对象的区别有两点:

    • WeakSet 对象中只能存放对象引用, 不能存放值, 而 Set 对象都可以.
    • WeakSet 对象中存储的对象值都是被弱引用的, 如果没有其他的变量或属性引用这个对象值, 则这个对象值会被当成垃圾回收掉. 正因为这样, WeakSet 对象是无法被枚举的, 没有办法拿到它包含的所有元素.

WeakMap

  • WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。

TypedArray

  • 一个TypedArray 对象描述一个底层的二进制数据缓存区的一个类似数组(array-like)视图。事实上,没有名为 TypedArray的全局对象,也没有一个名为的 TypedArray构造函数。相反,有许多不同的全局对象,下面会列出这些针对特定元素类型的类型化数组的构造函数。在下面的页面中,你会找到一些不管什么类型都公用的属性和方法。

参考