JavaScriptの文字列で表現された数値と数値の演算

JavaScriptの式では型変換が自動的に行われる。文字列に対して文字列数値、数値、数値に対して文字列を追加した場合はどれも連結として処理される。

var res = 'hello' + '2';
var res2 = 'hello' + 2;
var res3 = 2 + 'hello';
console.log(res);
console.log(res2);
console.log(res3);
// hello2
// hello2
// 2hello

数値と文字列数値の加算についてはどうなるか。結果は結合となった。ただし除算になれば文字列数値は数値に変換されて演算された。

var res = 2 + '2';
var res2 = '2' + 2;
var res3 = '2' - 1;
console.log(res);
console.log(res2);
console.log(res3);
// 22
// 22
// 1

したがって数値として計算させたい時、それが厳密な計算であれば、文字列で数値が渡される可能性がある時、数値型に変換を行って処理をするのが望ましい。

オペランドの意味

コンピュータプログラミングにおいて、演算の対象となる値や変数のこと。「被演算子」と訳されることもある。

演算内容をあらわす記号などは「演算子」または「オペレータ(operator)」という。例えば「A+10」という式では、「A」と「10」がオペランドで、「+」がオペレータである。機械語アセンブリ言語では、命令の対象となるレジスタや値などをオペランドと呼ぶ。

出典 : オペランドとは 【 operand 】

JavaScriptのホイスティング

JavaScriptのホイスティング(巻き上げ)を体験する。JavaScriptでは関数スコープというものを使って変数を宣言するが、関数内のどこで宣言された変数でも関数内であれば既に宣言されているということにるらしい。

var foo = 'global';
(function() {
console.log(foo);
var foo = 'local';
console.log(foo);
})();
console.log(foo);
// undefined
// local
// global

このように宣言時に代入される文字列こそ取得できないものの、既に変数が宣言されているのと同様の結果を得られる。

変数は宣言しただけではundefinedになる

var foo;
console.log(foo);
// undefined

JavaScriptのグローバル変数と同名の変数を関数内のローカル変数で定義する

JavaScriptグローバル変数を関数内などのローカル変数で定義するとローカル変数が優先される。この時ローカル変数がグローバルスコープになるということはなく、ローカルスコープのままである。

var global = 10;
var func = function(global) {
return global;
}
console.log(func(20));
// 20
console.log(global);
// 10

JavaScriptの==と===の比較

JavaScriptの比較には=====がある。==は型変換を行う比較で===は型変換を行わない厳密な比較である。PHPにもどうようの演算子があるが同じような感じである。試しにいくつかのパターンで調査してみる。

数値と文字列の比較

console.log('0' == 0);
// true
console.log('0' === 0);
// false

nullとundefinedの比較はどうか

console.log(null == undefined);
// true
console.log(null === undefined);
// false

trueとfalseの比較はどうか

console.log('0' == false);
// true
console.log('0' === false);
// false
console.log(0 == false);
// true
console.log(0 === false);
// false
console.log('1' == true);
// true
console.log('1' === true);
// false
console.log(1 == true);
// true
console.log(1 === true);
// false

JavaScriptの文字列はオブジェクトではない

JavaScriptの文字列はオブジェクトではないが、string.replace()のようにメソッドが使える。これはreplace()を参照した時に文字列をオブジェクトに変換してString(string).replace()と同じ処理をさせているからだそうだ。

var text = 'Hanako Yamada';
console.log(text.replace(/Hanako/, 'Hanao'));
console.log(String(text).replace(/Hanako/, 'Hanao'));
// Hanao Yamada
// Hanao Yamada

これら一時的に生成されるオブジェクトのことをラッパーオブジェクトと呼ぶそうだ。オライリーで読んだ。