質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

199閲覧

Symbol()の具体的な値を取得する方法

zohnam

総合スコア1443

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2024/11/21 06:02

実現したいこと

Symbol() で生成した値を、具体的に確認する方法が知りたいです

発生している問題・分からないこと

Symbol() が、呼び出すたびに、一意な値を返してくれるそうで、活用してみようと思っています
この値が具体的に何が入っているのかをデバッグで見たいのですが、見る方法がわかりません
toString(), valueOf()あたりで見れると思ったのですが、違うようです
どうやったら見れますか?

該当のソースコード

javascript

1console.log(Symbol().toString(), Symbol().valueOf()) 2

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Symbol() Symbol()

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2024/11/21 08:06

お探しのものは crypto.randomUUID() だったりしますか?
zohnam

2024/11/22 04:21

むかし見たことがあるような気がするので、Symbolでもこういう風に確認できれば、とは思いました ただ残念ながら「顧客が本当に必要だったもの」ではありません
guest

回答4

0

仕様書です。
https://hacks.mozilla.org/2015/06/es6-in-depth-symbols/

いろいろ試してみましたが、定義としては他の値と一致しないものを生成するという機能なので、
実際にどういう値を使っているかということが分かれば、それは実際にその値と一致するということになり、定義に矛盾が発生するので、それを参照することができないのではないでしょうか?

つまり、一致しないという仮想的な存在を、実際に存在する値として当てはめてしまうと一致しないという定義から外れてしまうということですね。

哲学ですね。

これは論理哲学論考ですね。
語りえぬものについては、沈黙せねばならない。

投稿2024/11/21 10:04

utm.

総合スコア271

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zohnam

2024/11/22 04:42

回答ありがとうございます なるほど、非常に納得する説明です 具体的なデバッグの参考とはならなかったのでベストアンサーにはできませんが、設計思想として参考になりました
guest

0

シンプルに Symbol() で生成したSymbolを見た目で区別する手段はないと思います。

キーに紐づいたSymbolを作ることができて、それは文字列表現にキーの値を含みます。

js

1const s = Symbol.for("my-symbol"); 2console.log(s); 3// Symbol(my-symbol) と表示される

Symbol("my-symbol") のようにしてもSymbolに名前を付けることができますが、こちらの方法では名前でSymbolを一意に特定できません。Symbol("my-symbol") を呼ぶたびに別のSymbolが生成されます。

投稿2024/11/21 06:57

編集2024/11/21 07:08
int32_t

総合スコア21601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zohnam

2024/11/22 04:21

回答ありがとうございます
guest

0

SymbolはプリミティブですがNumberでもStringでもないsymbol値なので文字列として参照することはできません
ただsymbol値同士は同じか違うか比較ができるだけです

参考

javascript

1const a=new Array(3).fill(Symbol()); 2const b=new Array(3).fill(null).map(()=>Symbol('test')); 3const c=new Array(3).fill(null).map(()=>Symbol.for('test')); 4console.log(a); // symbol値が3つ 5console.log(b); // symbol値が3つ 6console.log(c); // symbol値が3つ 7console.log([...new Set(a)]); //Array [ Symbol() ] →中身が同じsymbolなので1つしか表示されない 8console.log([...new Set(b)]); //Array(3) [ Symbol("test"), Symbol("test"), Symbol("test") ] →おなじキーで作ってもsymbol値はことなるので3つ 9console.log([...new Set(c)]); //Array [ Symbol("test") ]→forを指定すると同じsymbolが作られるので1つ

test

javascript

1const hoge=Symbol.for("hoge"); 2localStorage.hoge=hoge;

上記、chromeでは「Uncaught TypeError: Failed to set a named property 'hoge' on 'Storage': Cannot convert a Symbol value to a string」というエラーがでます。つまりsymbol値は文字列に変換できないということです。

投稿2024/11/21 06:50

編集2024/11/22 04:49
yambejp

総合スコア116468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zohnam

2024/11/22 04:23

回答ありがとうございます 値が確認できないので、コピーなどで予想外の挙動をされないかな?と警戒していましたが 特に問題はないようです
guest

0

ベストアンサー

仮に識別する値が欲しいとするならば下記な感じでいいのではないでしょうか?

js

1// symbolid.js 2let num = 0; 3const dict = {}; 4export function getSymbolId(symbol) { 5 if (typeof symbol !== "symbol") throw new Error("required symbol type"); 6 if (!(symbol in dict)) dict[symbol] = num++; 7 return dict[symbol]; 8}

js

1import { getSymbolId } from "./symbolid.js"; 2{ 3 const v = Symbol(); 4 console.log(getSymbolId(v)); 5 // -> 0 6} 7{ 8 const v = Symbol(); 9 console.log(getSymbolId(v)); 10 // -> 1 11}

見ての通り、実行単位でユニークにはなると思われます

勿論これは object を対象として下記の様なコードと概ね同じことをしています。

js

1// objectid.js 2let num = 0; 3const dict = new Map(); 4export function getObjectId(object) { 5 if (typeof object !== "object") throw new Error("required object type"); 6 if (!dict.has(object)) dict.set(object, num++); 7 return dict.get(object); 8}

投稿2024/11/21 13:09

juner

総合スコア453

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zohnam

2024/11/22 04:45

回答ありがとうございます 実際に動かしてみて挙動が把握できました そうですね、「デバッグ」が目的なので、Symbolの値そのものじゃなくてもいいんでした これこそが「顧客が本当に必要だったもの」です ベストアンサーとさせていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問