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

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

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

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

JavaScript

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

Q&A

1回答

592閲覧

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

Kchan_01

総合スコア110

Node.js

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

JavaScript

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

1グッド

0クリップ

投稿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を押しています

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

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

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

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

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

yambejp

2022/10/21 03:30

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

2022/10/21 03:31

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

回答1

0

① 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

総合スコア20882

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

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

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 コンストラクタが呼ばれたときに再初期化されたりしません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問