2017年3月18日土曜日

JavaScriptの変数と型、値

勉強の為に引用しました。
http://qiita.com/lrf141/items/ff1fa4741e4cd612b128

に更新
3
 この記事は最終更新日から1年以上が経過しています。

javascriptでの変数と型、値

変数とはプログラム中の値を保持して置くためのものです。
JavaScriptでの変数とは一般的に
var [name] = [value];
var [name];//[name]は変数名、[value]は値に置換
と定義する。
そしてJavaなどの言語と同様に基本型とオブジェクト型が存在します。

JavaScriptにおいて、基本型とは何か

データ型の定義をvarで済ませてしまうのでわかりにくいのですが
  • 数値(1,2,3.14 ....)
  • 文字列("hello,world")
  • 論理型(true,false)
が基本型として挙げられます。
そして最も注意しなければならない事は、nullやundefindと言った特殊な方が実は基本型であるということです

それならオブジェクト型とは何か

ざっくりと説明すれば、「基本型以外です」
ここで重要なのはオブジェクト型とは何かということではなく、オブジェクトが「プロパティの集合体である」という点です。
プロパティには基本型やオブジェクトを格納することができます。また配列や関数もオブジェクト型であることに注意してください。
そして1つの例として以下の記述が挙げられます
var me = new Object();//オブジェクト型の生成

//プロパティ名とプロパティ値の代入
me.name = "Mr.X";
me.age = 20;
me.alive = true;

//出力
console.log(me);



//関数もオブジェクト型なので関数をプロパティ値として扱える
me.getAge = function(){
    return me.age;
};

console.log(me.getAge());



//無名関数を使って以下のようにも書ける
var people = function(name,age,living){
    this.name = name;
    this.age = age;
    this.living = living;
}

var you = new people("Ms.X",22,false);
上記の例で気がついたかもしれませんが、同じオブジェクト型の配列には順番があるが
例で取り上げたオブジェクトには順番がありません。
実は順番が無いのがオブジェクト型の特徴であって、配列は特殊なオブジェクト型と考えます。
そして注意すべきは関数をオブジェクトとした時です。
関数は他のオブジェクト型と違って、振る舞いをつまり何かしらの処理を持ちます。
さっきの例でも示したように
var you = new people("Ms.X",22,false);

と言った記述で変数をオブジェクト型としプロパティを代入しました
そしてnew演算子で代入されたpeopleという関数をコンストラクタと言います。
またコンストラクタはオブジェクトのクラスとなります。
javascriptではクラスをjavaなどのオブジェクト指向言語のように明確に定義できませんが
一般的に、コンストラクタを使って初期化されるオブジェクトのまとまりのことです
var array = new Array();
var today = new Date();

といったものがクラスとオブジェクト、コンストラクタとしてわかりやすい例です
実は知らないうちにつかっていたり...

数値、文字列、論理型、そしてnull,undefind

数値とは

数値とは一般に整数や小数点を含む、ざっくり言えば数字です。
また進数も扱うことができます。
あまり関係ありませんが用語として、プログラム内で定義された整数を整数リテラルと呼んだりします
それと進数で特に8進数はサポートされていなかったりするので利用には注意が必要です
ただしstrictモードでは使えません。
そして地味に大切なのが浮動小数点、つまり小数を含むリテラルです
一般的に、変数宣言と同様に定義できますが
累乗の形の時に注意が必要です。
説明するより以下のコードで例を示します
var num = 2.00e10;//これで2の10乗と同値
num = 2.00E10 //eは大文字でも問題ない
var num2 = 2.00e-10//これで2の-10乗と同値
ここで注意が必要なのは数字を小数点第2位まで記述する必要があるのです
浮動小数点なので、eの前に数字を定義するとき整数で定義するとコンパイルエラーになります。
もう一点注意が必要なのは、小数点を含む数の誤差についてです。
これまで紹介したもの以外にも、絶対値や三角関数、対数などもMathクラスを使うことで表現できますがここでは紹介しません
ただ無限大と0だけは注意が必要なので少しだけまとめます。
高校数学で数学Ⅲをとったことのある人には馴染みのある無限大ですが、これはJavaScriptでも扱うことができます。
そういった知識がある人がつまずくかもしれない点があるので以下のコードを参照してください
var inf = Infinity;//正の無限大
var inf_m = -Infinity;//負の無限大

var num = 1/0;//これも正の無限大
var num2 = -1/0//これも負の無限大

/*javascriptではなぜか分母0の数字が無限大になります*/

var num3 = 0/0; //分母0だけどこれはNaN
var num4 = 0;
var num5 = -0;//こっちは負のゼロ

//num4 === num5 これはtrue
// 1/num4 === 1/num5 これは無限大の符号が違うのでfalse
//極限や発散を考えるとわかりやすい

文字列

文字列とは以下のようにシングルクォーテーションやダブルクォーテーションで囲まれた文字の集まりのことです。
var str = "hello,world";
var str2 = 'this is js';

これ自体は簡単です。そしてエスケープシーケンスと呼ばれるものも他の言語と大差ありません。
しかし、javascriptでは変数のデータ型が宣言時にvarで統一されているため、データ型に関してはかなり緩いです。
そのため数値などと結合してもエラーになりません。
var num = 10;
var str = "number";

var result = num+str;//エラーにはならない

文字列には、数値でいうようなMathクラスが持つメソッドを使うように
インスタンスを取らなくても、いろいろなメソッドが用意されています。
詳しくはリファレンスを参照してください
ここで示したように文字列は比較的容易に扱うことができます。

論理型

論理型と聞くと、難しそうと思いますが極端に言えば正しいか、間違っているかです
数学的に言うなら、真か偽か
英語ならtrue or falseです
それで、javascriptではこう記述します
var judge = true;//真を定義

if(judge){
    //真なら
    document.write("true");
}else{
    //偽なら
    document.write("false");
}

これで論理型は終わりです。

null,undefind

nullやundefindは最初に言ったように特殊な基本型です。
ですが不思議なことにnullを定義した変数にtypeofを用いると何故か"object"と返ってきます。
本来nullはオブジェクトが存在しない事を示します。
またオブジェクト以外にも基本型、これに値が無いことを示すにもnullは使えます
ただし文字列のから文字とnullは全くの別物です
そして問題のundefind。
これは少しだけ厄介なものです
というのも、undefindは未定義を示すからです
値は存在しないが、未定義という意味なのです
例えば、初期化されていない変数などが当てはまります。
ただし未定義でも値は存在しないので
null == undefind //これがtrueになります
また存在しないことから特にオブジェクト型変数のプロパティにアクセスするとtypeErrorになります。
この点には注意が必要です。



0 コメント:

コメントを投稿