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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

受付中

JavaScriptで自作のisRequest関数がうまく動かない。

Kchan_01
Kchan_01

総合スコア110

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

1回答

1グッド

0クリップ

248閲覧

投稿2022/10/21 03:21

編集2022/10/21 03:31

前提

JavaScriptのパッケージであるnode-fetchのソースコードリーディングをしています。

実現したいこと

以下のisRequestという関数のコードについて、質問が2つあります。

js

1const INTERNALS = Symbol('Request internals'); 2 3/** 4 * Check if `obj` is an instance of Request. 5 * 6 * @param {*} object 7 * @return {boolean} 8 */ 9const isRequest = object => { 10 return ( 11 typeof object === 'object' && 12 typeof object[INTERNALS] === 'object' 13 ); 14};

https://github.com/node-fetch/node-fetch/blob/main/src/request.js

const INTERNALS = Symbol('Request internals');は文字列を定義しているという理解で合っていますでしょうか。
② ローカルで同じコードを実行しても、結果がfalseになり、予想と異なります。なぜでしょうか。

ローカルで実行しているコード

js

1const INTERNAL = Symbol('Request Internal'); 2 3const isRequest = object => { 4 return ( 5 typeof object === "object" && 6 typeof object[INTERNAL] === "object" 7 ); 8} 9 10const req = new Request("https://example.com"); 11console.log(isRequest(req));

実行コマンド

sh

1❯ node -v 2v18.11.0 3❯ node test.js 4false
miyabi-sunを押しています

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

yambejp

2022/10/21 03:30

もしnode.jsへの質問でしたらタグ付けしてください
Kchan_01

2022/10/21 03:31

ありがとうございます。追加しました。

回答1

1

① const INTERNALS = Symbol('Request internals');は文字列を定義しているという理解で合っていますでしょうか。

いいえ。「Request internals」という説明文を持つ Symbol 型のインスタンスを作っています。

② ローカルで同じコードを実行しても、結果がfalseになり、予想と異なります。なぜでしょうか。

node-fetch 内の INTERNALS とローカルの INTERNALS は同じ説明文で作られていますが、別の Symbol です。よって、req[ローカルのINTERNALS]req[node-fetchのINTERNALS] は別のものを指します。req[ローカルのINTERNALS] には何も入っていないので、ローカルの isRequest()false を返します。

Symbol によるプロパティは説明文だけわかっててもアクセスできず特定のSymbolインスタンスを入手しないといけないので、非公開プロパティを格納するのに使われます。

投稿2022/10/21 03:31

編集2022/10/21 04:58
int32_t

総合スコア17085

miyabi-sunを押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

Kchan_01

2022/10/21 05:48

ご回答ありがとうございます。 Symbolがインスタンスを作成する際に必ずユニークなものが生成されるのだとしたら、なぜfetch-nodeの中の`const INTERNAL = Symbol('Request Internal');`はその作成時に新たなSymbolとして作成されてしまい、isRequestの判定で使用できないように思えるのですがなぜ機能するのでしょうか。
int32_t

2022/10/21 06:08

INTERNAL の宣言と初期化は request.js がロードされたときに一回だけ実行されます。isRequest() や Request コンストラクタが呼ばれたときに再初期化されたりしません。

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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