JavaScript のスコープを理解する - tacamy.blog http://tacamy.hatenablog.com/entry/2012/12/30/191125

JavaScriptにはグローバル変数とローカル変数がある.

JavaScriptのローカル変数のスコープ(ある変数が有効な範囲)は関数スコープとなる.

C言語などと違い,制御文(ifやforなど)の中括弧ブロック{}の中で宣言された変数は,中括弧ブロックの外からも参照できる.

function sayHello(){
	if(1){
		var hello = "hello!";
	}
	console.log(hello);
}
sayHello(); // => hello!!

グローバル変数とローカル変数で同名の変数があると,ローカル変数が参照される.

var hello = "global_hello";
function sayHello(){
	var hello = "local_hello";
	console.log(hello);
}
sayHello(); // => local_hello

では,以下のようなコードでは何が出力されるだろう?

var hello = "global_hello";
function sayHello(){
	console.log(hello);
	var hello = "local_hello";
}
sayHello();

直感的には,console.log()でhelloを参照する時,sayhello関数のローカル変数helloはまだ宣言されていないので,グローバル変数helloの値"global_hello"が出力されるのではと思える.

実際には,undefinedが出力される.

JavaScriptでは関数内で宣言された変数は関数全体で有効となる.

しかし,初期化処理自体はその文が実行されるまで有効とならない.

これを巻き上げ(ホイスティング)と呼ぶらしい.

Google日本語入力が"ほいすてぃんぐ"を変換すると誤字だと認識して"ホスティング"と変換しようとするので厄介.

JavaScript - 型変換のいろいろ - Qiita

オライリーのJavascirpt本の54/821ページあたりを読んでいる.

JavaScriptは動的に型を変換する.

空の文字列は,数値型に変換すると0に変換される.

var empty = ""; // 空の文字列
console.log(Number(empty)); // 0 :これはNumber関数で数値に変換
var hoge = empty - 0; // emptyは動的に数値に変換されて計算される
console.log(hoge); // 0
console.log(typeof hoge); // number

+演算子だと,数値の方が文字列になって結合される.

var huga = empty + 0;
console.log(huga); // "0"
console.log(typeof huga); // string 

オブジェクトを数値に変換するとき,まずvalueOfメソッドを使い,プリミティブ型に変換する.変換できなかった時,toStringメソッドを使いプリミティブ型に変換し,それを数値型に変換する.

var array = [];
console.log(array.valueOf()); // [all: function] : オブジェクトが返される
console.log(array.toString()); // ""(空の文字列)

なので,空の配列で数値計算を行うと,toStringメソッドで空の文字列""に変換された後,空の文字列""が数値0に変換される.

var array = [];
console.log(array - 10); // -10 

配列が空じゃない時の動作.複数要素が入った配列で数値計算すると怒られる.

"2,3"とかは動的に数値型に変換できないため.

var array2 = [2];
console.log(array2 - 10); // -8

var array3 = [2,3];
console.log(array3.toString()); // "2,3"
console.log(array3 - 10); // NaN

43

JavaScriptにはプリミティブ型とオブジェクト型がある.

九章第七回 プリミティブとオブジェクト — JavaScript初級者から中級者になろう — uhyohyo.net

JavaScript プリミティブ型 (基本データ型)

プリミティブ型のうち,数値,文字列,真偽値には,ラッパーオブジェクトがある.

プリミティブ型の値がプロパティやメソッドを呼び出した時,内部的には一時的にラッパーオブジェクトが呼び出され,そのオブジェクトのプロパティやメソッドを参照している.

var text = "texttext";
console.log(text); // texttext
console.log(text.length); // 8

ラッパーオブジェクトをわざわざ呼び出す方法もある.

var text2 = new String("text2text2");
console.log(text2); // String {0: "t", 1: "e", 2: "x", 3: "t", 4: "2", 5: "t", 6: "e", 7: "x", 8: "t", 9: "2", length: 10, [[PrimitiveValue]]: "text2text2"}
console.log(text2.length); // 10

プリミティブ型が内部的に生成したラッパーオブジェクトは使い捨てらしい.

var text = "texttext";
text.abc = "abc";
console.log(text.abc); // undefined

var text2 = new String("text2text2");
text2.abc = "abc";
console.log(text2.abc); // abc

逆にラッパーオブジェクトで演算する時はプリミティブ型になるらしい.

text4 = text2 + text2;
console.log(text4); // text2text2text2text2

↑このページのトップヘ