ホームページ >ウェブフロントエンド >フロントエンドQ&A >知識を定着させるのに役立つ、フロントエンド面接でよくある質問 (回答付き) をまとめました。
記事を公開する主な目的は、知識を統合し、より熟練することです。すべては私自身の理解とオンラインで検索した情報に基づいています。何か間違っている場合は、アドバイスをいただければ幸いです。以下は、面接でよくある質問をまとめたものです。自分を鼓舞するために、
js 言語では、各インスタンス オブジェクトには、そのプロトタイプ オブジェクトと、このインスタンス オブジェクトのコンストラクターを指す __proto__
属性があります。プロトタイプ属性 prototype
があります。これは、インスタンス オブジェクトの __proto__ 属性と同じオブジェクトを指します。オブジェクトが属性の値を探しているときに、値がない場合は、それが参照されます。 #Prototype プロトタイプ オブジェクトを検索します。プロトタイプ オブジェクトが存在しない場合は、インスタンス オブジェクトを生成したコンストラクターのプロトタイプ オブジェクトを検索します。まだ存在しない場合は、プロトタイプ オブジェクトを検索します。 Object のプロトタイプ オブジェクトを検索し続けます。上方向に検索すると null になります。この連鎖検索プロセスを
Prototype Chain と呼びます。
prototype プロトタイプ オブジェクトを指します。
constructor 属性を通じてこのコンストラクターを参照し、プロトタイプ オブジェクトがどのコンストラクターによって生成されたかを示します。プロトタイプオブジェクトはnewキーワードにより生成されるインスタンスオブジェクトであり、
__proto__属性によりインスタンスオブジェクトを生成したコンストラクタのプロトタイプオブジェクトを指すことができ、三角関係を実現する。
1) プロトタイプチェーンの継承
プロトタイプを利用すると、以下に基づいてオブジェクトを作成できます。既存のオブジェクトを使用するため、独自のオブジェクトを作成する必要はありません。タイプを定義します。 object() 関数内では、最初に一時的なコンストラクターが作成され、次に渡されたオブジェクトがコンストラクターのプロトタイプとして使用され、最後にこの一時的な型の新しいインスタンスが返されます。キーコード:Star.proyotype = new Person(), Star.proyotype.constructor = Star欠点: 親クラスのメソッドのみ継承可能
2) コンストラクターの借用継承
サブクラス コンストラクター内でスーパータイプ コンストラクターを呼び出します。コンストラクターは、apply() メソッドと
call() メソッドを使用して、新しく作成されたオブジェクトに対して実行できます。キーコード:
Person.call(this,age,name)欠点: 再利用できず、親クラスの属性のみ継承可能
3) 結合継承
擬似古典継承とも呼ばれます。これは、プロトタイプ チェーンとコンストラクターの借用のテクニックを組み合わせて、両方の長所を活用することを指します。プロトタイプ チェーンを使用してプロトタイプのプロパティとメソッドを継承し、コンストラクターを借用してインスタンス プロパティを継承します。 プロトタイプ上でメソッドを定義することで関数の再利用を実現するだけでなく、各インスタンスが独自の属性を持つことも保証します。ただし、小さなバグがあります。年齢と名前のコピーが 2 つあり、apply() メソッドと
call() メソッドが自動的に呼び出されるため、1 つの値は未定義です。一度。
4) 寄生組み合わせ継承
コンストラクターを借用することでプロパティを継承し、プロトタイプ チェーンの混合形式を通じてメソッドを継承します。基本的に、寄生継承を使用してスーパータイプのプロトタイプから継承し、その結果をサブタイプのプロトタイプに割り当てます。包括的な継承方法として認識されています。すべてを書こうと思っても、まだ膨大です。簡単なものしか知りません。キー コード:Star.prototype = Object.create(person.prototype )
5) ES6 の Class クラス継承メソッド
class キーワードと extends キーワードを併用して継承を実現できます。 class キーワードはクラスを宣言するために ES6 で導入されました。クラス (クラス) は、extends、
super のプロトタイプ オブジェクトを指すことによって、親クラスのプロパティとメソッドを継承できます。親クラスであり、呼び出すことができます。 親クラスの属性とメソッド、および super キーワードはサブクラスのコンストラクター メソッド内に存在し、その前に指定する必要があります。
データ型は一般に 2 つのタイプに分類されます
typeof 既存の問題の検出: null または配列がオブジェクトとして出力される
instanceof
(複雑なデータ型のみが検出可能)
戻り値は true または false
関連するコンストラクターがプロトタイプ チェーン上にある限り true、それ以外の場合は false となり、それが array
#Object.prototype であるかどうかを検出するために使用できます。 toString.call
(必須の検出データ値)
なぜ Object.prototype.toString を借用する必要があるのですか? toString は独自のプロトタイプによって書き換えられており、[object Object]
var arr = [2, 3, 4] console.log(arr instanceof Array) console.log(Array.isArray(arr)) console.log(Object.prototype.toString.call(arr))##7. 深いコピーと浅いコピー
深いコピー: レイヤーごとcopy、各レベルのデータがコピーされます
浅いコピー メソッド:
1. lodash の浅いコピー2.
Object.assign メソッドを使用する
3. es6 文法を使用する
.... 拡張演算子
ディープ コピー メソッド:
2.
recursion を使用します循環参照がある場合
解決策: 処理済みのオブジェクトを保存します。新しいオブジェクトの場合は、この保管場所を調べて、それらが適切に処理されたかどうかを確認します。直接返す場合は、
let obj = { name: "zs", age: 20, father: [2, 3, 4], }; function deepClone(target) { //这一行如果不用三元判断 如果是数组会有bug会被拷贝成伪数组对象 let tempObj = Array.isArray(target) ? [] : {}; for (let key in target) { if (typeof target[key] === "object") { tempObj[key] = deepClone(target[key]); } else { tempObj[key] = target[key]; } } return tempObj; } let obj1 = deepClone(obj); console.log(obj1);
1.spliceは元の配列を変更しますが、sliceは元の配列を変更しません。
2.slice は新しい配列を返します。これを使用して配列をインターセプトできます。
9、substr と substring の違い
substr は、開始インデックス番号から始まる指定された長さの文字列を抽出します。
#10 の間の文字 let const var
var キーワードで変数を宣言します
1. var キーワードで宣言された変数が存在します
; 2. var で宣言された変数が存在しません ブロックレベルのスコープ
、その場合、グローバル変数はどこからでも呼び出すことができます;3. var 宣言変数の名前が繰り返される場合、後の宣言は前の宣言を上書きします;
let key sub-宣言変数
1.
、let が変数を宣言するときに変数プロモーションの問題はありません。let が変数を宣言する前に変数が呼び出される場合、エラーが発生します。報告 (初期化前に変数にアクセスできないことを示すプロンプト) ;2.ブロックレベルのスコープ
、変数がブロックレベルのスコープ (グローバル、関数、eval 厳密モード) に存在することを宣言します。現在のコード ブロック内でのみ有効です。現在のコード ブロックの外にある場合、呼び出しはエラーを報告します (現在の変数が定義されていません);3.スコープ チェーンの操作には影響しません
4.変数の繰り返し宣言は許可されません
, let 宣言 変数を繰り返し宣言することはできません。同じ名前が繰り返し宣言されると、エラーが報告されます (現在の識別子はすでに宣言されている); 変数の const 宣言
1. const で宣言された変数には、次の特性もあります:
, ブロック レベルのスコープ、
繰り返しの宣言は許可されません;2.const 宣言された変数はすべて
定数 (変更が許可されない量) です。一度宣言すると、変更することはできません。変更すると、エラーが報告されます - 定数変数の割り当て
3。一般に、サードパーティのフレームワークでは、変数の宣言に const を多用すると、ユーザーが変数を変更できなくなる可能性があります。フレームワーク; 4. const が実際に保証しているのは、変数の値が変更できないことではなく、変数が指すメモリ アドレスに格納されているデータが変更できないことです。単純なタイプのデータ (数値、文字列、ブール値) の場合、値は変数が指す
メモリ アドレス
に格納されるため、定数と同等です。
11. new
function debounce(func, delay) { let timer = null // 计时器 return function (...args) { clearTimeout(timer) // 清除上一次计时器 timer = setTimeout(() => { // 重新定时 func.apply(this, args) }, delay) } }
节流
function throtte(func, time) { let timer = null // 计时器 return function (...args) { if (timer) return // 无视,直接返回 timer = setTimeout(() => { func.apply(this, args) }, time) } }
这点简单介绍概念,用法后面在详细介绍
1) . 初始态pending
- pending。它的意思是 "待定的,将发生的",相当于是一个初始状态。创建[Promise]对象时,且没有调用resolve或者是reject方法,相当于是初始状态。这个初始状态会随着你调用resolve,或者是reject函数而切换到另一种状态。
2 ). 成功态resolved--
也叫fulfilled
- resolved。表示解决了,就是说这个承诺实现了。 要实现从pending到resolved的转变,需要在 创建Promise对象时,在函数体中调用了resolve方法(即第一个参数)。
3) . 失败态rejected
- rejected。拒绝,失败。表示这个承诺没有做到,失败了。要实现从pending到rejected的转换,只需要在创建Promise对象时,调用reject函数。
// 上口诀 双层for循环 外层长度-1 内层长度-1-i let arr = [4, 3, 1, 7, 8, 10] for (let i = 0; i arr[j + 1]) { let temp = arr[j] arr[j] = arr[j + 1] arr[j + 1] = temp } } } console.log(arr)
MVVM
是三个单词的缩写,model
(数据,一般来自ajax或本地存储)+view
(视图template)+viewmodel(vue实例)
好处
:降低了耦合性
)1.分别是创建阶段的beforeCreate
,created
,一般在beforeCreate写loading加载效果,使用户体验更好,一般在created中发送ajax请求获取数据
2.然后是挂载阶段的beforeMount
,mounted
,一般会在mounted中操作DOM元素
3.更新阶段的是beforeUpdate
,updated
,当数据更新时需要做统一的业务处理时,拿到最新的dom,可以使用updated 这个钩子函数
4.最后是销毁阶段的beforeDestroy
,destroyed
,可以在beforeDestroy做一些清理的工作,比如说定时器 和解绑一些addEventListener监听的事件
keep-alive
的两个钩子函数,使用场景是当组件切换时会进行销毁,因此组件中的初始化的4个钩子函数会多次执行,比较浪费资源,此时可以使用keep-alive纪行组件的缓存,可以让组件切换时不被销毁,keep-alive有两个独有的钩子函数,分别是activated
和deactivated
,是组件激活和失活时会执行的两个钩子函数)单向数据流是指父组件向子组件传递数据,子组件通过props
接收,当父组件中的值改变了,子组件中对应的数据也会改变,因为props是只读
的,所以无法直接在子组件中对父组件传递过来的值进行修改,但是如果这个数据是一个引用数据类型,是可以直接在子组件中修改数据中的某个属性的,只要不改变这个数据的内存地址
就可以
vue中普通指令都可以实现数据变了,视图会跟着变,但是有一个特殊的指令叫v-model
,它一般用于表单控件,它可以实现双向数据绑定,所谓的双向数据就是数据变了,视图就会跟着改变,反过来也是
v-model
一般配合input
框使用,实现双向数据绑定的效果,它是v-bind
和v-on
的语法糖,原理是通过v-bind将数据绑定给input框,再通过v-on:input
,在input中的值改变时,通过$event可以获取到事件源对象 再通过target.value
获取到input中更新后的值 将这个值再赋值给绑定的数据即可
在vue的组件使用自定义事件时,$event代表子组件抛出的数据,当这个自定义事件触发一个方法时, 可以不传$event而且可以在方法中进行接收,但是如果写的话就一定要写成$event的形式,这是一个固定写法, 或者这个方法既要传参又要使用事件对象,这个时候$event也是必须要写的 - @click='fn' 在回调函数直接通过参数可以拿到事件对象 - @click='fn($event)' 这个时候@event是固定写法
1.初始化阶段时,先执行父组件的beforeCreate
、created
、beforeMount
三个钩子函数,然后执行子组件的beforeCreate
、created
、beforeMount
、mounted
四个钩子函数,最后执行父组件的mounted钩子函数
2.更新阶段,先执行父组件的beforeUpdate
,然后执行子组件的beforeUpdate
,updated
,最后执行父组件的updated
3.销毁阶段,先执行父组件的beforeDestroy
,然后执行子组件的eforeDestroy
,destroyed
,最后执行父组件的destroyed
v-if
和v-show
都可以控制标签,实现组件的显示与隐藏,不同点是v-show是通过display
的block和none
属性来控制的,当元素隐藏时,页面结构依然存在
v-if是通过将元素创建和销毁来控制显示与隐藏的,当v-if的条件为否时,会直接销毁该元素,当满足时会重新创建出来,有可能会影响页面的回流或重绘
如果该元素需要频繁切换时可以使用v-show,不需要频繁切换时可以使用v-if,提高性能
template
将v-if写在循环的外部,这样当不满足v-if的判断条件时,就不会再执行v-for了,也可以将数据放在计算属性
里面计算过滤出来的数据在交给v-for循环,代替v-if的作用,即可解决。应用场景
v-imgerror
公司项目中有的用户头像可能加载报错,可以给他一张默认图片, onerror this.img=默认图片
v-focus
打开带有搜索的页面的时候,实现自动把光标定位到 input 中
自定义指令的钩子函数
1.bind
属性绑定的时候执行 只会有一次
2. inserted
当前指令所在的元素插入到页面中的时候执行一次
3. update
当前指令所在的组件中的 data 数据有更新就会执行,可以执行多次
// 指令的钩子有三个 bind inserted update // bind inserted 只会执行一次 // update 会反复执行 Vue.directive('focus', { inserted(el) { el.focus() }, }) Vue.directive('red', { bind(el) { el.style.color = 'red' }, }) Vue.directive('check', { update(el) { const reg = /^[a-zA-Z0-9]+$/ if (reg.test(el.value)) { el.style.color = 'green' } else { el.style.color = 'red' } }, })
这块部分理解不是很透彻,大家浅看一下就可以了?
expire
,cache- control
,last-modified
,etag
(応答メッセージ内)expire
,catch-control
(存在する場合) を確認します。つまり、優先順位は cache-control
) を確認することであり、有効期限が切れていない場合は、それは問題ありません (この部分は強力なキャッシュに属します) を使用しますが、有効期限が切れていることが判明した場合は、それが開始されます。キャッシュ ネゴシエーション ステージに入り、サーバーにリクエストを送信します。if-modified-since
(値は last-modified
)/if-none-match( etag)
リクエストが送信された後、サーバーは、サーバー上のリソースがローカルのリソースよりも新しいかどうかを確認する比較を開始します。サーバーのリソースがまだ古い場合は、ステータスが返されます。コードは 304 です。ブラウザはステータスが 304 であることを認識し、引き続きローカルのオフライン リソースを使用します。サーバー リソースに更新されたリソースがある場合、ステータス コードは 200 になり、サーバーは新しい logo.png をブラウザとプロセスに渡す必要があります。 私の技術スタックは主にフロントエンド Vue であるため、この分野の知識がまだ不足しているため、自分の技術を試してみます。それを明確に説明するのが最善です。実際、私はそれをよく理解していません。それを完全に理解したい場合は、まだ多くの技術的予備力が必要であることは大まかに理解しています。明らかに、私はそうではありません、はは?
オブザーバー パターンは、オブジェクトが複数のオブジェクトに依存していることを意味します。依存オブジェクトが更新されると、すべての依存オブジェクトに自動的に通知されます。
オブザーバー パターンが定義されていますオブジェクト間の 1 対多の依存関係。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。比喩:
赤ちゃん-> 両親、祖父母 1 対多の依存関係
赤ちゃんの泣き声-> 両親と祖父母が駆けつけてくれる オブジェクトの状態が変化すると、それに依存しているすべてのオブジェクトが変化する通知され、自動的に更新されます
2 つの被験者があります 1 つは観察者です
Dep もう 1 つは観察者
監視者です, in vue
v-band はこのモデルのコンセプトを採用していますが、結合が高すぎるという欠点があります
3 つの主題があります パブリッシャー ディスパッチ センターのサブスクライバー (vue に反映されます)
eventBus このモデルの概念は分離を実現できます
とオブザーバー watcher
。パブリッシュおよびサブスクライブ モデルには、パブリッシャー ディスパッチ センター (イベント チャネル) とサブスクライバー
(学習ビデオ共有: Web フロントエンドの概要 、jQuery ビデオ チュートリアル )
以上が知識を定着させるのに役立つ、フロントエンド面接でよくある質問 (回答付き) をまとめました。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。