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

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

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

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

Q&A

解決済

4回答

1787閲覧

サンプルファイルが本のとおりに動かない

tada_tadaa

総合スコア111

JavaScript

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

0グッド

0クリップ

投稿2016/03/19 05:30

編集2016/03/19 07:39

お世話になっております。
「Ajaxライブラリ徹底活用 JavaScript Webプログラミング」という本で
JavaScriptを勉強しているのですが、本の通りに入力してるつもりなの
ですが、結果が本とは違う結果になってしまいます。
↓入力したソース

JavaScript

1function MyData(name,mail,tel){ 2 this.name = name; 3 this.mail = mail; 4 this.tel = tel; 5 6 this.toString = function(){ 7 return "[MyData " + this.name + "]"; 8 } 9 this.equals = function(that){ 10 return this.valueOf().length == that.valueOf().length; 11 } 12 this.valueOf = function(){ 13 return this.toString(); 14 } 15 this.compareTo = function(that){ 16 return this.valueOf().length - that.valueOf().length; 17 } 18} 19 20var person1 = new MyData("山田太郎","taro@yamada.hoge","090-9999-9999"); 21var person2 = new MyData("田中花子","hanako@tanaka.hoge","080-8888-8888"); 22 23 24if (person1 > person2){ 25 document.write(person1 + "が大きい。"); 26} else if (person1 < person2){ 27 document.write(person2 + "が大きい。。"); 28} else { 29 document.write(person1 + "と" + person2 + "は、同じ。"); 30} 31

↓結果
[MyData 田中花子]が大きい。。

↓本に書いてある結果
[MyData 山田太郎]と[MyData 田中花子]は、同じ。

自分でもソースを入力しましたし、
http://www.shuwasystem.co.jp/support/7980html/2431.html#2
のサンプルファイルのソースをコピーアンドペーストで貼り付けても
結果は
[MyData 田中花子]が大きい。。
でした。どこか入力間違いがあって本の通りに動かないのでしょうか?
どなたかお分かりの方がいれば教えていただければと思います。

追記
申し訳ありません。僕の勘違いみたいです。
僕が実行結果だと思った図には次の一文が添えられていました。
「図3-12:共通メソッドを修正し、同じ文字数のオブジェクトは同じものと判断するようにしたところ。」
つまり本に載ってるソースを修正して実行した結果が載ってたようです。
ご迷惑をおかけしました。

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

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

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

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

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

guest

回答4

0

その書籍を持っていないので、著者の方の意図は図りかねますが、ちなみに、こうすると、[MyData 山田太郎]と[MyData 田中花子]は、同じ。 になりますね。

javascript

1if (person1.compareTo(person2) > 0) { 2 document.write(person1 + "が大きい。"); 3} else if (person1.compareTo(person2) < 0) { 4 document.write(person2 + "が大きい。。"); 5} else { 6 document.write(person1 + "と" + person2 + "は、同じ。"); 7}

追記

この compareTo() を使った例ですが、以下のように、name.length が異なる人同士を比較すると、正しく動いていることが確認できます。(Java の標準ライブラリに compareTo() というメソッド(関数の一種)があるので、多分、著者の方は、それを真似た例を示したかったのではないかと)

javascript

1function MyData(name,mail,tel){ 2 this.name = name; 3 this.mail = mail; 4 this.tel = tel; 5 6 this.toString = function(){ 7 return "[MyData " + this.name + "]"; 8 } 9 this.equals = function(that){ 10 return this.valueOf().length == that.valueOf().length; 11 } 12 this.valueOf = function(){ 13 return this.toString(); 14 } 15 this.compareTo = function(that){ 16 return this.valueOf().length - that.valueOf().length; 17 } 18} 19 20var person1 = new MyData("山田太郎","taro@yamada.hoge","090-9999-9999"); 21var person2 = new MyData("田中花子","hanako@tanaka.hoge","080-8888-8888"); 22var person3 = new MyData("鈴木健太郎", "kentaro@suzuki.hoge", "070-7777-7777"); 23 24var compare = function(person1, person2) { 25 if (person1.compareTo(person2) > 0) { 26 document.write(person1 + "が大きい。"); 27 } else if (person1.compareTo(person2) < 0) { 28 document.write(person2 + "が大きい。"); 29 } else { 30 document.write(person1 + "と" + person2 + "は、同じ。"); 31 } 32 document.write("</br>"); 33} 34 35compare(person1, person2); 36compare(person1, person3);

