TS/TESTS JAVA → GO →

Collections

Map: オブジェクトキーはプロパティではなく参照で照合する

同じプロパティを持つ別オブジェクトは、Map の同じキーとして検索されません。

Node.js 22+
pitfallmapidentityobject
01 / 01 proof
SourceobjectMapKeys.ts
Node.js 22
export type Key = { id: string };

export function valueFor(map: Map<Key, string>, key: Key): string | undefined {
  return map.get(key);
}
Source✓Test
TestobjectMapKeys.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { valueFor } from "../../src/map/objectMapKeys.js";

test("同じIDを持つ別オブジェクトではMapを検索できない", () => {
  const stored = { id: "a" };
  const map = new Map([[stored, "value"]]);
  assert.equal(valueFor(map, stored), "value");
  assert.equal(valueFor(map, { id: "a" }), undefined);
});
01Assertion

このテストで確認できること

  • 登録に使った同一オブジェクトでは検索できる
  • 同じプロパティを持つ別オブジェクトでは検索できない

Map の object key は参照同一性を用います。キーに値としての意味が必要なら string や number の ID を使います。

OBSERVED RESULTexpected: map.get({id:"a"}) → undefined actual: undefined

Static index

教材を検索

テーマ、タグ、テスト名、カテゴリ、Node.js・TypeScriptバージョンで絞り込みます。

50件の教材を表示しています。

