あなたが知らないJS(中)のタイプと読書ノート(一)に値します.

11192 ワード

タイプ
ほとんどの開発者は、JavaScriptのような動的言語はタイプ(type)がないと考えています.ES 5.1の仕様がどのように定義されているかを見てみましょう.
  • この仕様では、演算法則によって操作される値はそれぞれのタイプがあり、すべての起こり得るタイプを定義しており、ECMAScriptタイプはさらに
  • に細分されている.
  • ECMAScript言語のすべての値に対応する言語タイプがあります.ECMAScript言語タイプはUndefined Null Boolean String Number Object
  • を含みます.
    あなたが知らないJSでは、「タイプ」を定義します.言語エンジンと開発者にとって、タイプは内部的な特徴があり、値を定義した行動は他の値と区別されます.
    1.1タイプ
    正確で合理的にタイプ転換を行うには、JavaScriptの中の各タイプとその内在的な行為を把握しなければなりません.ほとんどのJavaScriptプログラムは何らかの形式の強制的なタイプの転換に関わっています.
    1.2内蔵タイプ
    JavaScriptは7種類の内蔵タイプがあります.
  • 空き値(null)
  • 未定義(undefined)
  • ブール値
  • 数字(number)
  • 文字列(string)
  • オブジェクト
  • シンボル(smbol、ES 6追加)
  • //    typeof          ,           
    
    typeof undefined === 'undefined' // true
    typeof true      === 'boolean'   // true
    typeof 42        === 'number'    // true
    typeof '42'      === 'string'    // true
    typeof {a: 1}    === 'object'    // true
    
    // ES6       
    typeof symbol()  === 'symbol'    // true
    
    typeof null === 'object'   // true
    
    //         typeof               ,   null     'object',        'null',    bug     ,         
    
    //            null     
    
    const a = null
    (!a && typeof a === 'object')  // true
    
    typeof function a(){ /* .. */ } === 'function'  // true
    
    // function(  )      object    '   '.    :    '     ',         [[Call]],           
    
    typeof [1, 2, 3] === 'object'  // true
    
    //             
    
    1.3値とタイプ
    JavaScriptの変数にはタイプがありません.値だけがあります.変数はいつでも任意のタイプの値を持つことができます.
    1.3.1 undefinedとundeclared
  • 変数は、値を持たないときはundefined
  • である.
    var a;
    typeof a;  // 'undefined'
    
    var b = 42;
    var c;
    
    b = c
    
    typeof b;  // 'undefined'
    typeof c;  // 'undefined' 
    
    ほとんどの開発者はundefinedubdeclared( )と同等にする傾向があるが、JavaScriptでは全く別のものである.
  • は、スコープ内で宣言しましたが、まだ与えられていない変数です.undefined
  • です.
  • はまだスコープ内で宣言されていない変数です.undeclared
  • です.
    var a;
    
    a  // undefined
    b  // ReferenceError: b is not defined  ==>  undeclared
    
          :
    typeof a;  // 'undefined' 
    typeof b;  // 'undefined'  ==>      , typeof             (    )
    
    1.3.2 typeof Udeclard
    このセキュリティ保護機構は、ブラウザで実行されているJavaScriptコードにとっても有用です.複数のスクリプトファイルは共有されているグローバル名前空間に変数をロードします.
    // TODO1
              var DEBUG = true    debug.js     ,                    ,         ,                 DEBUG       ReferenceError  ,
       typeof                  
    
    //        
    if(DEBUG) console.log('debug is start')
    
    //     
    if(typeof DEBUG !== 'undefined') console.log('debug id start')
    
    //     API   ,
    if(typeof atob === 'undefined') atob = function() { /* Todo...  */ }
    

    配列文字列(string)と数字(number)は一番基本的な構成部分ですが、JavaScriptでは違った表現があります.いくつかの内蔵タイプを紹介します.それらを深く理解し、合理的に利用します.
    2.1配列
    他の強い言語とは異なり、JavaScriptでは、配列は任意の種類の値を収容することができます.
    let a = [1, '2', [3]]
    a.length       // 3
    a[0] === 1     // true
    a[2][0] === 3  // true
    
    配列宣言は値を追加できます.あらかじめサイズを設定する必要はありません.
    let a = []
    a.length  // 0
    a[0] = 1
    a[1] = '2'
    a[2] = [3]
    a.length  // 3
    
    !!!   
    
       delete            ,   ,      ,     length          
    
    2.1.1クラス配列
    ときには、クラス配列(1つのグループは、数値インデックスの値)を本物の配列に変換する必要があります.
    // DOM         DOM       &&    arguments   (   )              
    
    //      slice(...)          
    
    function foo() {
        let arr = Array.prototype.slice.call(arguments)
        arr.push('bam')
        console.log(arr)
    }
    foo('baz', 'bar')  // ['baz', 'bar', 'bam']
    
    // ES6 Array.from(...)     
    let arr = Array.from(arguments)
    
    2.2文字列
    文字列はしばしば文字配列として扱われます.文字列の内部実装は配列があるかどうかはよく分かりませんが、JavaScriptの文字列と文字配列は同じことではありません.
    let a = 'foo'
    let b = ['f', 'o', 'o']
    
    //        ,   length     indexOf() concat()  
    
    a.legnth                           // 3
    b.length                           // 3
    
    a.indexOf('o')                     // 1
    b.indexOf('o')                     // 1
    
    let c = a.concat('bar')            // 'foobar'
    let d = b.concat(['b', 'a', 'r'])  // ["f", "o", "o", "b", "a", "r"]
    
    //           '    '
    a[1] = 0  // a ==> 'foo'
    b[1] = 0  // b ==> ['f', 0, 'o']
    
    // JavaScript          ,        
    
  • 文字列が可変ではないということは、文字列のメンバー関数が元の値を変えずに新しい文字列を作成して返します.配列のメンバー関数は元の値で動作します.
  • の多くの配列関数は文字列を処理するのに便利であり、文字列にはこれらの関数がないが、「借用」配列の非変更方法によって文字列を処理することができる.
  • のもう一つの違いは文字列反転であり、配列には文字列にない変更可能なメンバー関数(reverse)
    a.join  // undefined
    a.map   // undefined
    
    let c = Array.prototype.join.call(a, '-')            // "f-o-o"
    let d = Array.prototype.map.call(a, function(v) {    // "F.O.O."
      return v.toUpperCase() + '.'
    }).join('')
    
  • がある.
    2.3数字
    JavaScriptは一つの数値タイプしかないです.number(数字)は「整数」と小数点以下の十進数を含んでいます.引用符をつけるのはJavaScriptが本当の意味での整数がないからです.
    javaScriptの「整数」は小数の十進数がないので、42.0は「整数」42に等しいです.
    2.3.1数字の文法
    JavaScriptの中の数字の定数は普通10進数表記に使われます.
    Array.prototype.reverse.call(a)  //      
    
    数字の前の0は無視できます.後ろの0も無視できます.
    const a = 42;
    const a = 42.3
    
    特に大きくて小さい数字のデフォルトは指数形式で表示され、toExponential()関数の出力結果と同じです.
    const a = 0.42
    const b = .42
    
    const c = 42.0
    const d = 42
    
    デジタル値はNumberを呼び出すことができます.
    const a = 5E10      // a ==> 50000000000
    a.toExponential();  // "5e+10"
    
    2.3.2より小さい数値
    バイナリ浮動小数点数が最大の問題は、次のような状況が発生します.
    const a = 42.59
    
    a.toFixed(0)  // 43
    a.toFixed(1)  // 42.6
    
    小数点以下の数字を扱う時に注意が必要です.多くのプログラムは整数だけを処理する必要があります.この時、JavaScriptを使う数字の種類は絶対安全です.0.1 + 0.2 0.3が等しいかどうかをどう判断しますか?
  • 一般的に誤差範囲値を設定します.一般的に「機械精度」と呼ばれます.jsにとって、この値は一般的に2^-52
  • です.
  • ES 6は、Number.EPSLIONにおいて定義されており、
    0.1 + 0.2 === 0.3  // false
    
  • を直接使用することができる.
    2.3.3整数の安全範囲
    数字の提示方式は、「整数」のセキュリティ値の範囲がNumber.MAX_VALUEよりも遥かに小さいことを決定している.
    「セキュリティ」によって表現できる最大の整数は2^53 - 1、すなわち9007199254740991であり、ES 6ではNumber.MAX_SAFE_INTEGERと定義され、最小の整数は-9007199254740991であり、ES 6ではNumber.MIN_SAFE_INTEGERと定義されている.
    2.3.4整数検出
    整数が整数かどうかを検出するには、ES 6のNumber.isInteger()方法が使用されてもよい.
    // ES6   
    if(!Number.EPSLION) {
      Number.EPSLION = Nath.pow(2, -52)
    }
    
    function numbersCloseEnoughEqual(a, b) {
      return Math.abs(a - b) < Number.EPSLION
    }
    
    let a = 0.1 + 0.2
    let b = 0.3
    numbersCloseEnoughEqual(a, b)  // true
    
    ES 6以前のバージョンpolifill Number.isInteger()方法
    Number.isInterger(42)     // true
    Number.isInteger(42.000)  // true
    Number.isInteger(42.3)    // false
    
    安全な整数かどうかの値を検出し、ES 6のNumber.isSafeInteger()方法を使用することができる.
    if(!Number.isInteger) {
      Number.isInteger = function(num) {
        return typeof num == 'number' && num % 1 == 0
      }
    }
    
    2.4特殊な値
    JavaScriptデータの種類にはいくつかの特殊な値があります.
    2.4.1値ではない値undefinedタイプは一つの値しかないです.つまり、undefinedタイプも一つの値しかないです.つまり、nullです.その名前はタイプであり、値です.
  • nullは、空の値null=>未割り当て
  • を指します.
  • undefinedは、(empty value)=>値が与えられていないことを指しますが、現在は
  • 値がありません.
    2.4.2 undefined
    非厳密モードでは、グローバル識別子undefinedに値を割り当てることができる(設計はあまり考慮されていない)
    Number.isSafeInteger(Number.MAX_SAFE_INTEGER)  // true
    Number.isSafeInteger(Math.pow(2, 53))          // fale
    Number.isSafeInteger(Math.pow(2, 53) - 1)      // true
    
    (misssing value)表式void には戻り値がないので、void __.undefinedは表式の結果を変えずに表式を返さないだけです.
    function foo() {
      undefined = 2  //     
    }
    
    function foo() {
      'use strict'
      undefined = 2  // TypeError
    }
    
             undefined
    
    voidを利用して、void 0(主にC言語から)を獲得します.undefinedとundefinedは実質的な違いがありません.
    つまり、コードの値(式の戻り値など)をundefinedとするなら、voidを使用することができます.
    2.4.3特殊な数字
    数字の種類にはいくつかの特殊な値があります.
  • は数字ではありません.
  • void 0は、「1つの数字ではない」という意味です.
    var a = 42
    console.log(void a, a)  // undefined 42
    
  • NaNは、数字の種類におけるエラーを指摘するための「警戒値」であり、すなわち「数学演算が成功しなかった.これは失敗して戻った結果」
  • である.
  • void 1
  • 無限数
    var a = 2 / 'foo'      // NaN
    typeof a === 'number'  // true
    
  • ゼロ値
  • JavaScriptは、従来のNaNNaN !== NaN // true
  • があります.
    var a = 1 / 0   // Infinity
    var b = -1 / 0  // -Infinity
    
    2.4.4特殊式
    ES 6に新たにツール方法0を追加し、上記のすべての状況を処理するために使用することができる.
    var a = 0 / -3
    var b = 0 * -3
    
    -0およびObject.is() を使用できるときは、できるだけ==を使用しないでください.前者の効率がより高く、より一般的であるため、===を使用してください.
    2.5値と参照
  • は、多くのプログラミング言語において、割当およびパラメータ伝達は、Object.is()またはObject.is()
  • を介して行われてもよい.
  • JavaScriptにはポインタがありません.参照の動作メカニズムも同じではありません.JavaScriptにおいて変数は他の変数への参照にはなり得ません.
  • JavaScript参照の指向は、値であり、10個の参照がある場合、これらの参照は同じ値を指し、 (value-copy)
  • JavaScriptは、値と参照の割り当て/伝達を文法的に区別せず、完全に値の種類によって決定する
  • .
    var a = 2 / 'foo'
    var b = -3 * 0
    
    Object.is(a, NaN)  // true
    Object.is(b, -0)   // true
    
    Object.is(b, 0)    // false
    
    let a = 2
    let b = 2 // b   a     
    b++
    a  // 2
    b  // 3
    
  • 単純値(すなわちスカラベースタイプ値、scalar prmitive)は、常に値コピーによって値/転送を与え、 (reference-copy)
  • を含む.
  • 複合値(compund value)−オブジェクト(配列とパッケージオブジェクトを含む)と関数は、常に参照コピーによって値/転送
  • を与えられる.
  • は、参照が変数ではなく、値そのものを指すため、他の参照の方向を変更することができない
    let c = [1, 3 ,5]
    let d = c  // d   [1, 3, 5]      
    d.push(7)
    c  // [1, 3, 5, 7]
    d  // [1, 3, 5, 7]
    
  • である.
  • 関数パラメータの戸惑い
    var a = [1, 2, 3]
    var b = a
    a  // [1, 2, 3]
    b  // [1, 2, 3]
    
    b = [4, 5, 6]
    a  // [1, 2, 3]
    b  // [4, 5, 6]
    
    // b = [4, 5, 6]      a     [1, 2, 3].    b          ,      a    , js       
    
  • 参照xによって参照aの指向性を変更することはできません.aとxの共通参照値
  • だけ変更できます.
    function foo(x) {
      x.push(4)
      x;  // [1, 2, 3, 4]
    
      x = [4, 5, 6]
      x.push(7)
      x;  // [4, 5, 6, 7]
    }
    let a = [1, 2, 3]
    foo(a)
    
    a;  //  [1, 2, 3, 4]   [4, 5, 6, 7]
    
    //       a    ,       a          x,   a     [1, 2, 3]
    //            x        ,   x = [4, 5, 6]      a    ,   a   [1, 2, 3, 4]
    
  • 私達は自分で値を使ってコピーするかそれとも引用コピーするかを決めることができません.すべての値の種類によって
  • を決定します.
  • は、行列などの複合値を、値コピーによって伝達し、複素を作成する必要があり、このように伝達されるのは、元の値ではない.
    function foo(x) {
      x.push(4)
      x;  // [1, 2, 3, 4]
    
      x.length = 0;  //     
      x.push(4, 5, 6, 7)
      x;  // [4, 5, 6, 7]
    }
    let a = [1, 2, 3]
    foo(a)
    
    a;  //  [4, 5, 6, 7]   [1, 2, 3, 4]
    
    // x.length = 0   x.push(...)        .