js言語における異なるデータタイプの序列化と逆順序化

73155 ワード

最新更新日時:2020年08月06日22:51:48《 - - 》データの順序付けとは、StringタイプではないデータをStringタイプに変換するデータのことである.データのアンチプログレッシブとは、プログレッシブ後のStringタイプのデータをプログレッシブ前のタイプに変換するデータのことです.
JavaScriptデータタイプの識別方法及び制限
  • 4つの方法:typeof𞓜instance of𞓜construct 124124124; Object.prototype.toString
  • //typeof         
    //           Null     object
    //            Function  
    console.log(typeof 1);//number
    console.log(typeof '');//string
    console.log(typeof true);//boolean
    console.log(typeof undefined);//undefined
    console.log(typeof function(){
         });//function
    console.log(typeof null);//object
    console.log(typeof new Date());//object
    console.log(typeof /[a-z]/);//object
    console.log(typeof []);//object
    console.log(typeof {
         });//object
    console.log('----------------');
    //instanceof                       Object   
    //          (      )           
    //        (      )   false
    //    undefined null    
    console.log(1 instanceof Number);//false
    console.log('' instanceof String);//false
    console.log(true instanceof Boolean);//false
    // console.log(undefined instanceof undefined);//  
    console.log(function(){
         } instanceof Function);//true
    // console.log(null instanceof null);//  
    console.log(new Date() instanceof Date);//true
    console.log(/[a-z]/ instanceof RegExp);//true
    console.log([] instanceof Array);//true
    console.log([] instanceof Object);//true
    console.log(function(){
         } instanceof Object);//true
    console.log({
         } instanceof Object);//true
    console.log('----------------');
    //constructor       
    //        (      )、      (      )、     
    //    undefined、null   ,          
    console.log((1).constructor);//function Number() { [native code] }
    console.log(('').constructor);//function String() { [native code] }
    console.log(true.constructor);//function Boolean() { [native code] }
    // console.log(undefined.constructor);//  
    console.log((function(){
         }).constructor);//function Function() { [native code] }
    // console.log(null.constructor);//  
    console.log((new Date()).constructor);//function Date() { [native code] }
    console.log(/[a-z]/.constructor);//function RegExp() { [native code] }
    console.log([].constructor);//function Array() { [native code] }
    console.log({
         }.constructor);//function Object() { [native code] }
    console.log('----------------');
    //Object.prototype.toString               
    //        (      )       (      )          
    console.log(Object.prototype.toString.call(1));//[object Number]
    console.log(Object.prototype.toString.call(''));//[object String]
    console.log(Object.prototype.toString.call(true));//[object Boolean]
    console.log(Object.prototype.toString.call(undefined));//[object Undefined]
    console.log(Object.prototype.toString.call(function () {
         }));//[object Function]
    console.log(Object.prototype.toString.call(null));//[object Null]
    console.log(Object.prototype.toString.call(new Date()));//[object Date]
    console.log(Object.prototype.toString.call(/[a-z]/));//[object RegExp]
    console.log(Object.prototype.toString.call([]));//[object Array]
    console.log(Object.prototype.toString.call({
         }));//[object Object]
    
    ボロア
    let a = true;
    //   
    let serializationA = JSON.stringify(a);
    //    
    let deserializationA = JSON.parse(serializationA);
    console.log(typeof serializationA);//string
    console.log(typeof deserializationA);//boolean
    
    Number
    let a = 1;
    //   
    let serializationA = JSON.stringify(a);
    //    
    let deserializationA = JSON.parse(serializationA);
    console.log(typeof serializationA);//string
    console.log(typeof deserializationA);//number
    
    Udefined
  • undefinedタイプは、逆シーケンス番号
  • を実行できません.
    エラー:Uncauht SyntxError:Unxpected token u in JSON at position 0
    let a = undefined;
    //   
    let serializationA = JSON.stringify(a);
    console.log(typeof serializationA);//undefined
    //       
    let deserializationA = JSON.parse(serializationA);//   
    
    Null
    let a = null;
    //   
    let serializationA = JSON.stringify(a);
    //    
    let deserializationA = JSON.parse(serializationA);
    console.log(typeof serializationA);//string
    console.log(typeof deserializationA);//object
    
    Regexp
  • 正規表現は、空のオブジェクト
  • に変換されます.
    let a = /[a-z]/ig;
    //   
    let serializationA = JSON.stringify(a);
    //    
    let deserializationA = JSON.parse(serializationA);
    console.log(serializationA);//{}
    console.log(deserializationA);//{}
    
    Aray
    let a = [1,2,3];
    //   
    let serializationA = JSON.stringify(a);
    //    
    let deserializationA = JSON.parse(serializationA);
    console.log(typeof serializationA);//string
    console.log(deserializationA instanceof Array);//true
    
    Object
  • シーンの一:対象にネストがなく、JSON.strigifyとJSON.parseを使ってプログレッシブとアンチプログレッシブを行う;
  • オブジェクトの値が関数であれば、直接にkvペアを失う.オブジェクトの値が正規表現であれば、正規表現は空のオブジェクトに変換されます.
  • let a = {
         
        a: 1,
        b: 'wan',
        c: '',
        d: null,
        e: undefined,
        f: true,
        g: function(){
         console.log('g')},
        h: /d+$]/ig,
        j: [1, 2, 3]
    };
    //   
    let serializationA = JSON.stringify(a);
    console.log(serializationA);//{"a":1,"b":"wan","c":"","d":null,"f":true,"h":{},"j":[1,2,3]}
    //    
    let deserializationA = JSON.parse(serializationA);
    console.log(deserializationA);//{ a: 1, b: 'wan', c: '', d: null, f: true, h: {}, j: [ 1, 2, 3 ] }
    
  • シーン2:オブジェクトにネスティングされていない、互換性のある関数と正規表現のスキームですが、データのタイプが失われ、逆プログレッシブ化される過程でも疑似的な方法にすぎません.
  • let a = {
         
        a: 1,
        b: 'wan',
        c: '',
        d: null,
        e: undefined,
        f: true,
        g: function(){
         },
        h: /d+$/ig,
        j: [1, 2, 3]
    };
    //   
    function serialization(a){
         
        var res = [];
        for (let key in obj) {
         
            if(obj[key] === ''){
         
                res.push(key + ':' + '""')
            }else if(Array.isArray(obj[key])){
         
                res.push(key + ':[' + obj[key] + ']')
            }else{
         
                res.push(key + ':' + obj[key])
            }
        }
        return res.join('|')
    }
    let seri = serialization(obj)
    console.log(seri);;// a:1|b:wan|c:""|d:null|e:undefined|f:true|g:function(){}|h:/d+$]/gi|j:[1,2,3]
    //    
    function deserialization(str){
         
        let res = {
         };
        str.split('|').forEach((item)=>{
         
            let kv = item.split(':')
            if(kv[1] === 'null'){
         
                kv[1] = null
            }else if(kv[1] === 'undefined'){
         
                kv[1] = undefined
            }else if(kv[1] === '""'){
         
                kv[1] = ''
            }else if(kv[1] === 'true'){
         
                kv[1] = true
            }else if(kv[1] === 'false'){
         
                kv[1] = false
            }else if(kv[1].indexOf('function') > -1 || kv[1].indexOf('[') > -1 || kv[1].indexOf('/') > -1){
         
                kv[1] = eval('(' + kv[1] + ')')
            }
            res[kv[0]] = kv[1]
        })
        return res
    }
    let deseri = deserialization(seri);
    console.log(deseri);//{ a: '1', b: 'wan', c: '', d: null, e: undefined, f: true, g: function(){}, h: /d+$]/gi, j: [ 1, 2, 3 ] }
    
  • シーン3:オブジェクトがネストされ、データのタイプが失われ、逆順序化されている過程でも疑似的な方法にすぎない.
  • let a = {
         
        a: 1,
        b: 'wan',
        c: '',
        d: null,
        e: undefined,
        f: true,
        g: function(){
         },
        h: /d+$/ig,
        j: [1, 2, 3],
        k: [1, 2, [3]],
        m: [1, 2, {
         m1:1}, function(){
         }],
        n:{
         n1:1, n2:function(){
         }, n3:/[a-z]/ig, n4:[4,5,6], n5:{
         n51:1}}
    };
    //   
    function serialization(obj){
         
        function arr2arr(arr){
         
            let res = '['
            arr.forEach((item)=>{
         
                if(Object.prototype.toString.call(item) === '[object Object]'){
         
                    res += '{' + serialization(item) + '},'
                }else if(Object.prototype.toString.call(item) === '[object Array]'){
         
                    res += arr2arr(item) + ']'
                }else{
         
                    res += item + ','
                }
            })
            res = res.slice(0,res.length-1)
            return res + ']'
        }
        var res = [];
        for (let key in obj) {
         
            if(obj[key] === ''){
         
                res.push(key + ':' + '""')
            }else if(Object.prototype.toString.call(obj[key]) === '[object Object]'){
         
                res.push(key + ':{' + serialization(obj[key]) + '}');
            }else if(Object.prototype.toString.call(obj[key]) === '[object Array]'){
         
                let temp = arr2arr(obj[key])
                res.push(key + ':' + temp);
            }else{
         
                res.push(key+':'+obj[key]);
            }
        }
        return res
    }
    var seri = serialization(a).join('|');//a:1|b:wan|c:""|d:null|e:undefined|f:true|g:function(){}|h:/d+$/gi|j:[1,2,3]|k:[1,2,[3]]|m:[1,2,{m1:1},function(){}]|n:{n1:1,n2:function(){},n3:/[a-z]/gi,n4:[4,5,6],n5:{n51:1}}
    //    
    function deserialization(str){
         
        let res = {
         };
        let regArr = /^\[.*\]$/ig;// [                  (         )  ]  
        let regObj = /^\{.*\}$/ig;
        str.split('|').forEach((item)=>{
         
            //        lastIndex  
            regArr.lastIndex = -1
            regObj.lastIndex = -1
            // let kv = item.split(':')
            let kv = [item.slice(0,item.indexOf(':')), item.slice(item.indexOf(':')+1)]
            if(kv[1] === 'null'){
         
                kv[1] = null
            }else if(kv[1] === 'undefined'){
         
                kv[1] = undefined
            }else if(kv[1] === '""'){
         
                kv[1] = ''
            }else if(kv[1] === 'true'){
         
                kv[1] = true
            }else if(kv[1] === 'false'){
         
                kv[1] = false
            }else if(regArr.test(kv[1]) || regObj.test(kv[1])){
         
                kv[1] = eval('(' + kv[1] + ')')
            }
            res[kv[0]] = kv[1]
        })
        return res
    }
    let deseri = deserialization(seri);//{ a: '1',b: 'wan',c: '',d: null,e: undefined,f: true,g: 'function(){}',h: '/d+$/gi',j: [ 1, 2, 3 ],k: [ 1, 2, [ 3 ] ],m: [ 1, 2, { m1: 1 }, [Function] ],n:{ n1: 1,n2: [Function: n2],n3: /[a-z]/gi,n4: [ 4, 5, 6 ],n5: { n51: 1 } } }
    
    同じ正規表現で2回目にマッチしないソリューション
  • 異常シーン
  • let str = '[1,2,3]'
    let reg = /^\[.*\]$/ig;
    console.log(reg.test(str));//true
    console.log(reg.test(str));//false
    
  • ソリューションの一つ:正規表現修飾子gをキャンセルし、グローバルマッチング
  • を実行しない.
    g修饰子はグローバルマッチングを実行するために使用されます.最初のマッチを見つけた後に停止するのではなく、すべてのマッチを検索します.
    let str = '[1,2,3]'
    let reg = /^\[.*\]$/i;
    console.log(reg.test(str));//true
    console.log(reg.test(str));//true
    
  • ソリューション2:正規表現をリセットするlastIndex属性は0または-1
  • です.
    let str = '[1,2,3]'
    let reg = /^\[.*\]$/i;
    console.log(reg.test(str));//true
    reg.lastIndex = -1;
    console.log(reg.test(str));//true
    
  • は、正規表現の および
  • を意味する.
    貪欲モードは、最大長さマッチング文字列を表し、例えば、n+は、少なくとも1つのnを含む文字列と一致し、n*は、ゼロ以上のnを含む任意の文字列怠惰モードと一致し、最小長さマッチング文字列を表し、例えば、n?は、どのパケットにも0個以上のnを含む文字列と一致する.
    参考資料
  • 読んでくれてありがとうございます. ^-^