Language · Node.js 22+string: プリミティブ文字列の === は値を比較する@Test 同じ内容の文字列は===で等しいLanguage · Node.js 22+string: trim 後の長さで空白だけを判定する@Test 空白だけの文字列はisBlankでtrueになるLanguage · Node.js 22+string: 連結は元の文字列を変更しない@Test 文字列の連結は元の値を変更しないCollections · Node.js 22+Array: push は同じ配列を変更する@Test pushすると元の配列に要素が追加されるCollections · TypeScript 5+readonly: 型だけでは配列を実行時に凍結しない@Test freezeした配列にはpushできないCollections · Node.js 22+Array: スプレッドによるコピーは浅い@Test 浅いコピーでは要素オブジェクトを共有するCollections · Node.js 22+Map: キーがない時だけ既定値を登録する@Test 存在しないキーには既定値が登録されるNumbers · Node.js 22+number: NaN は自分自身とも === で等しくない@Test NaNは===では等しくないNumbers · Node.js 22+number: 0.1 + 0.2 は厳密な 0.3 にならない@Test 小数の加算は厳密な0point3と等しくないLanguage · Node.js 22+object: 同じプロパティでも === は別の参照なら false@Test 同じ座標を持つ別オブジェクトは===で等しくないLanguage · Node.js 22+Set: オブジェクトの重複判定は参照同一性で行う@Test 別インスタンスの同じIDはSetで重複しないFunctional · TypeScript 5+undefined: ?? で値がない場合だけ既定値を選ぶ@Test undefinedの値は既定の表示名を返すFunctional · TypeScript 5+default: 引数は呼び出し前に評価され、supplier は必要時まで遅延できる@Test 値があってもeagerな既定値の式は評価されるFunctional · TypeScript 5+optional chaining: 値がない処理を連鎖で止める@Test optional chainingは途中のundefinedで評価を止めるFunctional · Node.js 22+Array: filter は新しい配列を返し、入力を変更しない@Test filterは正の数だけを残すFunctional · Node.js 22+Array: map は呼び出した時点で評価される@Test Arrayのmapは直ちにコールバックを評価するFunctional · Node.js 22+Object.freeze: 凍結は一段目だけに適用される@Test freezeしたオブジェクトでも入れ子は変更できるError Handling · Node.js 22+Error: assert.throws で失敗の契約を確かめる@Test ゼロで割るとRangeErrorが送出されるError Handling · TypeScript 5+Result: TypeScriptには checked exception がない@Test 不正なポートはResultのerrorを返すGenerics · TypeScript 5+generics: readonly number[] は数値配列を読み取れる@Test numberのreadonly配列を合計できるGenerics · TypeScript 5+generics: mutable な配列の共変性は不正な値を混入させ得る@Test 広い要素型の配列APIはnumber配列へ文字列を追加できるDate / Time · Node.js 22+Date: 同じ instant でもタイムゾーンで日付が異なる@Test 同じinstantはUTCとLosAngelesで日付が異なるError Handling · Node.js 22+try/finally: 成功時も失敗時も後片付けを行う@Test withResourceは処理後にcloseを必ず呼ぶCollections · Node.js 22+Map: オブジェクトキーはプロパティではなく参照で照合する@Test 同じIDを持つ別オブジェクトではMapを検索できないNumbers · Node.js 22+number: Math.round は負の 0.5 をゼロ方向へ丸める@Test MathRoundの負の半端値はゼロ方向になるFunctional · TypeScript 5+?? と ||: 0 や空文字を既定値扱いするかが異なる@Test ゼロはORでは既定値になるがnullishでは保持されるCollections · Node.js 22+Map: number の 1 と string の "1" は別のキー@Test Mapはnumberとstringの同じ見た目のキーを区別するNumbers · Node.js 22+number: 十進数 0.1 は二進浮動小数点の近似値である@Test 0point1を十進形式で十分長く表示すると近似値が見えるFunctional · TypeScript 5+optional property: 省略、undefined、null は別の状態になり得る@Test プロパティの不在とundefined値はin演算子で区別できるLanguage · Node.js 22+string: length は UTF-16 のコード単位を数える@Test 絵文字はlengthでは2だがArrayFromでは1になるLanguage · Node.js 22+string: 見た目が同じ Unicode 文字列でも === が異なる@Test 正規化前は異なりNFC後は同じ文字列になるCollections · Node.js 22+Map: get の undefined だけでは未登録と undefined 値を区別できない@Test getだけではundefined値のキーと未登録キーを区別できないCollections · TypeScript 5+const: 配列の再代入は防ぐが、要素の変更は防がない@Test const配列には要素を追加できるFunctional · Node.js 22+generator: iterator は一度進めた位置から再開する@Test 消費したiteratorは二回目に最初から読めないDate / Time · Node.js 22+Date: 夏時間の切替をまたぐ日付境界は 24 時間ではない@Test 夏時間開始日の二つの現地深夜は23時間離れているLanguage · Node.js 22+Array: 同じ要素の別配列も === では等しくない@Test 同じ要素の別配列は===で等しくならないLanguage · TypeScript 5+discriminated union: kind による網羅的な分岐を表す@Test 支払い方法の全kindをswitchで分岐できるConcurrency · Node.js 22+async: コンテキストを引数で明示して非同期処理へ渡す@Test 非同期処理は明示的に渡したリクエストIDを返すConcurrency · Node.js 22+Promise: await は rejection の元の Error を送出する@Test awaitはPromiseの失敗で元のErrorを送出するConcurrency · Node.js 22+Promise.all: 一つが失敗しても他の処理を自動では中止しない@Test PromiseAllの失敗後も開始済み処理は完了するGenerics · TypeScript 5+generics: 型引数は JavaScript 実行時には存在しない@Test 異なる型引数の配列は実行時に同じArrayとして見えるLanguage · TypeScript 5+== と ===: 暗黙変換の有無が異なる@Test == は比較前に空文字を数値へ変換するが、=== は型が異なればfalseになるConcurrency · ES2020+Promise.allSettled: 成功と失敗を両方観測する@Test Promise.allSettled は成功と失敗を結果配列として両方返すLanguage · TypeScript 5+private と #private: 実行時の隠蔽範囲が異なる@Test privateは実行時プロパティとして書き換えられるが、#privateは外部から作れないGenerics · TypeScript 5+type guard: unknownを安全に絞り込む@Test unknownはtypeof型ガードの後だけstringとして使えるGenerics · TypeScript 5+as const: 値をliteral型として保つ@Test as constは配列要素をliteral unionとして保つLanguage · TypeScript 5+enum: numeric enumは実行時にもobjectとして残る@Test numeric enumはJavaScript実行時に逆引き可能なobjectとして残るLanguage · TypeScript 5+closure: 関数は作成時のローカル状態を保持する@Test closureは作成時のローカル状態を呼び出し間で保持するCollections · ES2015+Set: NaNは同じ値として重複除去する@Test SetはNaNを同じ値として重複除去するLanguage · ES2015+Object.keys と for in: 継承プロパティの列挙が違う@Test Object.keysはown propertyだけ、for inは継承したenumerable propertyも列挙する