ES6のシンボルとマップ

シンボル

一意の値を表す es6 の新しいデータ型

基本データ型: 文字列 数値 ブール値 null 未定義 シンボル

参照データのデータ型: オブジェクト

作成する:

let s1 = Symbol()
typeof s1      // 'symbol'

知らせ:

1. シンボルはオブジェクトではなくプリミティブ型の値であるため、new を使用してシンボルを呼び出すことはできません。

2. Symbol 関数は、Symbol の説明のみを表す文字列をパラメータとして受け取り、主にコンソールに表示するときや文字列に変換するときに区別しやすくするために使用されます。

例えば:

let s1 = Symbol()
let s2 = Symbol()
console.log(s1,s2).  //Symbol() Symbol()
let s3 = Symbol('js') 
let s4 = Symbol('html')
console.log(s3,s4) //Symbol(js) Symbol(html)
console.log(Symbol('html') === Symbol('html')) //false    参数仅仅是Symbol的描述,不代表其他意义

3. Symbol パラメータがオブジェクトの場合、オブジェクトの toString メソッドが呼び出され、文字列に変換されてから、Symbol 値が生成されます。

例えば:

const obj = {
    
    
  toString(){
    
    
    return 'abc'
  }
}
console.log(Symbol(obj))   // Symbol(abc)
const obj = {
    
    
  name: 'aa'
}
console.log(Symbol(obj))   //Symbol([object object])

シンボル型変換

1.文字列に変換
String(symbol('haha'))
2. ブール値に変換する
console.log(!!Symbol()) //true
3. 数値への変換や演算はできません。
console.log(Symbol('haha') + 'hello') //报错
4. オブジェクトの属性名として (各 Symbol 値は等しくないため、Symbol をオブジェクトの識別子として使用できることを意味します)
let s = Symbol('s')
const data = {
    
    
  [s]: 'haha'
}
console.log(data)  //{Symbol(s): 'haha'}

注: プロパティ名としての Symbol() は、for...in、for...of で走査することはできません。また、Object.keys()、Object.getOwnPropertyNames() で返すこともできませんが、プライベート プロパティではありません。オブジェクトのすべてのシンボル プロパティ名は、Object.getOwnPropertySymbols メソッドを通じて取得できます。

例えば:

let obj = {
    
    },
    foo = Symbol('foo')
Object.defineProperty(obj, foo, {
    
    
    value: 'footer'
})

for(let i in obj) {
    
    
    console.log(i)   //没有返回值
}
console.log(Object.getOwnPropertyNames(obj))  // []
console.log(Object.getOwnPropertySymbols(obj))  [Symbol(foo)]
const data = {
    
    
  [Symbol()]: 123
}
console.log(data)     //{Symbol():123}
console.log(data[Symbol()])  //undefined
console.log(Object.getOwnPropertySymbols(data))   //[Symbol()]
console.log(Object.getOwnPropertySymbols(data)[0])    // 123

データ構造セット

配列と同様に、メンバーの値は一意であり、重複する値はありません。

1. セットの作成方法

const セット = 新しい Set()

2.Setクラスの属性

var set = 新しい Set([1,2,3,4])

set.size // 4

3.クラスメソッドの設定

1) set.add(value): データを追加し、Set 構造体自体を返します。

set.add('a').add('b').add('c'). //複数の値を追加します

またはnew Set([1,2,3])パラメータとして直接渡します

注: set は格納された値に対してキャストを実行しません。

set.add(5)

set.add(“5”)

Object.is(new Set().add(5), new Set().add('5'))   //false
2) set.delete(value): 指定されたデータを削除し、削除が成功したかどうかを示すブール値を返します。

set.delete('a') // true

set.delete('a')。// 間違い

3) set.has(value): 値が Set のメンバーであるかどうかを判断し、ブール値を返します。

console.log(set.has('a'))。//間違い

console.log(set.has('b'))。//真実

4) set.clear(): すべてのデータをクリアします。戻り値はありません。
5) set.keys(): キー名のトラバーサーを返します。

const s = 新しい Set([1,2,4])

console.log(s.keys())

6) set.values(): 値を返すイテレータ

console.log(s.values())

7) set.entries(): キーと値のペアのトラバーサーを返します。

console.log(set.entries())

8) set.forEach(): コールバック関数を使用して各メンバーを走査します
var set = new Set([1,2,4])
set.forEach((value, key, ownerSet) = > {
    
        
     console.log(`${
      
      key}=${
      
      value}`)    
     console.log(ownerSet ===  set).  //true
})

セットを配列に変換します。

const set = new Set([1,2,4])

[…セット]

Array.from(セット)

使用:

a. アレイの重複排除

const arr = [{},1,2,3,1,4,'a',3]
console.log([...new Set(arr)])   //[{},1,2,3,4,'a']

b. マージ重複排除

 let a = new Set([1,2,3]);
 let b = new Set([3,2,5]);
 let union = new Set([...a,...b]);
 console.log([...union]);    // [1,2,3,5]

データ構造マップ

これは、多くのキーと値のペアを格納する順序付きリストであり、キーと値はすべてのデータ型をサポートします

変更前: オブジェクトは文字列のみをキーとして使用できます

例えば:

let data1 = {a: 1},    
    data2 = {b: 2}, 
    obj= {}
    obj[data1] = 1  
    obj[data2] = 2
    console.log(obj)    // {[object Object]: 2} 

マップは上記の問題を解決します

var map = new Map().set({}, 1).set({}, 2)
console.log(map)  // {Object{}=>1, Object{}=>2}

1. マップを作成する

const マップ = 新しい Map()

パラメータは作成時に初期化でき、2次元配列が渡され、内部の配列はキーと値のペアの形式になります。

const map = new Map([
	["a", 1],    
    ["b", 2]
])   

console.log(map).  // {"a" => 1, "b" => 2 }

2.マップ属性

map.size: 現在のデータ構造内のキーと値のペアの数

3. マップの方法

1) set(key, value): キー名 key に対応するキー値を value に設定し、Map 構造全体を返します。キーにすでに値がある場合はキー値が更新され、それ以外の場合はキーと値のペアが更新されます。新たに生成されます。

例えば:

const map = new Map()
map.set('a',1).set('b',2).set('b',3)       /*链式写法*/
console.log(map).  //{"a" => 1, "b" => 3}
2.get(key): get メソッドは、キーに対応するキー値を読み取ります。キーが見つからない場合は、未定義を返します。
console.log(map.get('a'))   //1
console.log(map.get('c'))   //undefined
3.delete(key): キーを削除します。削除が成功した場合は true を返し、それ以外の場合は false を返します。
console.log(map.delete('a'))   // true
console.log(map.delete('d'))   // false
4.has(key): このメソッドは、キーが現在の Map オブジェクト内にあるかどうかを示すブール値を返します。
console.log(map.has('a'))   // false
console.log(map.has('b'))   // true
5.clear(): すべてのデータをクリアします。戻り値はありません。
map.clear()
map.size     //0
6) Keys(): キー名のトラバーサーを返します。
7)values(): 値のトラバーサーを返します。
8)entrys(): キーと値のペアのトラバーサーを返します。
9) forEach(): コールバック関数を使用して各メンバーを走査します

for...of を使用して横断する

const m = new Map()
m.set('a',1).set('b',2).set('c',3)
for(let [key, value] of map){
   consoel.log(key,value)    
}
マップは配列に変換されます。

[…地図]

Array.from(マップ)

マップはオブジェクトに変換されます。
function strMapTObj(strMap){
	let obj = Object.create(null)
	for (let [k, v] of strMap){
      obj[k] = v
	}
	return obj
}
const map = new Map().set('yes', true).set('no', false)
strMapTObj(map)    // {yes: true, no: false}

オブジェクトはマップに変換されます。

function objToStrMap(obj) {
  let strMap = new Map()
  for (let k of Object.keys(obj)){
    strMap.set(k, obj[k])
  }
  return strMap
}
objToStrMap({yes: true, no: false})  // Map('yes'=> true, 'no'=>false)

地図を利用する際の注意点

const マップ = 新しい Map()

マップ.set(NaN, 10).set(NaN, 100)。//{NaN => 100}

おすすめ

転載: blog.csdn.net/kang_k/article/details/104021258