奇妙なJavaScriptタイプのシステム
11568 ワード
Haya、もう一つの記事で再びあなたに会えてうれしいです、今日の話題は親切な機能的なプログラミングです、私は私が私の大部分であるタイプについて基本を取り戻して、話すのが良いと思いました.
では、なぜJSが持っているタイプシステムに専用のシリーズを持っていないのですか?
この記事では、タイプとタイプについてすべてのbeastyを行くつもりです、そして、なぜ、あなたは本当にタイプを気にしなければなりませんか?
“ダブルイコールを使用して、トリプと同じように、”いくつかのコース、ブログでは、この勧告を参照してください
私は、私がそのような主張を信じて、私のコース(記事)のいくつかでそれを広げさえした時に、それを主張しません.しかし、meh、我々はすべて愚かなことを行う.
だから、私たちのトピックを右に取得し、なぜ私はこの主張を刺激している理解してみましょう
どのような種類のJSがありますか?
確かに、あなたが使用する言語がどのようなタイプをサポートしているかを知っていますが、私とは裸で、それらを迅速に再訪問しましょう.
プリミティブ 文字列 数 未定義のNULL シンボル ブーリアン
オブジェクト オブジェクト(オブジェクト表記またはクラスのインスタンス) アレイ 機能 すべてのプリミティブ型はJavaScriptで非参照値として扱われます.
そして、すべての子孫
typeof演算子
この演算子は、JavaScript内の唯一の演算子であり、スコープ内の既存の変数にアクセスすることができます.
宣言のない
まあ、それは合理的かもしれないが、imho、私は考えるのが好きです
それとは別に、何の価値ですか
しかし、もしそうなら、何が問題を返す
まあ、私はKyle Simpson これは、2つの別々の概念のために同じデータ型を使用して、何らかの種類の混乱であるということです
さらに、私自身もカイルも私たち自身によってこの精神モデルを考えていなかったし、誰もこの精神的なモデルを持っていなかった、実際にはECMAScriptのガイドラインはそう言います.
しかし、meh、このような何かを加えることは既存のコードベースに多くのバグを引き起こすかもしれません.
NULLはオブジェクトです
さて、この行動を正当化する2つのメンタルモデルがあると思います. nullは空のオブジェクトの表現です NULLは未定義に等しく、JSのバグです よく、各々のふるまいを通して歩きましょう、そして、私はあなたにどちらがより意味をなすかについて決めさせます.
NULLは空のオブジェクトです
次のコードを考えます.
NULLは未定義です
私は、この考え方がその考えに基づいていると思います
最初のものは完全に事実を無視する
しかし、NULLを定義して、同じ型として定義しないコーナーケースがあります.
もし私が抽象的に同じであるという事実を使用してより簡潔なコードを書くことができれば(私たちはこのシリーズの平等セクションでこれを後で説明します)、確かにそうします.
配列はオブジェクト
これは私が言うのはかなり簡単ですが、それを介して歩いてみましょう.
したがって、いくつかの変数が配列であることを確認したい場合は、配列コンストラクタを使用する必要があります
特殊型NaN
JSでは1つの誤解されたタイプで、私は、IEEEが毎回1ドルを支払ったならば、ナンがNASDAQで1対1であった数でないと思ったと思います.
ええ、NaNのように作られます
私は、それを呼び出していないIEEEを非難します
次の例を考えます.
さて、次の部分であなたに会いましょう
良いドリンクとあなたが非常に喜ばれる日、チリオ💜
サポート/フォローミー Github
Website
では、なぜJSが持っているタイプシステムに専用のシリーズを持っていないのですか?
この記事では、タイプとタイプについてすべてのbeastyを行くつもりです、そして、なぜ、あなたは本当にタイプを気にしなければなりませんか?
“ダブルイコールを使用して、トリプと同じように、”いくつかのコース、ブログでは、この勧告を参照してください
===
二重にわたって==
彼らが主張するように、それはコーナーケースを扱うことに関してよりよいです.地獄ノ私は、私がそのような主張を信じて、私のコース(記事)のいくつかでそれを広げさえした時に、それを主張しません.しかし、meh、我々はすべて愚かなことを行う.
だから、私たちのトピックを右に取得し、なぜ私はこの主張を刺激している理解してみましょう
どのような種類のJSがありますか?
確かに、あなたが使用する言語がどのようなタイプをサポートしているかを知っていますが、私とは裸で、それらを迅速に再訪問しましょう.
プリミティブ
オブジェクト
そして、すべての子孫
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は空のオブジェクトです
次のコードを考えます.
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を非難します
NavN
はNot a valid number
or NarN
はNot 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は実際に数字であるが、数値形式では表現できない特別な数である.さて、次の部分であなたに会いましょう
良いドリンクとあなたが非常に喜ばれる日、チリオ💜
サポート/フォローミー
Reference
この問題について(奇妙なJavaScriptタイプのシステム), 我々は、より多くの情報をここで見つけました https://dev.to/ahmedosama_st/the-weird-javascript-type-system-typeof-and-nans-3c9iテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol