blog

JavaScriptのデータ型に関する問題

nullとundefinedの違い、nullを判定するときの注意点は?\ntypeof nullはなぜObjectなのか、null値の型を検出するために何を使うのか?\nなぜES6はSymbolを提案...

Mar 10, 2024 · 7 min. read
シェア

比較演算子とは何ですか? ==、===、Object.is()の違いは何ですか?

オブジェクトが空かどうかをどのようにして判断しますか?

constオブジェクトプロパティは変更できますか?

0.1+0.2!==0.3? これをどのように解決しますか?

1. nullとundefinedの違いは何ですか? 何かが空かどうかを判断する際に注意すべきことは何ですか?

どちらも基本データ型です。undefinedは未定義、nullは空オブジェクトを意味します。

ini

undefined == null;

undefined === null;

nullは「何も無い」を表すオブジェクトであり、数値に変換すると0になります。undefinedは「何も無い」を表すプリミティブ値であり、数値に変換するとNaNになります。

変数が宣言されているが初期化されていない場合、既定値は undefined となります。

Null はオブジェクトが存在しないことを示すために使用されます。 また、存在しないオブジェクトを返そうとする関数を表す場合にもよく使用されます。

undefined は値が欠落していることを示します。 本来は値が存在すべきであるが、定義されていないことを意味します。 典型的な使用例としては、

  1. 変数が宣言されているが値が割り当てられていない場合、これは undefined と同等です。
  2. 関数が呼び出された際に、提供されるべきパラメータが提供されない場合、そのパラメータは未定義となります。
  3. オブジェクトに割り当てられたプロパティがない場合、そのプロパティの値は未定義となります。
  4. 関数が値を返さない場合、デフォルトでは未定義が返されます。

nullはオブジェクトが存在しないことを示します。つまり、そこに値があってはならないということです。典型的な使用例は以下の通りです。

  • JSのオリジナルバージョンでは、変数はビットで表現され、先頭のビットが値のタイプを示すのに使用されます。 オブジェクト、浮動小数点数、文字列、ブール値を表します。 それ以外はすべてポインタと見なされます。 この表現では、nullのマシンコードはallとして表現され、完全なポインタとして解釈され、先頭のビットはallであるため、nullオブジェクト参照と見なされます。
  • null値のタイプを検出するには、複合条件を使用します。

    var a = null;
    (!a && typeof a === "object"); // true
    

    ES6がSymbolを提案した理由は?

    • Symbolはプリミティブデータ型です。インスタンスは一意で不変です。
    • Function: オブジェクトのプロパティが一意の識別子を使用するようにします。プロパティの競合の危険性はありません。
    var bar = Symbol('qwer');
    var a = Symbol('qwer');
    bar == a;

    ES6がBigIntを提案した理由は?

    BigIntは、より大きな整数を表すために使用される新しいプリミティブデータ型です。 整数の末尾に接尾辞nを追加することで、BigIntに変換することもできます。

     const big1 = BigInt();
     const big2 = n;
    

    なぜBigIntなのか?

    JavaScriptのNumber.MAX_SAFE_INTEGERは最大の安全な数値を表し、計算結果は9007199254740991です。この数値の範囲内では精度が失われることはありません。 しかし、この範囲を超えると、jsは正確な計算ができなくなり、大きな数値を計算する際にはサードパーティのライブラリに頼らざるを得なくなります。そのため、この問題を解決するために正式なBigIntが導入されました。

    データ型を検出する方法は? 違いは? 利点と欠点は?

    typeofは正確に元のデータ型を検出できますが、複雑なデータ型は判断できません。Array Function
    instanceofは複雑なデータ型を判断できますが、元のデータ型は判断できません。
    /** * typeof 

    オブジェクト、配列、nullの場合、オブジェクトとみなされます。その他の判定は正しく行われます

    */

    typeof 1 //'number'

    typeof true //'boolean'

    typeof 'ddd' //'string'

    sym1 = Symbol('jkj')

    typeof sym1 //'symbol'

    typeof [] //'object'

    typeof {} //'object'

    typeof function(){} //'function'

    typeof undefined //'undefined'

    typeof null //'object'

    /**

    * instanceof は、プリミティブデータ型とオブジェクトデータ型を区別できません

    */

    2 instanceof Number //false

    true instanceof Boolean //false

    'ertt' instanceof String //false

    [] instanceof Array //true

    {} instanceof Object // Uncaught SyntaxError: Unexpected token 'instanceof'

    ({}) instanceof Object //true

    function(){} instanceof Function //Uncaught SyntaxError: Function statements require a function name

    (function(){}) instanceof Function //true

    null instanceof null //Uncaught TypeError: Right-hand side of 'instanceof' is not an object

    undefined instanceof undefined //Uncaught TypeError: Right-hand side of 'instanceof' is not an object

    * コンストラクタ

    * には2つの機能があります。

    * データの種類を決定する

    * オブジェクトのインスタンスは、コンストラクタオブジェクトを介してコンストラクタにアクセスします

    * 新しいオブジェクトを作成してプロトタイプを変更すると、機能しません

    */

    (2).constructor === Number //true

    ('abc').constructor === String //true

    (true).constructor === Boolean //true

    ([]).constructor === Array //true

    ({}).constructor === Object //true

    (function(){}).constructor === Function //true

    // プロトタイプを変更するために新しいオブジェクトを作成した場合は、これは動作しません

    function Fn(){}

    Fn.prototype = new Array()

    var f = new Fn()

    console.log(f.constructor == Function); // false

    console.log(f.constructor == Array); // true

    * Object.prototype.toString.call() は、

    * Object プロトタイプで toString メソッドを呼び出すための最良の方法です。

    * データタイプを決定するには、Object プロトタイプメソッドを使用します。

    */

    Object.prototype.toString.call(2) //'[object Number]'

    Object.prototype.toString.call('www') //'[object String]'

    Object.prototype.toString.call(false) //'[object Boolean]'

    Object.prototype.toString.call({}) //'[object Object]'

    Object.prototype.toString.call([]) //'[object Array]'

    Object.prototype.toString.call(function(){}) //'[object Function]'

    Object.prototype.toString.call(null) //'[object Null]'

    Object.prototype.toString.call(undefined) //'[object Undefined]'

    Object.prototype.toString.call(123456789012345678901234567890n) //'[object BigInt]'

    Object.prototype.toString.call(Symbol('id')) //'[object Symbol]'

    6. 比較演算子は何ですか? ==、===、Object.is() の違いは何ですか?

    ==値が同一でない場合、比較の前に型変換が実行されます
    ===比較の前に型変換は実行されません
    Object.is()=== と同様ですが、特殊な問題を解決できます -0 および +0 NaN および NaN の特殊な比較
    -0x0 == +0x0 - 0x0 === +0x0;
    Object.is(-0x0, +0x0);
    NaN == NaN;
    NaN === NaN;
    Object.is(NaN, NaN);

    オブジェクトが空かどうかを判断するにはどうすればよいですか?

    function isObj(params){
     if(JSON.stringify(params) == '{}') return true
     return false
     }
     function isObj(params){
     // es6新しいメソッドObject.keys
     // オブジェクトを反復処理する オブジェクトの各キーの配列を返す
     if(Object.keys(params).length <=0) return true
     return false
     }

    オブジェクトの定数プロパティは変更可能ですか?

    • const は変数の値が変更されないことを保証するものではなく、変数によって指し示されるメモリアドレスが変更されないことを保証するものです。
    • 基本データ型の場合、その値は変数によって指し示されるポインタアドレスに格納されるため、定数と同等です。
    • しかし、参照型の場合は、変数はデータのメモリアドレスを指しており、ポインタのみが格納されています。constは、このポインタが固定され変更されないことを保証するのみで、ポインタが指すデータ構造が変更可能かどうかは制御できません。

      PS: オブジェクトを固定するには、Object.freezeメソッドを使用します。

      'obj': 0xf,

      'name': '小明'

      };

      b.obj = 0x10;

      Object.freeze(b);

      b.obj = 0xc;

    +0.2!==0.3? どのように解決しますか?

    数学的に言えば、上記の条件は真であるべきですが、なぜ結果が偽になるのでしょうか?

    簡単に言えば、2進浮動小数点数である0.1と0.2はそれほど精度が高いものではありません。それらの加算結果は正確に0.3ではなく、0.30000000000000004に非常に近い数値となります。したがって、条件は偽となります。

    では、0.1 + 0.2 が 0.3 と等しいかどうかをどのように判断すればよいのでしょうか?

    最も一般的な方法は、誤差範囲を設定することです。これは「マシン精度」と呼ばれることが多いです。JavaScript の数値では、通常は 2^-52 です。

    ES6 以降、この値は Number.EPSILON で定義されており、直接使用することも、ES6 バージョン用のポリフィルを記述することもできます。

    Number.EPSILON を使用して、2つの数値の等価性を比較することができます。

    js

    function c(bar, A) {

    return Math.abs(bar - A) <

    Number.EPSILON;

    }

    var foo = 0.1 + 0.2;

    var obj = 0.3;

    c(foo, obj);

    c(1e-7, 2e-7);

    表現可能な浮動小数点数で最大の数は、およそ 1.798e+308 で、Number.MAX_VALUE で定義されています。最小の浮動小数点数は、Number.MIN_VALUE で定義されており、およそ 5e-324 です。これは負の数ではなく、0 に限りなく近い数です!

    JavaScript: The Good Parts

    Fourth Edition

    Read next

    第2章 AIビッグモデルの基礎 2.3 開発環境とツール 2.3.1 主流AIフレームワークの紹介

    1.背景 AI技術の発展に伴い、AIビッグモデルは研究やアプリケーションの重要な一部となっています。これらのビッグモデルは、通常、学習に大量の計算資源とデータを必要とするため、その開発と展開をサポートする効率的な開発環境とツールが必要となります。本章では

    Mar 5, 2024 · 7 min read