[Avascript]Cと比較学習するJavascript(1)



本日の学習資料:JAvascript 5-javascriptの基本構文
C言語を中心にアルゴリズムを解いてから初めてJavascriptに触れると「不思議」と感じます.初めて物事や現象を見たとき、不思議に思うために、同じカテゴリの類似のものを経験した後、同じカテゴリで別のカテゴリを経験したとき、両者の違いを感じて不思議に思います.
C言語と似ていて、嬉しい文法もありますが、Javascriptの個性を感じているところでも、同じように「不思議」な感じがします.
Javascriptを勉強しているうちに、「不思議」を感じながら勉強すると、もっと感銘を受けます.まだ高-五級用語に慣れていないので、コリンの立場に立って粗浅な比較をしたいと思います.やはり達人達の非難を期待します
(この記事では、バニラコード学習ガイドによって推奨されるPoiemawebのJS構文の内容を学習し、作成します.👀)
1.Javascriptの変数は、割当値によって動的に決定されます.
JSの変数はC言語と異なり,変数を宣言する際に予めデータ型を設定するのではなく,変数に割り当てられた値によって変数の型が動的に決定される.Cの場合、int、char、string、doubleの形式でデータ型と変数に割り当てられるメモリサイズを設定できますが、JSは指定した値のタイプで変数のタイプを決定します.
したがって、Cは任意のタイプの演算子を使用する必要はありません.
var type = typeof 'Hi!' // string 
string str = 'Hi!'
最初から『もち』と書いてありましたまた、Cは変数のタイプを静的に固定するため、鋳造が行われることが多い.
char ch = 'a'
int num = (int)('a');

Javascriptは、動的にタイプを決定するように、割り当てられた値に基づいてメモリを動的に割り当てます.これらの特性では,JSはより柔軟な暗黙的変換を用いる.
var foo = 1 + '10'; // '110'
var bar = 1 * '10'; // 10
JSでは、これらの演算を強制的なタイプの暗黙的な変換で実行できるため、「不思議」と感じるかもしれません.
2.JavascriptオブジェクトがCに似ている構造体
var person = {
  name: 'Lee',
  gender: 'male',
  sayHello: function() {
    console.log('Hi! my name is' + this.name);
  }
}
console.log(typeof person); // object
console.log(person.name); // 'Lee'
console.log(person.sayHello()) // Hi! My name is Lee
もちろんC++のclassの方が似ていますが、筆者は構造体に詳しいので、構造体として比較します.上のコードはJS標準コードです
#include <iostream>
#include <string>
using namespace std;
struct person {
	string name = "Lee";
	string gender = "male";
};
void sayHello(person name) {

	cout << "Hi! My name is" << " " << name.name;
	
}

int main() {

	person Suh;
	cout << Suh.name << '\n';
	cout << Suh.gender << '\n';
	sayHello(Suh);

	return 0;
}
これはJSにおけるオブジェクト概念とよく似ている.
Cのプロセス指向性における構造体の発展に伴い,オブジェクト指向言語C++とJSにおけるobjectとclassの概念が確立されているようである.
(ソース:リンクからアクセスすると、より深いC++とJSの比較が表示されます.https://doitnow-man.tistory.com/129)
3.有効範囲の違い:Block-level scopeとFunction-level scope
C言語では、変数宣言は通常block-level scopeに位置合わせされ、簡単に言えば、コードブロックが括弧"{}"に積み上げられていることを意味する.例えば、ifのブロック、forのブロック関数のブロック、これらはすべて共通です.
#include <iostream>
using namespace std;
//1. 모두를 아우르는 전역변수
int num = 1;
void run() {

	int num = 8;

}
int main() {
	//2. For문의 세계에서의 num
	for (int i = 0; i < 10; i++) {
		int num = 3;
	}
	//3. run함수의 세계에서의 num
	run();

	return 0;
}
C言語では、各世界の変数はブロック単位(すなわち、各世界の変数)で厳密に分離される.numという変数は世界ごとに異なる顔をしている.
ただし、JSのFunction-level scopeでは、関数でvarとして定義された変数が実行されると、文以外でもその操作が実行されます.すなわち、関数では、追加の宣言を必要とせずにfor文のほかに変数を使用することもできます.
function main() {
	for (int i = 0; i<3; i++) {
      var temp = 'hi';
      /*do something*/
    }
  console.log(temp);
}
上のソースコードは「Ozzigorigo AlphagoポケモンGo」の説明リンクを参照しています.
オジゴ、アルファゴ、ポケモンゴの補足説明を見てみると、もっと理解できます.(ニックネームのような説明ありがとうございます🙏)
最も驚くべきことに、グローバル変数さえ上書きされます.
function main() {
	var name = "yudoomack";
	var names = ['kim', 'lee', 'park'];

	for (var i = 0; i<names.length; i++) {
		var name = names[i];
  		if (name === 'kim') {/*do something*/}
	}
  	console.log(name);
}
Cのheavy userたちは慣れていないかもしれませんが、nameにはyudomack、kim出力が覆われています.
「Ogego」のブログを見ると、この場合、コラボレーション時や外部jslibraryに読み込んで使用すると、グローバル変数が影響を受け、致命的になる可能性があります.🌲Javascriptドリームツリー🌲 これらの現象については、「存在」と「露出」をさらに学び、防止方法を理解します.