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

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

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

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

Q&A

解決済

3回答

277閲覧

String.lengthの基本的な考え方について

maguzo

総合スコア57

JavaScript

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

6グッド

8クリップ

投稿2019/02/07 08:18

編集2019/02/07 08:20

一度書籍でも読んだのですが、改めて単純に疑問に思ったため、お尋ねさせてください。

Javascript

1var str = new String("Hello"); 2console.log(str.length);

この場合、Stringオブジェクトはもともとlengthプロパティが備わっているのでその文字列の個数である"5"を返してくれます。
*文字列のあるべきリテラルで実際には下記の記法と変わりはない(省略的な記法?)となんとなくですが認識しております。

Javascript

1var str = "hello"; 2console.log(str.length);

A) この場合には、文字列だけではオブジェクトではないのでプロトタイプチェーンをたどりStringオブジェクトに
辿り着き、そのプロパティであるlengthを参照しているという理解であっていますでしょうか?
また、Javascript(ブラウザ)は"hello"は文字列であるため、当然にそのプロトタイプ(上位のオブジェクト)はStringオブジェクトと
知っているのでしょうか。

B) また、仮にプロトタイプチェーン上、上位のオブジェクトが複数あってlengthプロパティ(または他のメソッドでもよいのですが)
が複数存在する場合、近いオブジェクトのプロパティ(またはメソッド)が選択されるという考え方で正しいでしょうか?

とても基本的な挙動や考え方かもしれませんが、ご教示の程
宜しくお願い申し上げます。

azuapricot, dhammapada, Lhankor_Mhy, DrqYuto, kei344, dice142👍を押しています

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

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

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

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

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

guest

回答3

0

この場合には、文字列だけではオブジェクトではないのでプロトタイプチェーンをたどり

いえ、内部的には文字列にもプロパティやメソッドが存在する扱いとなっています(ES2018の仕様書による)。

投稿2019/02/07 08:35

maisumakun

総合スコア145183

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

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

maguzo

2019/02/07 08:43

コメント有難うございます。 そ、そうなんですね。根本のところにら誤っていたようです。 文字列に対して、console.log()しても、文字列が、出力されるだけですが、そのような内部的なプロパティやメソッドをブラウザで視覚的に確認することはできますでしょうか?
ndxbn

2019/02/12 09:23

Google Chrome なら、 `utils.constructor("foo");` で見れると思います。
guest

0

ベストアンサー

JavaScriptはRubyのような純粋なオブジェクト指向言語ではなく、
ちょっと特殊な中途半端オブジェクト思考の実装になっています。

JavaScriptに於けるString、Number、Boolean型(他にもあるかも?)はプリミティブ値でオブジェクトではありません。
当然プロパティやメソッドなんてない。

でも、現に"hoge".lengthと書いたら4という数値が帰ってくるではないか!
ちゃんとプロパティもメソッドも用意されているじゃないか!…と矛盾が生じます。

そのため、プリミティブ値のプロパティやメソッドを参照するべきタイミングになったら、
式の途中で一時的にオブジェクトとして振る舞い、行の最後でまたプリミティブ値に戻るという挙動をします。

これがmri0815さんが説明している内容で、
"hoge".hoge = 5みたいな事を行うことでプリミティブ値のプロパティに値を詰め込む事がエラーになりません。
しかし、行を抜けた所で追加されたプロパティが捨てられてしまい、hogeキーへの代入はなかったことになります。

投稿2019/02/07 09:22

miyabi-sun

総合スコア21158

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

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

maguzo

2019/02/07 12:16

コメントを頂きまことにありがとうございます。 ご説明及び参考のサイトが非常にわかりやすかったです。一時的にプリミティブ型の文字列はオブジェクトのような振る舞いをして、lengthプロパティにアクセスできるのですね。また、そのようなものをラッパーオブジェクトと呼ぶことを学ぶことができました。 心より御礼申し上げます。
miyabi-sun

2019/02/07 12:25

私はURL1個も出してませんょ>< 今回はmriさんがMVPじゃないかなぁと思ってます。
guest

0

  • Aについて

https://developer.mozilla.org/ja/docs/Glossary/String
に下記の通り記載があります。

JavaScript では、文字列はプリミティブ値の一つで、String オブジェクトが文字列プリミティブのラッパーオブジェクトになります。

例えば以下のコードでは、プリミティブ型にlangプロパティが存在しないため、undefinedとなります。

javascript

1var str = "hoge"; 2str.lang ="en"; 3console.log(str.lang); 4 5var obj = new String("hoge"); 6obj.lang ="en"; 7console.log(obj.lang);

投稿2019/02/07 08:43

mri0815

総合スコア429

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

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

maguzo

2019/02/07 08:50

コメント有難うございます。 ご提示のコードを動作させ、プリミティブ型にプロパティや、メソッドを格納できないことは、確認できました。一方、マニュアルでいう、ラッパーオブジェクトのイメージが湧かないのですが、文字列というプリミティブ型の型がstringオブジェクトの中にプロパティとして内包されているということでしょうか? 度々申し訳ございません。
mri0815

2019/02/07 09:00

プリミティブ型の値に対してプロパティアクセスすると対応するラッパーオブジェクトに変換されます。 文字列リテラルの場合、Stringがラッパーオブジェクトですので、toUpperCase()等メソッドを意識せず呼び出すことが出来ます。
maguzo

2019/02/07 12:19

ご返信ありがとうございます。 リンク先、非常にわかりやすかったです。 疑問に思ったことを理解することができました! よろしくお願いしますお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問