------------------------面接でよくある質問: 配列の重複排除、いくつかの要約、下に降りてノックする----- --------------
IIEF を使用するのが最善です。
1) 2層ループプラススプライス方式
2) 重複排除のインデックス
3) 重複排除を含む
4) 空のオブジェクトを使用してカバレッジ メソッドを置き換えます
5) 再帰の使用
。。。
--------------------------------------------------今日の内容を開始します --------------------------------------
1: プロトタイプとプロトタイプ チェーン
prototype原型:
1) 各関数には多くの属性とメソッドがあり、プロトタイプ属性があり、それに対応する値がオブジェクトであり、これをプロトタイプ オブジェクトと呼びます。
2) 多くのプロパティとメソッドがプロトタイプ オブジェクトに配置されます
3) 各プロトタイプ オブジェクトにはコンストラクターが必要です。コンストラクターも属性名であり、その値は現在の関数 (クラス) そのものです。
4) 各オブジェクトには属性 __proto__ があり、対応する値はそのオブジェクトを作成したクラスのプロトタイプ オブジェクトです。
5) このプロトタイプ オブジェクトには __proto__ もあり、これは Object に対応するプロトタイプ オブジェクト (基底クラス) に対応します。object は最上位クラスであるため、基本クラスとも呼ばれます。
6) したがって、Object.prototype.__proto__ はそれ自体を指します。それ自体を指すことは意味がないため、デフォルト値は null です。
プロトタイプチェーン
属性を探すなら、まず自分自身の内側(プライベート)を見つめてください。
あるならそれを使い、後ろを振り向かないでください。
そうでない場合は、__proto__ に従い、クラス プロトタイプ オブジェクトのプロパティを見つけ、Object.prototype が見つかるまで検索を続けます。
---------------------------------- ここに 2 つのクイズがあります ----------- ----プロトタイプのチェーンで巻かれているかどうかを確認します
function Func(){ this.name = "张" } let obj1 = new Func(); obj2 = new Func(); とします。 Func.prototype.say = function(){ console.log("say...") }
テスト質問 console.log(obj1.say === obj2.say) 、 obj1 と obj2 は同じプロトタイプ オブジェクトを指しており、内部のメソッドは一貫しています console.log(Func.prototype.say === obj1.say) 、 obj1 には何も言えません。そのプロトタイプ オブジェクトに移動して見つけてください。そのプロトタイプ オブジェクトは、このオブジェクトを作成したクラスのプロトタイプ オブジェクトを指します。 console.log (obj1.__proto__.say === Func.prototype.say ) 、 obj1 のプロトタイプ オブジェクトは、このオブジェクトを作成したクラスのプロトタイプ オブジェクトを指します console.log(obj1.__proto__ === Func.prototype) 、 obj1 のプロトタイプ オブジェクトは、このオブジェクトを作成したクラスのプロトタイプ オブジェクトを指します console.log(obj1.name === obj2.name ) 、、両方のオブジェクトにはパラメータがありません、どちらも未定義です、 true を返します console.log(obj1 instanceof Func) 、、 func もオブジェクトです console.log(obj1 instanceof Object ) 、、は同じタイプです
テスト2
var arr1 = 新しい配列("a","b","c") var arr2 = 新しい配列("d","e","f")
console.log(Array.prototype === arr1.__proto__) 、配列は組み込みオブジェクト、組み込みクラス、コンストラクターに属し、arr1 のプロトタイプ オブジェクトは、それを作成したクラスのプロトタイプ オブジェクトに対応します console.log ( Array.prototype.push == = arr1.push) 、arr1 にはプッシュはありません。プロトタイプ オブジェクトに移動してそれを見つけます。そのため、プロトタイプ オブジェクトのプッシュに相当します。 console.log( arr1 === arr2 ) 、 arr1 と arr2 は 2 つのヒープであり、同じではなく、 false console.log(arr1 instanceof Array)です 。。 console.log(arr1 オブジェクトのインスタンス) . 。 console.dir(arr1.__proto__)//プロトタイプ オブジェクト console.dir(arr1.__proto__.__proto__)//プロトタイプ オブジェクトは、基本クラスのオブジェクトが指すプロトタイプ オブジェクトを指します console.dir(arr1.__proto__.__proto__.__proto__) //ヌル
2. 対処が難しい
この質問に関して、これが表示されるいくつかの場所
1) リスナーでは、これはイベント ソースを表します。
btn イベント ソース、プレフィックス、イベント タイプをクリック
2) 非厳密モード。これは通常の関数で表示されます (ウィンドウを意味します)。厳密モードでは未定義を意味します。
厳密モード: 厳密を使用します。
3) これはオブジェクトのメソッドに表示され、現在のオブジェクトを示します。
4) これはコンストラクターに表示され、新しいオブジェクトを指していることを示します。
5) グローバル変数の下では、これはウィンドウを意味します
これの本質: メソッド内の this は不確実性を指します。メソッドを誰がこれと呼ぶにせよ、これは誰を指しますか
一連の練習問題:
(1)
function Func(){ this.a = 1; this.b = 2; this.say = function(){ console.log(this.a) } } Func.prototype.say = function(){ console.log(this .b) } Func.prototype.jump = function(){ // ジャンプ メソッドを呼び出した人、ジャンプ メソッド内のこれは誰です console.log(this.a+this.b) } let wc = new Func(); wc.jump(); // 3
(2)
function Func(){ this.a = 1; this.b = 2; this.say = function(){ console.log(this.a) } } Func.prototype.say = function(){ // 誰が Say を呼び出したかこのメソッド、そしてこれは誰です // wc.__proto__ console.log(this.b) } Func.prototype.jump = function(){ console.log(this.a+this.b) } let wc = new Func ( ); // プロトタイプ オブジェクトのメソッドが呼び出されることを明確に指摘します // wc.__proto__ それはsay メソッドを呼び出します、そしてこのメソッドの this は wc.__proto__ wc.__proto__.say(); // 未定義
(3)
関数 Func(){ this.a = 1; this.b = 2; this.say = function(){ console.log(this.a) } } Func.prototype.say = function(){ console.log(this.b) } Func.prototype.jump = function(){ // コチラこの表示 wc.__proto__ console.log(this.a) // 未定義 console.log(this.b) // 未定義 console.log(this.a+this.b) // NaN } let wc = new Func( ); wc.__proto__.jump(); // NaN
3. 無名関数に関するいくつかの質問
1) var f =function(){}、これは f に無名関数を割り当てます。
上記の無名関数式では、この無名関数の関数名 g を指定できます。。
var f = function g(){console.log("はは...")}
f()
g()// が出力されますが、g は定義されていません
//前に述べたように、関数式の関数名を通じて呼び出すことはできないため、g() ではなく f() を通じてのみ呼び出すことができます。
2) では、匿名関数名を使用するにはどうすればよいでしょうか? 次に、それを独自の関数本体で使用します
例えば:
var f = function g(){ console.log(g) // g は関数名で、 関数本体で g() を使用できます; // この関数は g() を通じて呼び出すことができますが、終了がない場合は無限ループ g = 1; // 基本データ型を g に代入しても効果はありません g = []; // 参照データ型を g に代入しても効果はありません g = {}; g = function(){ console.log("xixi..." ) } console.log(g) } f()
匿名関数名の考慮事項を要約すると、次のようになります。
1) 関数本体で匿名関数名を使用できる
2) 直接呼び出すこともできますが、出口がない場合は無限ループになります。
3) 基本データ型も参照データ型も再割り当てできません。
4) 要約すると、関数式の場合、関数名を持つことができ、内部的に呼び出すことができますが、関数名を使用して外部から呼び出すことはできません。
------------------------- 2 つの例で練習しましょう ---- -----------------------
(1)
var a = 関数 abc(num) { abc = num; console.log(num) console.log(abc) console.log(abc の種類) } a(1)
(2)
var a = 関数 abc(num) { abc = num; 1 を返します。 a(1) console.log (abc())
4. これを実践するために、これを(もう少し)要約する次の面接の質問を見つけてください。。