みこむらめもむらむらむら

なんかHTML5とかJS勉強とかやりながらめもを綴るブログ

【JavaScript】演算子①

引き続き!
今回は演算子
これはftlとかvmとかでちょいちょい使っていたから
ちょっとはわかると思うのだが‥

演算子の基本

一応メモ

算術演算子

代数演算子ともいう、ほう、こっちはきいたことない
標準的な四則演算をはじめとして、数学的な演算を行う

  • +
    • 数値の加算
    • 例>> 3 + 5 //8
  • -
    • 数値の減算
    • 例>> 10 - 7 //3
  • *
    • 数値の乗算
    • 例>> 3 * 5 //15
  • /
    • 数値の除算
    • 例>> 10 / 5 //2
  • %
    • 数値の剰余
    • 例>> 10 % 4 //2
  • ++
    • 前置加算
    • 例>> x = 3; a = x++; //aは3
  • ++
    • 後置加算
    • 例>> x = 3; a = ++x; //aは4
  • --
    • 前置減算
    • 例>> x = 3; a = x--; //aは3
  • --
    • 後置減算
    • 例>> x = 3; a = --x; //aは2

ふむ、なんとなくそれぞれわかります
注意すべき点もチェック

加算演算子

加算演算子の挙動はオペランドのデータ型によって異なる

document.writeln(10 + 1);  //11
document.writeln('10' + 1);  //101
var today = new Date();
document.writeln(1234 + today);  //1234Sun Jan 15 10:34:33 UTC+0900 2012

オペランドが両方数値⇒問題なく加算
片方が文字列⇒文字列連結演算子になる
オペランドの片方がオブジェクト⇒オブジェクトの要素の形式によって処理を行う
うむ、例だと文字列形式になるから
文字列連結演算子扱いなのね、なるほどなるほど

インクリメント演算子(++)とデクリメント演算子(--)

オペランドに対して1を加算/減算する‥
x++はx+1と一緒、ふむ、そうですね

ただしほかの変数に代入する場合は注意、ほう

var x = 3;
var y = x++;
document.writeln(x);  //4
document.writeln(y);  //3
var x = 3;
var y = ++x;
document.writeln(x);  //4
document.writeln(y);  //4

インクリメント処理が先か代入が先かっていうことね、ふむ

少数点を含む計算には要注意

document.writeln(0.2 * 3);  //0.6000000000000001

JSが数値演算を2進数で行うための誤差がでる、ほう‥

document.writeln(0.2 * 3 === 0.6);  //false

小数点を含む場合の演算や
値の比較を行う際は下記に注意

  1. 値を一旦整数にしてから演算する
  2. 1の結果を再び小数点数に戻す
document.writeln(((0.2 * 10) * 3) / 10);  //0.6
document.writeln((0.2 * 10) * 3 === 0.6 * 10);  //true

値を何倍にするかは有効桁数によって決めるそうな‥ほう‥
で、なんなの有効桁数ってw

0ではない数字に挟まれた0は有効である
0ではない数字より前に0がある場合、その0は有効ではない
小数点より右にある0は有効である

  • 39008 は有効数字5桁である
  • 0.012 は有効数字2桁である
  • 35.00 は有効数字4桁である

なるほどWikipediaさんありがとう

で、話を戻すと
"値を何倍にするかは有効桁数によって決める"というのは
0.2351という小数点数で小数点以下2桁まで保証したいなら

  1. 100倍して23.51としたものを演算する
  2. 最終的な結果を小数点以下で四捨五入する
  3. 2の結果を再び小数点数に戻す

という形で処理をするべし

これはなんでなんだろ‥明日きいてみる

代入演算子

  • =
    • 変数などに値を代入する
    • 例>> x = 1 //1
  • +=
    • 左辺の値に右辺の値を加算したものを代入する
    • 例>> x = 3; x += 2 //5
  • -=
    • 左辺の値から右辺の値を減算したものを代入する
    • 例>> x = 3; x -= 2 //1
  • *=
    • 左辺の値に右辺の値を乗算したものを代入する
    • 例>> x = 3; x *= 2 //6
  • /=
    • 左辺の値を右辺の値を除算したものを代入する
    • 例>> x = 3; x /= 2 //1.5
  • %=
    • 左辺の値を右辺の値を除算した余りを代入する
    • 例>> x = 3; x %= 2 //1
  • &=
    • 左辺の値を右辺の値で論理積演算した結果を代入する
    • 例>> x = 10; x &= 5 //0
  • |=
    • 左辺の値を右辺の値で論理和演算した結果を代入する
    • 例>> x = 10; x |= 5 //15
  • ^=
    • 左辺の値を右辺の値で排他的論理和演算した結果を代入する
    • 例>> x = 10; x ^= 5 //15
  • <<=
    • 左辺の値を右辺の値だけ左シフトした結果を代入する
    • 例>> x = 10; x <<= 1 //20
  • >>=
    • 左辺の値を右辺の値だけ右シフトした結果を代入する
    • 例>> x = 10; x >>= 1 //5
  • >>>=
    • 左辺の値を右辺の値だけ右シフトした結果を代入する
    • 例>> x = 10; x >>>= 1 //5

&=以降のビット演算子と連動した辺りが
バカな私には難しい
ていうかビット演算子がわかりにくい
検索でなんとか解決

x ●= y;  //これと
x = x ● y;  //これは同じこと

なーるほどね!
特に変数自身に対する演算の結果を
もとの変数に書き戻したい場合に
代入演算子を利用すれば
式をシンプルに記述できる、ほっほーう!はあく!

基本型と参照型による代入の違い

おおきたこれ!
今日昼に説明受けたところですね

var x = 1;
var y = x;
x = 2;
document.writeln(y);  //1

まず基本型の場合
直観的にわかる
変数xをyに引き渡す場合、その値がコピーされる
うん、そうだと思った!
これ、値渡しというそうな
既にyに値をコピーしているから元のxをあとから変更しても
既に値を代入済みのyには影響がない

それでは次、参照型だとどうなるか

var ary1 = [0, 1, 2];
var ary2 = ary1;
ary1[0] = 5;
document.writeln(ary2);  //5, 1, 2

1行目で配列リテラルを変数ary1にセットして
2行目でそれをary2に代入している
3行目でary1の要素を変更した結果
ary2の数値も変更されている

えっとどういうことかというと
値そのものを格納したのでなく
値が格納されているアドレスだけを変数に格納している
あくまでary2に入っているのはary1に格納されているアドレスだけ
こういうのを参照渡しというらしい
説明受けてたからめっちゃわかる!うれしいw






記事が長くなってきたので
比較演算子からは次に