結果

[MyData 山田太郎]と[MyData 田中花子]は、同じ。 [MyData 鈴木健太郎]が大きい。

投稿2016/03/19 06:15

編集2016/03/19 07:37
tatsuya6502

総合スコア2035

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

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

tada_tadaa

2016/03/19 07:25

ご回答ありがとうございます。 なんだかいろんなやり方があるようですし、このプログラム文の意味もまだ分かってない んですが、tatsuya6502さまのご回答も参考になります。 ソース文を追って行ってなんとなく理解はできます。しかし考え出したらほかにももっとあ るんじゃないという気になってきました。 ありがとうございました。
tatsuya6502

2016/03/19 07:32

あ、コメントが行き違いになってしまいましたね。 if(person1.equals(person2) > person2.equals(person1) ){ document.write(person1 + "が大きい。"); ... ですが、それだと名前の長さが異なる人同士を比較した時に正しく動かないですね。多分、著者の方が示したかったのではないかと思う、正しく動く例を、追記しました。
tada_tadaa

2016/03/19 08:15

コメントありがとうございます。 たしかに if(person1.equals(person2) > person2.equals(person1) ){ の方法は 名前の長さが異なる人同士を比較した時に正しく動かないです。 tatsuya6502さまの追記の例では関数化?してますね。こういう方法もあるのかと 初歩的なことだと思いますが勉強になります。
guest

0

"[MyData 田中花子]が大きい。" が出力される結果に間違いはないと思います。
同じと評価したいなら person1.name.length, person1.equals(), persion1.toString(), person1.valueOf() を使うコードでしょうか。
本題ではありませんが、prototype を使ったコードにするとメモリを節約できると思います。

javascript

1'use strict'; 2function MyData(name,mail,tel){ 3 this.name = name; 4 this.mail = mail; 5 this.tel = tel; 6} 7 8MyData.prototype = { 9 toString: function toString () { 10 return "[MyData " + this.name + "]"; 11 }, 12 equals: function equals (that) { 13 return this.valueOf().length == that.valueOf().length; 14 }, 15 valueOf: function valueOf () { 16 return this.toString(); 17 }, 18 compareTo: function compareTo (that) { 19 return this.valueOf().length - that.valueOf().length; 20 } 21}; 22 23var person1 = new MyData("山田太郎","taro@yamada.hoge","090-9999-9999"); 24var person2 = new MyData("田中花子","hanako@tanaka.hoge","080-8888-8888"); 25 26console.log(person1.name.length === person2.name.length); // true 27console.log(person1.valueOf().length === person2.valueOf().length); // true 28console.log(person1.toString().length === person2.toString().length); // true 29console.log(person1.equals(person2)); // true 30 31if (person1 > person2){ 32 document.write(person1 + " が大きい。"); 33} else if (person1 < person2){ 34 document.write(person2 + " が大きい。。"); 35} else { 36 document.write(person1 + "と" + person2 + " は、同じ。"); 37}

(更新履歴)

  • 2016/03/20 09:08 person1.length から person1.name.length へ修正。prototype を使ったサンプルコード追記。

Re: tada_tadaa さん

投稿2016/03/19 05:54

編集2016/03/20 00:10
think49

総合スコア18162

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

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

tada_tadaa

2016/03/19 07:10

ご回答ありがとうございます。 まだオブジェクト指向とかJavaScript がよくわかってないもので頭がこんがらがってます。 person1.lengthを使う方法ではamaranthineさんの if (person1.name.length > person2.name.length){ が見た瞬間直観的に分かりやすいと思いました。(nameの長さを比べていることが分かる) person1.equals()を使う方法は if(person1.equals(person2) > person2.equals(person1) ){ document.write(person1 + "が大きい。"); } else if (person1.equals(person2) < person2.equals(person1) ){ document.write(person2 + "が大きい。"); }else { document.write(person1 + "と" + person2 + "は、同じ。"); } ではないかと思っていますが、意味はよく分かってないです。。 ありがとうございました。
think49

2016/03/20 00:12 編集

> person1.lengthを使う方法ではamaranthineさんの すみません。仰る通り、person1.name.length が正しかったので親記事を修正しました。 > person1.equals()を使う方法は person1.equals(person2) ですね。親記事にサンプルコードを追記しました。
tada_tadaa

2016/03/20 02:37

chromeでconsole.logを使ってみましたがとても便利そうですね。 これでデバッグ作業が効率よくできそうです。 勉強になります。
guest

0

ベストアンサー

「[MyData 田中花子]が大きい。」であってると思いますよ

person1 > person2[MyData 山田太郎] > [MyData 田中花子] という比較になります

JavaScript の比較は

文字列は、Unicode の値を用い、標準の辞書に基づいて比較されます。

MDN

という仕様なので 一緒になることはまずないはずです

投稿2016/03/19 05:53

ryls-nmm

総合スコア633

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

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

tada_tadaa

2016/03/19 06:51

ご回答ありがとうございます。 本をよく読んでみると僕が実行結果だと思っていたものは、修正して実行されたもので ソースの通りに実行したものじゃないようです。僕の理解力不足でご迷惑をおかけしました。 「これ」とは書いてないのですが、本をよく読むと次のようなソース文を書いて僕が実行結果 だと勘違いした結果が得られたのではないだろうかと思います。 if(person1.equals(person2) > person2.equals(person1) ){ document.write(person1 + "が大きい。"); } else if (person1.equals(person2) < person2.equals(person1) ){ document.write(person2 + "が大きい。"); }else { document.write(person1 + "と" + person2 + "は、同じ。"); }
tatsuya6502

2016/03/19 07:29 編集

これだと、名前の長さが違う人同士を比較した時にうまく動かないですね。(コメントにコードを貼ると、きれいに表示できないので、自分の回答の方に追記しました)
guest

0

ちゃんと全部読んでないテキトーな回答ですが、最後の部分を以下のようにするのが意図でしょうか。

javascipt

1if (person1.compareTo > person2.compareTo){ 2 document.write(person1 + "が大きい。"); 3} else if (person1.compareTo < person2.compareTo){ 4 document.write(person2 + "が大きい。。"); 5} else { 6 document.write(person1 + "と" + person2 + "は、同じ。"); 7}

一応「同じ」と返ってきました。

追記
と書きましたが、意図が分からんと指摘されたので修正します(私も分かってません)。とはいえ、未だにどういう意図のコードか図りかねてます。どの大きさを比較してるのか。関数が同じと言いたいのか、不明です。とりあえず、名前の長さで比較しました。

javasctipt

1if (person1.name.length > person2.name.length){ 2 document.write(person1 + "が大きい。"); 3} else if (person1.name.length < person2.name.length){ 4 document.write(person2 + "が大きい。。"); 5} else { 6 document.write(person1 + "と" + person2 + "は、同じ。"); 7}

投稿2016/03/19 05:46

編集2016/03/19 06:11
amaranthine

総合スコア501

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

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

ryls-nmm

2016/03/19 05:59

それだと compareTo という関数自体を比較するというおかしなことになってますね 同じ関数なので一緒になりますが、なにをしたいのかわからないことになります
tada_tadaa

2016/03/19 06:32

ご回答ありがとうございます。 amaranthineさんが教えてくださった方法を試したところ僕も「同じ」と返ってきました。 よく分りませんが、「[MyData 田中花子]が大きい。」で合っているようです。 本の結果(だと思っていた)には、次のような一文が書いてあったので、結果じゃなくて修正 して実行した結果だったようです。 「図3-12:共通メソッドを修正し、同じ文字数のオブジェクトは同じものと判断するようにしたところ。」 僕の理解力不足で、実行結果だと思ってました。しかし、みなさんの回答のおかげで本に書い てあることが少し理解できるようになりました。
amaranthine

2016/03/19 06:35

ええ、大きいで合っているのはその通りなのですが、コードを修正して同じと返したいということかと思っていました。そのため、同じに返したかったのですが、ryls-nmmさんの言うとおり、当初のコードはわけわかめでした。追記後のコードは、「同じ文字数のオブジェクトは同じものと判断」するようにしています。
tada_tadaa

2016/03/19 07:03

if (person1.name.length > person2.name.length){ なら僕でも直観的に理解しやすいです。実行結果も同じになりました。 いろんなやり方があるみたいで、どれが正しいのかまだ初心者の僕には分らないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問