いい質問だといった手前、頑張って回答します。
どの言語でもそうですが、基礎的なことほど難しいので、全部完璧に知ろうとしないで、ある程度で割り切ったほうがいいですよ。モチベーションの維持的な意味で。
うん、私も知りたいぐらいなんですけどね。
回答1 window.は省略可能です。
タイプミスには目を瞑っておいて。
「可能」なので、window.console.logとしなくてもいいし、してもいいんですよ。
これを私が最初に知ったときモヤっとしましたね。
書くの?書かないの?どういう場面で書くべきで、どういう場面で省略すべきなの?
いつも省略するべきならなんで生まれてきたの?
この哲学的ともいえる疑問に対する答えは、今も私には分かりません。
そんなこと知らなくてもプログラムは作れるということだけが分かりました。
しっかりしたところだとコーディング規則に書いてるんでしょうかね?
とりあえず、私はいつも省略してます。
javascript
1console.log(window.location.href);
こういうコードをみるとモヤモヤっとします。
動くんですけどね、動くんですけど、コピペプログラマなのがバレバレなので、どっちかに統一しよう。
回答2 windowオブジェクトはブラウザが作ります。
お察しの通りwindowはWindowクラスのオブジェクトであり、グローバルオブジェクトと呼ばれるものです。
以下のサイトが実証コード付きで詳しく説明しています。
【JS入門】オブジェクトについて Vol.2(グローバルオブジェクト)
ぶっちゃけ、そんなことは知らなくてもプログラミングはできるので、そういうもの!と割り切るのが早いのですが、
こういう基礎的なことがどうしても気になったときは言語仕様書を見ましょう。
javascriptの言語仕様書では以下のように書いてあります。(機械翻訳です)
ECMAScript® 2018 Language Specification(ECMA-262 9th edition)
18グローバルオブジェクト
・(グローバルオブジェクトは、)制御が実行コンテキストに入る前に作成されます。
・(グローバルオブジェクトは、)[[Construct]]内部メソッドはありません。 new演算子でコンストラクターとして使用することはできません。
後略
「実行コンテキストに入る前」というのは、ようするにページにかかれたjavascriptソースコードの実行前ということです。
あなたが書いた(かどうかは知りませんが)、console.log("hello world");などが実行される頃には、ブラウザによってwindowオブジェクトは既に出来上がってますのでnew演算子でインスタンスを作る必要がないんですね。
全部は難しいと思うので、18グローバルオブジェクトの部分だけでも読むだけ読んでみてください。
多分、今のあなたには理解できませんが、javascriptの学習を進めることによって自然と理解できるようになります。
その頃にまた読み返してください。
最後に余計なお世話
インターネットは道具ですが、その向こう側には人がいることを忘れてはいけません。
あなたは会社の先輩に、そうやって質問攻めするのですか?
ましてあなたが質問している相手は赤の他人です。礼儀大事。
でも疑問のポイントはグッドだと思うのですよ。
基礎的なところを知っていれば、応用が利きますので上達するんです。
(他人に聞かずに隙間時間に自分で調べたほうがもっと上達するんですけどね)
私は、自分で全然理解できないコードは使うべきでないと思ってます。
なんとなーく分かっていればいいんですけどね。
「コピペでそれっぽいコードをツギハギしたら、動く、動くぞ!…動くけど…なんで動くんだろう?」※引用元ごめん。
というプログラマにはならないようにしてくださいね。