奇妙なJavaScriptタイプのシステム


Haya、もう一つの記事で再びあなたに会えてうれしいです、今日の話題は親切な機能的なプログラミングです、私は私が私の大部分であるタイプについて基本を取り戻して、話すのが良いと思いました.
では、なぜJSが持っているタイプシステムに専用のシリーズを持っていないのですか?
この記事では、タイプとタイプについてすべてのbeastyを行くつもりです、そして、なぜ、あなたは本当にタイプを気にしなければなりませんか?
“ダブルイコールを使用して、トリプと同じように、”いくつかのコース、ブログでは、この勧告を参照してください=== 二重にわたって== 彼らが主張するように、それはコーナーケースを扱うことに関してよりよいです.地獄ノ
私は、私がそのような主張を信じて、私のコース(記事)のいくつかでそれを広げさえした時に、それを主張しません.しかし、meh、我々はすべて愚かなことを行う.
だから、私たちのトピックを右に取得し、なぜ私はこの主張を刺激している理解してみましょう

どのような種類のJSがありますか?
確かに、あなたが使用する言語がどのようなタイプをサポートしているかを知っていますが、私とは裸で、それらを迅速に再訪問しましょう.

  • プリミティブ
  • 文字列
  • 未定義のNULL
  • シンボル
  • ブーリアン

  • オブジェクト
  • オブジェクト(オブジェクト表記またはクラスのインスタンス)
  • アレイ
  • 機能
  • すべてのプリミティブ型はJavaScriptで非参照値として扱われます.
    そして、すべての子孫Object 型はReferenceable 値は、heap そしてそれらの参照はstack
    typeof演算子
    この演算子は、JavaScript内の唯一の演算子であり、スコープ内の既存の変数にアクセスすることができます.

    宣言のない
    console.log(typeof undeclared) // undefined
    
    どうやら変数undeclared まだスコープ内に存在しませんtypeof それにアクセスすることができますが、何が私を返しますundefined :/
    まあ、それは合理的かもしれないが、imho、私は考えるのが好きですundefined 値のない値の表現として、値の不在のように、私はあなたもそのようにそれを考えると仮定するかもしれません、より多くの価値があるプレースホルダのように、次の例を考えてください.
    class User {
      protected db: Database
    
      constructor(db: Database) {
        this.db = db
      }
    }
    
    変数dbはいくつかのインスタンスであることを期待していますDatabase エンティティ、多分あなたはそれを注入しているUser データベース永続性に関連した着信要求を扱うモデル
    それとは別に、何の価値ですかdb あなたがそれを渡す前に、どんなインスタンス?うん、そうだundefined , あなたはまだそれのための値を設定していないので、値の欠如は、キーワードundefined , うまくいけば、それは意味をなします.
    しかし、もしそうなら、何が問題を返すundefined 使用typeof 既存の変数の演算子?
    まあ、私はKyle Simpson これは、2つの別々の概念のために同じデータ型を使用して、何らかの種類の混乱であるということですundeclared いくつかの変数がアクセス可能なスコープで定義されていないことを示す.
    さらに、私自身もカイルも私たち自身によってこの精神モデルを考えていなかったし、誰もこの精神的なモデルを持っていなかった、実際にはECMAScriptのガイドラインはそう言います.

    しかし、meh、このような何かを加えることは既存のコードベースに多くのバグを引き起こすかもしれません.

    NULLはオブジェクトです
    let v = null
    
    console.log(typeof v) // object
    
    JavaScriptの奇妙な部分のうちの1つですnull まるでオブジェクトであるかのように.
    さて、この行動を正当化する2つのメンタルモデルがあると思います.
  • nullは空のオブジェクトの表現です
  • NULLは未定義に等しく、JSのバグです
  • よく、各々のふるまいを通して歩きましょう、そして、私はあなたにどちらがより意味をなすかについて決めさせます.

    NULLは空のオブジェクトです
    次のコードを考えます.
    let nullObject = Object.create(null)
    
    console.log(nullObject)
    
    このコードの出力は[Object: null prototype] {} , したがって、いくつかの意見や考えているnull JSの型はobject として使用できるのでprototype 他のオブジェクトに関数を作成したくない場合は、- Prototypeを持たないオブジェクトの場合、JSオブジェクトの機能から組み込みのサポートを行います.
    let nullObject = Object.create(null)
    let anotherObject = {}
    
    console.log(anotherObject.toString()) // [Object object]
    console.log(nullObject.toString()) // Throws an error
    
    そして、もう一度、私はこれを作っていません、それはEcmasScript眼鏡がNULLタイプについて言うものです


    NULLは未定義です
    私は、この考え方がその考えに基づいていると思いますconsole.log(null == undefined) リターンtrue または多分あなたは私のような、別の言語(私のケースのPHP)からJavaScriptにシフトする、いずれかの方法で、私はそれらの両方の精神的なモデルがある意味で誤っていると思います.
    最初のものは完全に事実を無視するconsole.log(null === undefined) リターンfalse 2つ目は他の言語の規則によってJavaScriptを判断します.

    If you're doing JavaScript, do it in JavaScript way - Panda's Law #2


    しかし、NULLを定義して、同じ型として定義しないコーナーケースがあります.
    もし私が抽象的に同じであるという事実を使用してより簡潔なコードを書くことができれば(私たちはこのシリーズの平等セクションでこれを後で説明します)、確かにそうします.

    配列はオブジェクト
    これは私が言うのはかなり簡単ですが、それを介して歩いてみましょう.
    let ages = [20, 21, 26, 42]
    
    console.log(typeof ages) // "object"
    
    これは私が以前に述べたように、完全に合理的です.V 8エンジンは、メモリ割り当ての重複を減らすために、いくつかの方法で配列やオブジェクトを扱います
    したがって、いくつかの変数が配列であることを確認したい場合は、配列コンストラクタを使用する必要があります
    let ages = [20, 21, 26, 42]
    
    console.log(Array.isArray(ages)) // true
    
    そして、残りのタイプはかなり合理的であると思いますtypeof function(){} リターン"function" など.

    特殊型NaN
    JSでは1つの誤解されたタイプで、私は、IEEEが毎回1ドルを支払ったならば、ナンがNASDAQで1対1であった数でないと思ったと思います.
    ええ、NaNのように作られますNot a number しかし、meh、番号ではないの本当の意味ではない!
    console.log(typeof NaN) // number
    
    閉じるこの動画はお気に入りから削除されています.the typeof 演算子は以下の通りです.
    私は、それを呼び出していないIEEEを非難しますNavNNot a valid number or NarNNot a representable number それはナンが何であるからです.
    次の例を考えます.
    console.log(Number('abc')) // NaN
    console.log(Number({ x: 1, y: 2 })) // NaN
    console.log(Number([1, 2, 3, 4])) // NaN
    console.log(Number('5')) // 5
    console.log(Number(true)) // 1
    
    Nansは実際に数字であるが、数値形式では表現できない特別な数である.
    さて、次の部分であなたに会いましょう
    良いドリンクとあなたが非常に喜ばれる日、チリオ💜


    サポート/フォローミー
  • Github


  • Website