JavaScript データ型の分析
最近JSの基礎を復習していたのですが、BigIntとNumberの理解が浅く、NaNの理解も進んでいないことが判明したので、詳しく解説する記事を書こうと思います。
参考記事:
- Javascript のデータ型の詳細な説明 - Nuggets (juejin.cn)
- JavaScript の基本データ型 - ナゲット (juejin.cn)
- JavaScript データ型 | 初心者向けチュートリアル (runoob.com)
- ECMAScript 6 の概要 (ruanyifeng.com)
- コンストラクターとプロトタイプ オブジェクトを理解する - Nuggets (juejin.cn)
⭐ヒント: この記事を学習すると、JavaScript の 8 つのデータ型について幅広く理解できるようになります。初心者が見て復習するのには適していますが、深く理解するのには適していません。
- JSには2つのデータ型があります
- 基本データ型: 数値、文字列、ブール値、Null、未定義、シンボル (ES6 の新機能)、BigInt (ES11 の新機能)
- 参照データ型: オブジェクト (プレーンオブジェクト、関数、日付、数学、配列など)
基本的なデータ型
特性
- 対応するプリミティブ値を含むラッパー オブジェクト(数値、文字列など) 。
- スタックメモリに格納される単純なデータ セグメント。
- データは不変です。つまり、強制的に変更することはできず、
Array.prototype.sort.call('abc')
変更するとエラーが報告されます。 - プロトタイプチェーンには
_proto_
プロパティが。
判断
- を使用してデータ型
typeof
を決定。 - ここで注意すべき点は、
typeof(null) == 'object'
null の型が object と誤って判断されることです。null
検出エラーが発生することは歴史に残された問題です。 のJS
初期、32 ビット システムが使用されていました。パフォーマンスを考慮して、下位の記憶変数の型情報が使用されました。000
先頭はオブジェクトを表していましたが、すべて 0 をnull
表していましたと誤って判断されてしまいましたobject
。
タイプ | 結果 |
---|---|
弦 | "弦" |
番号 | "番号" |
ブール値 | 「ブール値」 |
未定義 | "未定義" |
オブジェクト、配列、正規表現、null、日付、エラー | "物体" |
関数 | "関数" |
シンボル (ES6 の新機能) | "シンボル" |
BigInt (ES11 の新機能) | 「ビギント」 |
番号
- 数値は、数値または科学的表記法を使用して直接定義できます。
- JavaScript の基本データ クラス Number は、倍精度浮動小数点数です。表現できる最大安全範囲は、プラスまたはマイナス 9007199254740991、つまり、2 の 53 乗マイナス 1 と、2 から 53 より大きいすべての数値です。パワーを表現できます
BigInt
。
let x1 = 34.00
let x2 = 34
let x3 = 123e5
let x4 = 123e-5
let x5 = new Number(123)
NaN
- ここがNumber
typeof NaN
の。 - NaN プロパティは、非数値を表す特別な値です。この属性は、値が数値ではないことを示すために使用されます。Number オブジェクトをこの値に設定して、それが数値ではないことを示すことができます。
- isNaN() グローバル関数は、値が NaN 値であるかどうかを判断します。
typeof NaN === "number" // true
// NaN 同任何数比较均为false
NaN === NaN // false
isNaN("0") // false
isNaN("ssss") // true
BigInt
- Bigint は、整数リテラルを追加するか、演算子なしで関数
n
を呼び出すことによって定義できますが、キーワード。BigInt()
new
new
BigInt
は、任意の精度で整数を表現できるJavaScript の新しいプリミティブ型です。を使用すると、大きな整数がBigInt
JavaScript の安全な整数制限を超えている場合でもNumber
、安全に保存および操作できます。- ES11で追加されました。
let x1 = 123n
let x2 = BigInt(123)
- BigInt は Number とは異なります。
Math
オブジェクト内のメソッドには使用できません。- どのインスタンスとも混合することはできません
Number
。両方を同じタイプに変換する必要があります。変数に変換すると精度が失われる可能性があるため、2 つの型を相互BigInt
に変換する場合は注意してください。Number
弦
- 文字列は、文字列を使用して直接定義できます。
- null、unknown に加えて、その他の
toString
値もメソッドを通じて対応する文字列の値を取得できます。
let s1 = "qwe"
let s2 = new String("sad")
let s3 = 'sdg'
let s4 = `dbs`
({
}).toString() // [object Object]
(123).toString() // "123"
// 字符串与其他类型相加会发生奇怪的事情
{
} + '' // 0
[] + '' // ''
ブール値
-
true と false はブール値です。
-
JS では次の 7 つの値のみが false になります。
- 未定義
- ヌル
- 間違い
- NaN
- 」
- 0
- -0
-
残りはすべて true です。
Boolean(null) // false
Boolean(undefined) // false
Boolean(4) // false
ヌル
- null は Null データ型です。
- その式は null です。メモリを解放したり、割り当てを初期化したりするためによく使用されます。これは未定義と同等ですが、厳密には未定義と同等ではありません。
let a = null
undefined == null // true
undefined === null // false
未定義
- unknown は、未定義のデータ型です。
- その意味は未定義、または未定義です。これは null と等価ですが、厳密には null と等しくありません。
let a = undefined
null == undefined // true
null === undefined // false
シンボル
ES5 のオブジェクト プロパティ名はすべて文字列であるため、プロパティ名の競合が簡単に発生する可能性があります。たとえば、他人が提供したオブジェクトを使用しているが、このオブジェクトに新しいメソッド (ミックスイン モード) を追加したい場合、新しいメソッドの名前が既存のメソッドと競合する可能性があります。属性名の競合を根本的に防ぐために、各属性の名前が一意であることを保証するメカニズムがあれば素晴らしいと思います。ES6 がそれを導入したのはそのためですSymbol
。
Symbol
、一意の値を表します。- シンボル値は
Symbol()
関数によって生成されます。 - オブジェクトの属性名には 2 種類あり、1 つは元の文字列、もう 1 つは新しく追加された Symbol タイプです。シンボル タイプに属するすべての属性名は一意であり、他の属性名と競合しないことが保証されます。
let s = Symbol();
typeof s
// "symbol"
let s1 = Symbol('foo');
let s2 = Symbol('bar');
s1 // Symbol(foo)
s2 // Symbol(bar)
s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)"
- さらに詳しく知りたい場合は、Ruan Yifeng 先生の記事を読むことができます。この記事は非常によく書かれています: Symbol - Getting Started with ECMAScript 6 (ruanyifeng.com)
参照データ型
特性
- 参照型の作成時に 2 つのスペースが割り当てられます。
- 1つはヒープ上に、参照型そのもののデータを格納しています(もちろんデータ量は比較的多くなります)
- 1 つはスタック、ヒープ上のデータへの参照を格納します (ヒープ上のメモリ アドレス、つまりポインタを格納します)。
- 参照型は変更可能です。つまり、
let a={}; a.x=1;
function
パラメータは値によって渡され、参照は変更できません
判断
- 最も正確な
Object.prototype.toString.call
検出
let a = function (){
}
let b = []
let c = {
}
Object.prototype.toString.call(a) // [object Function]
Object.prototype.toString.call(b) // [object Array]
Object.prototype.toString.call(c) // [object Object]
typeof a // function
typeof b // object
typeof c // object
物体
- JS はすべてがオブジェクトです
- JavaScript には、String、Date、Array などのいくつかの組み込みオブジェクトが用意されています。オブジェクトは、プロパティとメソッドを備えた特別なデータ型にすぎません。
- ブール値はオブジェクトにすることができます。
- 数値型はオブジェクトにすることができます。
- 文字列もオブジェクトになることができます
- 日付はオブジェクトです
- 数学や正規表現もオブジェクトです
- 配列はオブジェクトです
- 関数さえもオブジェクトになることができる
let x1 = {
}
let x2 = new Object()
// 基本类型的包装类 使用typeof判为object
let x3 = new String()
let x4 = new Number()
typeof x1 // "object"
typeof x2 // "object"
typeof x3 // "object"
typeof x4 // "object"
関数
- 関数は特別な種類のオブジェクトです
- 関数は関数コード ブロックでもあり、閉じた間隔が短いスクリプトです。同じコード部分が複数回使用される場合は、関数にカプセル化して、関数を使用してコード内で必要に応じて使用できるようにします。
- 数値のカプセル化により、同じコンテンツを何度も繰り返し入力する必要がなくなりますが、この関数の本当の威力はパラメーターを渡す機能にあり、異なるデータをパラメーターに渡し、これらのデータを使用して所定の操作を完了することができます。
- 関数は、変数、配列、またはオブジェクトに格納できる第一級のオブジェクト、および値です。
- 関数は関数に渡したり関数から返したりすることができ、関数にはプロパティがあります。
- 関数には常に戻り値があります (つまり、コンストラクター関数を除いて return ステートメントがあります。これは、デフォルトでコンストラクター関数呼び出しが返され、コンストラクター呼び出しが実行されると表示が返されるためです)。
var funA = function(){
console.log("我是匿名函数保存在变量funA中");
}
var funB = [function(){
console.log("我是匿名函数保存在数组funB中");
}]
var funC = {
method:function(){
console.log("我是匿名函数保存在对象funC中");
}
}
// 函数的调用
funA(); // 普通函数的调用
funB[0](); // 函数存入数组中的调用
funC.method(); // 对象调用方法的使用
⭐以上がこの記事の全内容です、お役に立てましたら「いいね!」をお願いします