面接官:let const Objectを紹介してください.freeze(),set,get
3984 ワード
フロントエンドのピークは毎日1題です.
このシリーズでは、各パートナーが出題に参加することができ、あなたの答えをコメントエリアで披露することができます.javaScriptはかなりダイナミックな言語で、誰もが自分のスタイルと見解を持っています.皆さんが毎日の問題を積極的に提供し、次のように異なる答えを提供することを歓迎します.
私は毎日いくつかの人を招待して質問に答えて、質問に答えさえすれば、評論区で広告をすることができます.
不定期に賞品(と
第1四半期:
思考問題:
最も簡単な
上のように書くと間違いを報告する
ヒント:
しかし、私たちが
コードが正常に動作していることを確認し、エラーは発生しませんでした.
では、相手をもう一度試してみます.
すべてが正常に動作していることを発見
次に
コードが正常に動作していることを確認
チェン一峰先生のES 6入門を見てみましょう.
const:
let:
単純なタイプのデータ(数値、文字列、ブール値)については、変数が指すメモリアドレスに値が保存されるため、定数に等しい.
しかし、複合型のデータ(主にオブジェクトと配列)については、変数が指すメモリアドレスは、実際のデータを指すポインタだけが保存されており、constはこのポインタが固定されている(すなわち、常に別の固定されたアドレスを指している)ことを保証するしかなく、その指向するデータ構造が可変であるかどうかは、完全に制御できません.
まとめて言えば、constは本当の意味で「変わらない」ことを保証することはできません.
ES 5の浅い凍結はAPI Objectを用いる.freeze()
通常、次のコードは次のとおりです.
最終出力:
aの値は変更されたがコメントを開くコード
最終出力:
このときaの値は「凍結」されているため、変更されません.
浅い凍結については、bの値を変更すると効果があるかどうかを見てみましょう.
最終出力は次のとおりです.
証明
出力:
このとき、cの値を変更しました.
検出出力:
今回は本当に凍っているようですが、深い凍結もデータのタイプによって判断して凍結しなければなりません.そうしないと、本当の意味で完全に凍結することはできません.
大きな配列や
しかし、値は凍結されており、変数の参照を置き換えることができます.
上記:
以上、
3つの属性記述子を解析します.
印刷出力は
解析:
に注意⚠️
この場合も、書き込み可能な状態を
プロパティ記述子について説明し、最後にアクセス記述子について説明します.
オブジェクトを定義するときにアクセス記述子を追加します.
通常、p.age出力18にアクセス
ただし、p.age=101を設定すると、
間違いを投げ出す
アクセス記述子の役割:
get:属性を取得するたびにconsole.log(p.age)はgetを呼び出す
set:プロパティを設定するたびにp.age=101などの2つを呼び出すと、まったく関係なく呼び出すことができます.
特に,それら2つの呼び出しロジックは,結合度が高すぎてデッドサイクルに入りやすいことを明らかにしなければならない.
有名なVueフレームワークは2.xバージョンはこれにより実現される応答式~
例:
このデータの変更を購読したすべてのコンポーネントに更新を通知し、新しい値~を渡すだけです.
上は偽のコードですが、大体そう思います.
うまく書けたと感じたら、ぜひ見てください.モーメンツにお勧めします.
またオープンソースプロジェクト
倉庫住所:
私達の大きい群体に参加することを歓迎して、および群を交流して、公衆番号の返事:群をプラスします
グループ化
このシリーズでは、各パートナーが出題に参加することができ、あなたの答えをコメントエリアで披露することができます.javaScriptはかなりダイナミックな言語で、誰もが自分のスタイルと見解を持っています.皆さんが毎日の問題を積極的に提供し、次のように異なる答えを提供することを歓迎します.
私は毎日いくつかの人を招待して質問に答えて、質問に答えさえすれば、評論区で広告をすることができます.
不定期に賞品(と
)を配布します第1四半期:
ES6
基礎シリーズ:思考問題:
let , const , object.freeze()
の違い最も簡単な
const
から始めます.上のように書くと間違いを報告する
ヒント:
Assignment to constant variable.
しかし、私たちが
コードが正常に動作していることを確認し、エラーは発生しませんでした.
では、相手をもう一度試してみます.
すべてが正常に動作していることを発見
次に
let
を試します.コードが正常に動作していることを確認
チェン一峰先生のES 6入門を見てみましょう.
const:
let:
const
が実際に保証しているのは、変数の値が変更できないのではなく、変数が指すメモリアドレスに保存されているデータが変更できないことです.単純なタイプのデータ(数値、文字列、ブール値)については、変数が指すメモリアドレスに値が保存されるため、定数に等しい.
しかし、複合型のデータ(主にオブジェクトと配列)については、変数が指すメモリアドレスは、実際のデータを指すポインタだけが保存されており、constはこのポインタが固定されている(すなわち、常に別の固定されたアドレスを指している)ことを保証するしかなく、その指向するデータ構造が可変であるかどうかは、完全に制御できません.
まとめて言えば、constは本当の意味で「変わらない」ことを保証することはできません.
ES 5の浅い凍結はAPI Objectを用いる.freeze()
通常、次のコードは次のとおりです.
最終出力:
{a: "a", b: {…}}
aの値は変更されたがコメントを開くコード
Object.freeze(obj)
である最終出力:
{a: 1, b: {…}}
このときaの値は「凍結」されているため、変更されません.
浅い凍結については、bの値を変更すると効果があるかどうかを見てみましょう.
最終出力は次のとおりです.
{a: 1, b: {…}}
a: 1
b: {c: 2}
証明
b
も凍結されましたC
の値を変更してみます.出力:
{a: 1, b: {…}}
a: 1
b: {c: 2}
Object.freeze()
も完全に凍結できないようですが、万能のプログラマーのお兄さんは屈服することはできません.簡単で乱暴な再帰、深い凍結:このとき、cの値を変更しました.
検出出力:
{a: 1, b: {…}}
a: 1
b: {c: 2}
今回は本当に凍っているようですが、深い凍結もデータのタイプによって判断して凍結しなければなりません.そうしないと、本当の意味で完全に凍結することはできません.
vue 1.0.18+
はObject.freeze()
をサポートし、data
またはvuex
でfreeze
を使用して凍結されたオブジェクトに対してvue
はgetter
およびsetter
の変換をしません.大きな配列や
Object
があり、データが変更されないと確信している場合は、Object.freeze()
を使用するとパフォーマンスが大幅に向上します.Object.freeze()
メソッドは、オブジェクトをフリーズすることができます.凍結されたオブジェクトは二度と修正されません.オブジェクトをフリーズすると、そのオブジェクトに新しいプロパティを追加することはできません.既存のプロパティを削除することはできません.オブジェクトの既存のプロパティの列挙性、構成性、書き込み性、および既存のプロパティの値を変更することはできません.また、オブジェクトをフリーズしても、そのオブジェクトのプロトタイプは変更できません.しかし、値は凍結されており、変数の参照を置き換えることができます.
上記:
、 、 ,
以上、
Object.defineProperty()
で定義した属性により、印刷出力2にアクセスする3つの属性記述子を解析します.
writable
:属性の値を変更できるかどうかを決定します.印刷出力は
2
で、属性aの値は変更できません解析:
writable:false
は属性として変更できないと見ることができ、厳格なモード(「use strict」;)では、エンジンはTypeErrorの異常を投げ出します.これは、書き込み不可のプロパティを変更できないことを示しています.configurable
:属性が構成可能である限り、defineProperty(...)
メソッドを使用して属性記述子を変更できます.に注意⚠️
false
の場合、修正すると厳格モードかどうかにかかわらずTypeError
のエラーが投げ出されますこの場合も、書き込み可能な状態を
true
からfalse
に変更することができます.delete
属性も(delete myObject.a;)
禁止されますemumerable
:列挙可能であり、falseに設定されている場合、この属性は列挙には表示されませんが、正常にアクセスできます.プロパティ記述子について説明し、最後にアクセス記述子について説明します.
オブジェクトを定義するときにアクセス記述子を追加します.
通常、p.age出力18にアクセス
ただし、p.age=101を設定すると、
間違いを投げ出す
index.html:65 Uncaught Error: invalid value
at Object.set age [as age] (index.html:65)
at index.html:71
アクセス記述子の役割:
get:属性を取得するたびにconsole.log(p.age)はgetを呼び出す
set:プロパティを設定するたびにp.age=101などの2つを呼び出すと、まったく関係なく呼び出すことができます.
特に,それら2つの呼び出しロジックは,結合度が高すぎてデッドサイクルに入りやすいことを明らかにしなければならない.
有名なVueフレームワークは2.xバージョンはこれにより実現される応答式~
例:
このデータの変更を購読したすべてのコンポーネントに更新を通知し、新しい値~を渡すだけです.
上は偽のコードですが、大体そう思います.
うまく書けたと感じたら、ぜひ見てください.モーメンツにお勧めします.
またオープンソースプロジェクト
Palantir
は現在マイクロフロントエンドに接続されており、マイクロフロントエンドフレームワークは作成中~倉庫住所:
https://github.com/JinJieTan/Palantir
Palantir
倉庫住所私達の大きい群体に参加することを歓迎して、および群を交流して、公衆番号の返事:群をプラスします
グループ化