読者です 読者をやめる 読者になる 読者になる

JavaScript本格入門を読む・3

3-5.Objectオブジェクト

toString/valueOfメソッド
var obj = new Object();
document.writeln(obj.toString());
document.writeln(obj.valueOf());

var dat = new Date();
document.writeln(dat.toString());
document.writeln(dat.valueOf());

var ary = ['apple','lemon','banana'];
document.writeln(ary.toString());
document.writeln(ary.valueOf());

var num = 10;
document.writeln(num.toString());
document.writeln(num.valueOf());

var reg = /[0-9]{3}-[0-9]{4}/g;
document.writeln(reg.toString());
document.writeln(reg.valueOf());
constructorプロパティ
var data = [];
if(typeof data == 'object' && data.constructor == Array){
document.writeln('変数dataはArrayオブジェクトのインスタンスです');
}

これ、書けたけどどういうことだってばよ。
前やったtypeof演算子は「Object」しか返さない→そのためにconstructorプロパティ!
→とはいえ、document.writelnで書いてるやんけ、と思ったんだが。

constructorプロパティは戻り値としてインスタンスの生成に使用されたコンストラクタ(Functionオブジェクト)を返します

???関数がわかればわかるのかな。

Globalオブジェクト
var n = '123xx'
document.writeln(Number(n));
document.writeln(parseFloat(n));
document.writeln(parseInt(n));

var d = new Date();
document.writeln(Number(d));
document.writeln(parseFloat(d));
document.writeln(parseInt(d));

var h = '0777'
document.writeln(Number(h));
document.writeln(parseFloat(h));
document.writeln(parseInt(h));

var e ='1.01e+2'
document.writeln(Number(e));
document.writeln(parseFloat(e));
document.writeln(parseInt(e));

ここまで来て思ったけど、こういうので何が出来るか、を知ることがもしや大事なのか

var str = '!"#$%&()+-*/@~_|;:,.';
document.writeln(encodeURI(str));
document.writeln(encodeURIComponent(str));

これめっちゃ便利そう〜!(イメージ)decodeURIで元の文字列にデコード出来る(メモ)

4.関数

function命令
function triangle(base,height){
return base * height / 2;
}
document.writeln('三角形の面積なの' + triangle(5,2));
Functionコンストラクタ
var triangle = new Function('base', 'height', 'return base * height /2;');
document.writeln('三角形の面積なのよ' + triangle(5,2));

こっちはさんざん書いたおかげでなじみがあるな!

関数リテラル表現
var triangle = function(base,height){
return base * height /2;
};
document.writeln('三角形の面積なのだ' + triangle(5,2));

関数定義における4つの注意点

JavaScriptでは文末にセミコロンをつけることが好ましいが、「必須ではない」

ええーと思ってしまった。確かにそういうエラーは出なかったが、これ整形しにくいなぁ

変数はどの場所から参照できるか?スコープ

グローバル変数→関数の外で宣言した変数
ローカル変数→関数の中で宣言した変数

var scope = 'niconico'
function getValue(){
var scope = 'ニコニコ動画';
return scope;
}
document.writeln(getValue());
document.writeln(scope);

変数宣言にvar命令は必須
var命令を使わずに宣言された変数はすべてグローバル変数
ローカル変数を定義するには、必ずvar命令を使用する

var value = 10;
function decrementValue(value){
value--;
return value;
}
document.writeln(decrementValue(100));
document.writeln(value);
var value =[1,2,4,8,16];
function deleteElement(value){
value.pop();
return value;
}
document.writeln(deleteElement(value));
document.writeln(value);
関数リテラル/Fnctionコンストラクタにおけるスコープの違い
var scope ='niconico'
function checkScope(){
var scope = 'ニコニコ';

var f_lit = function(){ return scope; };
document.writeln(f_lit());
var f_con = new Function('return scope;');
document.writeln(f_con());
}
checkScope();

関数の3つの記法は必ずしも意味的に等価ではない

4-4.引用情報を管理する

JavaScriptは引数の数をチェックしない
function showMessage(value){
if(arguments.length != 1){
throw new Error('引数の数が間違っているよ' + arguments.length);
}
document.writeln(value);
}
try {
showMessage('山田','鈴木');
} catch(e){
window.alert(e.message);
}

windowアラートが出ると、チェックするかんじするなぁ

可変長引数の関数を定義する
function sum(){
var result =0;
for (var i =0; i< arguments.length; i++){
var tmp = arguments[i];
if(isNaN(tmp)){
throw new Error('指定値が数値じゃないよ' +tmp);
}
result += tmp;
}
return result;
}
try{
document.writeln(sum(1,3,5,7,9));
} catch(e){
window.alert(e.message);
}

途中間違えたら、アラート出てきてちょっと嬉しい。

明示的に宣言された引数と可変長引数を混在させる
function printf(format){
for (var i = 1; i<arguments.length; i++){
var pattern = new RegExp('\\{' +(i - 1)+ '\\}', 'g');
format = format.replace(pattern,arguments[i]);
}
document.writeln(format);
}
printf('こんにちわ、{0}さん。私は{1}です。','redcat1113','金子');

確かに何をしたいか直感的にわかりにくい!!
見た目でわからないという・・・

再起呼び出しを定義する
function factorial(n){
if (n != 0) { return n * arguments.callee(n - 1); }
return 1;
}
document.writeln(factorial(5));

これ、if以下の半角スペースで躓いてしまった・・・
エディタの設定で半角スペース表示させるようにしたぜ!
はー難しい。

4-5.高度な関数のテーマ

「まず基本だけを修めたい」という方はスキップしても構いません

じゃあ余裕でスキップさせていただきます!!!(やる気なし)
慣れてきたのか書くのが早くなってきたし、エラー出た後に間違いに気づくのも早くなってきた。
やっぱ実際に書くの大事だな。
明日は、「大規模開発でも通用する書き方を身につける」だけど、身につける必要あんのかな、と始める前から懐疑的だぜ!