1. undefinedとnullの違いは何ですか?
undefinedは、定義が割り当てられていないことを意味します
a; aが割り当てられていない場合、現時点ではaのタイプは無定義です |
---|
nullが定義および割り当てられていますが、値はnullです
b = nullとします;この時点でaのタイプはnullです |
---|
2.いつ変数にnullを割り当てますか?
オブジェクトが割り当てられることを示す初期割り当て
a = nullとします。 |
---|
a = {名前:「ジャック」}; |
終了する前に、オブジェクトをガベージにします(ガベージコレクターによって収集されます)
a = nullとします | |
---|---|
a = {name:“ zs”}; | |
a = null |
3.変数タイプとデータタイプを厳密に区別しますか?
データの種類:
1.基本タイプ
2.オブジェクトタイプ
可変型
1.基本タイプ:saveはデータの基本タイプです
。2。参照タイプ:アドレス値を保存します(例:ox123)
例:
a = "abc"、
"abc"はデータ型の基本型、
変数aは変数型の基本型、保存はデータの基本型( "abc")とします。
同じ
let b = [1,2];
[1,2]はデータ型のオブジェクト型です。
変数bは変数型の参照型であり、アドレス値を保存します。
4.プロトタイプ
質問1:
function A (){
}
A.prototype.n = 1
var b = new A()
A.prototype = {
n:2,
m:3
}
var c = new A()
console.log(b.n,b.m,c.b,c.m)
// 1,undefined,2,3
質問2:
function F(){
}
Object.prototype.a = function(){
console.log('a()')
}
Function.prototype.b = function(){
console.log('b()')
}
var f = new F()
f.a()
f.b()
F.a()
F.b()
//a()
//报错
//a()
//b()
5.変数宣言の昇格と関数宣言の昇格
質問1:
var a = 4;
function fn(){
console.log(a);
var a = 5;
}
fn();
の最終的な値は何ですか?//未定義の変数宣言の昇格
変数宣言の推進
- varによって定義(宣言)された変数は、ステートメントが定義される前にアクセスできます。
- 値:アンダーファイン
質問2:
fn();
function fn(){
console.log(123);
}
関数は、定義される前にアクセスできます
関数宣言の推進
- 宣言された関数の関数では、前に直接呼び出すことができます
- 値:関数定義オブジェクト
注意:
fn();
var fn = function (){
console.log(123);
}
これは変数宣言の促進であり、var宣言は変数宣言の促進です。
6.実行コンテキストスタック
質問1:
console.log('global bengin:'+i);
var i = 1;
foo(1);
function foo(i){
if(i==4) return;
console.log('foo() begin:'+i);
foo(i+1);
console.log('foo() end:'+i);
}
console.log('global end:'+i);
-
順番に何が出力されますか?
-
プロセス全体でいくつの実行コンテキストが生成されますか?
5 = foo(1)+ f00(2)+ foo(3)+ foo(4)+ window
質問2:
function a(){
}
var a;
console.log(typeof a);
結果:
分析:
関数の昇格は変数の昇格よりも優先度が高いため、後で実行されます。変数の昇格が最初に実行され、次に関数の昇格が実行され、変数の宣言によって上書きされることはありません。aは可変プロモーションではなく機能プロモーションです
質問3:
if(!(b in window)){
var b =1
}
console.log(b);
結果:
質問4:
var c =1
function c(c){
console.log(c);
}
c(2) // 报错
結果:
分析:
c(2)cは変数であり、関数ではありません。関数の昇格は変数の昇格よりも優先されます。代表の後に実行されます。最初に変数の昇格が実行され、次に関数の昇格が実行されます。変数の割り当て後に上書きされます。つまり、aは変数の昇格であり、cは変数であり、呼び出すことができないため、エラーが報告されます。
7.ジョブドメインチェーン
質問1:
var x = 10;
function fn(){
console.log(x);
}
function show(f){
var x =20;
f();
}
show(fn);
結果:
分析:
fn関数のスコープにx変数はありません。変数がない場合は、ルックアップ(グローバルスコープを探します)すると、
出力xは10になります。
質問2:
在这里插入代码片 var fn = function(){
console.log(fn);
}
fn()
var obj = {
fn2: function(){
console.log(fn2);
}
}
obj.fn2()
結果:
分析:
fnは、グローバルウィンドウの下にあるメソッドであり、次のように見つけることができます。
ただし、fn2はobj範囲のメソッドであり、this.fn2からアクセスできます。
var fn = function(){
console.log(fn);
}
fn()
var obj = {
fn2: function(){
console.log(this.fn2);
}
}
obj.fn2()
8.閉鎖
質問1:
function fn(a=0){
var num =223
var fn1 = function(b=1){
num+=b
console.log(num);
}
num+=a;
return fn1
}
var fn2 = fn()
fn(2)()
fn(3)()
fn()(2)
結果:
分析:
fn()が呼び出されるたびに、新しいクロージャが生成され、仮パラメータの値は異なります
質問2:
function fn(n,o){
console.log(o);
return {
fn:function(m) {
return fn(m,n)
}
}
}
var a = fn(0); a.fn(1),a.fn(2),a.fn(3)
var b = fn(0).fn(1).fn(2).fn(3);
var c = fn(0).fn(1); c.fn(2);c.fn(3)
結果:
質問3:
var name = "text window";
var obj = {
name: "my object",
getNameFunc: function(){
return function(){
return this.name;
}
}
}
console.log(obj.getNameFunc()());
var name2 = "text window";
var obj = {
name2: "my object",
getNameFunc: function(){
var that = this
return function(){
return that.name2;
}
}
}
console.log(obj.getNameFunc()());