JavaScriptについてなかなか覚えられないので、色々と書きなぐっていきます。

入門②

■NumberクラスのtoStringメソッド
NumberクラスのtoStringメソッドはオーバーライドされており、
↓のように書くと、数の表記法を変えられる

(256).toString(16); // ff



■配列型を表すArrayクラス

var array = new Array();
array[0] = 1;
array[2] = 2;

↑は
var array = [1,,2];
と同じです

console.log(array.length); // 3
※Arrayクラスをtypeofメソッドで型チェックすると「object型」が返ってきます



■オブジェクトを配列のように扱う
var obj = {a:1, b:2, c:3};
console.log(obj['b']); // 2

上記のように配列のようにプロパティにアクセス可能



■オブジェクトの内容を走査や調べるとき
1.for-in文
for(Index in 対象のオブジェクト) {}

ex)
var obj = {a:1, b:2};
for(var i in obj) {
console.log(i + ' ' + obj[i]);
}


2.in演算子
 ~プロパティ名とオブジェクトを指定すると、
  プロトタイプチェーンを辿って、プロパティが含まれている場合にtrueを返す~

ex)
var obj = {a:1, b:1};
console.log('a' in obj); //true
console.log('c' in obj); //false


3.hasOwnPropertyメソッド
 ~オブジェクト自身にプロパティがあるかどうか判断する。
  hasOwnPropertyメソッドは、in 演算子と違い、プロトタイプチェーンを辿ってチェックしない~

ex)
o = new Object();
o.prop = 'exists';

function changeO() {
o.newprop = o.prop;
delete o.prop;
}

o.hasOwnProperty('prop'); // true を返す
changeO();
o.hasOwnProperty('prop'); // false を返す



■for-in文はすべてのプロパティを走査してしまうので、
 配列を調べたいときは後者のfor文を使う

var array = [1,2,3];
array.a = 10; // 配列とは関係の無いプロパティ
for(var i in array) {
console.log(i + ':' + array[i]);
}
for(var i = 0; i < array.length; i++) {
console.log(i + ':' + array[i]);
}

※コンソール出力
0:1
1:2
2:3
a:10 ← 配列以外のプロパティも走査してしまう
0:1
1:2
2:3



■Functionオブジェクト(alertやconsoleなどを含む関数型)は
 データであると同時に実行することができる(処理を変数に格納できる点でJavaと異なる)

○Functionの定義方法(4つ)
ⅰ.Functionクラスによる生成
new Function(引数のリスト, 処理内容);

ex.
var func = new Function('a,b', 'return a+b;');
alert(func(1,2)); // 3


ⅱ.関数定義による生成
function 識別子(引数,引数); { return 処理 };

ex.
function func(a,b) {
return a+b;
}
alert(func(1,2)); // 3


ⅲ.関数リテラルによる生成(識別子を省略)
function(引数,引数) { 処理 };

var func = function(a,b) {
return a+b;
};
alert(func(1,2)); // 3


ⅳ.関数を即座に実行する
関数リテラルで関数を定義した直後に引数を指定すると即座に実行される

ex.
var func = function(a,b) {
return a+b;
}(1,2);
alert(func); // 3


■正規表現型の生成
1.RegExpクラスによる生成
var re = new RegExp('.*\.txt');

2.正規表現リテラルによる生成
var re = /.*\.txt/;


■正規表現型の利用
ⅰ.RegExpクラスによる生成

ex)
var re1 = new RegExp('.*\.txt');
console.log(re1.test('test.txt')); // true
console.log('test.txt'.match(re1)); //['test.txt']

※一致した文字列が含まれているかどうかを調べるRegExp#test
 一致した文字列を返すString#match(RegExp)

※RegExpクラスによる生成は実行時に評価されるのに対して、
 正規表現リテラルによる生成はスクリプト開始に評価される
 (→パターンが動的に変わる場合はRegExpクラスで生成)
 

☆応用例(Stringクラスを拡張)
String.prototype.escapeHtml = function() {
return this.replace(/&/g, '&')
.replace(/ .replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
};
var str = '
a
'
console.log(str.escapeHtml()); // <div>a</div>


■数値型を文字列に変換するテクニック
var num = 12;
num += ' ';
console.log(typeof(num)); //String


■文字列を数値型に変換するテクニック
var num = '12';
num -= 0;
console.log(typeof(num)); //number