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

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

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

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

Q&A

解決済

4回答

1487閲覧

JavaScriptのよくわからないコード

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2018/02/15 05:06

JavaScriptのよくわからないコードを発見しました。

JavaScript

1onload = function() { 2 var e = document.getElementById("e"); 3 var i = 0; 4 (function move() { 5 move.endTime || (move.endTime = Date.now() + 2000); 6 var ratio = Math.min(1, 1 - (move.endTime - Date.now()) / 2000); 7 e.style.left = e.style.top = 100 * ratio + "px"; 8 if(ratio < 1) { 9 setTimeout(move, 10); 10 } 11 })(); 12};

即時関数内の、

move.endTime || (move.endTime = Date.now() + 2000);

はどういう読み方をすればいいのでしょう?
それとendTimeとはなんなのでしょうか?ググっても出てこなくて心が折れそうです。

どうぞ宜しくお願いいたします。

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

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

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

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

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

guest

回答4

0

この||は、if文の代わりです。||は、左側がtrueとされる値だと右側が実行されないので、ifの代わりにもなります。

javascript

1// これと同じ意味 2if(!move.endTime) move.endTime = Date.now() + 2000;

また、moveは関数オブジェクトですが、JavaScriptのオブジェクトには勝手なプロパティを追加することもできます。move.endTimeも勝手に追加したプロパティで、特に固有の意味はありません。もっとも、外側で変数を宣言したほうがわかりやすいとは思います。

投稿2018/02/15 05:16

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2018/02/15 06:18

ありがとうございます!!
guest

0

ベストアンサー

すぐ横にかいてありますね。

move.endTime = Date.now() + 2000

の個所でmove.endTimeが発生しています。

よくJSの書き方で

let a = b || 1

みたいな書き方を見たことがないでしょうか?

上記の場合 bが定義されていればbの値がaに入り、無ければ 1を設定するという意味になります。

したがって

move.endTime || (move.endTime = Date.now() + 2000);

はmove.endTimeが存在しなければ(move.endTime = Date.now() + 2000)を実行することで

move.endTimeDate.now() + 2000) の結果が代入されます。

投稿2018/02/15 05:13

m0a

総合スコア708

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

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

退会済みユーザー

退会済みユーザー

2018/02/15 06:19

ありがとうございます!!
guest

0

等価なコードはこんな感じ.

JavaScript

1if(!move.endTime){ 2 move.endTime = Date.now() + 2000; 3};

演算子||は先に左の式を評価して「偽」と判定されたら次に右の式を評価し, その結果からtrueもしくはfalseを返します. 今回は式を実行することに意義があるので, 戻り値を使っていません.

投稿2018/02/15 05:18

defghi1977

総合スコア4756

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

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

退会済みユーザー

退会済みユーザー

2018/02/15 06:19

ありがとうございます!!
guest

0

||論理演算子に分類されるORです。
これはC言語由来でして、論理演算子は多くの言語が||はOR、&&はANDという感じで採用しています。

JavaScriptに於いて、論理のORはa || bという書き方をします。
左から順番に確認していきます。

なお、a || b || cという風に3つ以上の値を繋げて書く事も可能です。

※これはJavaScript特有の動作であり、他の言語は挙動が違う可能性があります。
例えばPHPでは、OR演算子が出てきた時点で最終的に帰ってくる値はBoolean固定になりますので、値の初期化処理のつもりでこの書き方をすると、いつの間にかBoolean値に変換されてしまい思わぬバグの原因になる事もあります。

move.endTime || (move.endTime = Date.now() + 2000);

処理を行う方向にもってきましたかー…
OR演算子を使って処理を書くことも可能ですが、
これは少々お行儀が良くないのでプロジェクトによっては禁止される事もあります。

endTime

maisumakunさんが仰るように、オブジェクト・配列・関数は全てObjectというものから派生したもので、
好き勝手にプロパティを宣言して値を格納することが出来ます。
(Array.length等、既に名前が予約されていて使えないものもあります)

これもお行儀が良くないですね。


もし私が書くとしたら、
こんな感じに平易な書き方にしますかね。
あ、アニメーションでsetTimeoutはカクカクの糞アニメになるのでrequestAnimationFrameに差し替えてます。

JavaScript

1onload = function() { 2 var e = document.getElementById("e"); 3 var length = 2000; 4 var end = Date.now() + length; 5 var move = function () { 6 var progress = 1 - (end - Date.now()) / length; 7 e.style.left = e.style.top = (100 * Math.min(1, progress)) + "px"; 8 if (progress < 1) { 9 requestAnimationFrame(move); 10 } 11 }; 12 move(); 13};

投稿2018/02/15 10:52

編集2018/02/15 11:01
miyabi-sun

総合スコア21158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問