js言語における異なるデータタイプの序列化と逆順序化
73155 ワード
最新更新日時:2020年08月06日22:51:48
JavaScriptデータタイプの識別方法及び制限 4つの方法:typeof𞓜instance of𞓜construct 124124124; Object.prototype.toString undefinedタイプは、逆シーケンス番号 を実行できません.
エラー:Uncauht SyntxError:Unxpected token u in JSON at position 0正規表現は、空のオブジェクト に変換されます.シーンの一:対象にネストがなく、JSON.strigifyとJSON.parseを使ってプログレッシブとアンチプログレッシブを行う; オブジェクトの値が関数であれば、直接にkvペアを失う.オブジェクトの値が正規表現であれば、正規表現は空のオブジェクトに変換されます. シーン2:オブジェクトにネスティングされていない、互換性のある関数と正規表現のスキームですが、データのタイプが失われ、逆プログレッシブ化される過程でも疑似的な方法にすぎません. シーン3:オブジェクトがネストされ、データのタイプが失われ、逆順序化されている過程でも疑似的な方法にすぎない. 異常シーン ソリューションの一つ:正規表現修飾子gをキャンセルし、グローバルマッチング を実行しない.
g修饰子はグローバルマッチングを実行するために使用されます.最初のマッチを見つけた後に停止するのではなく、すべてのマッチを検索します.ソリューション2:正規表現をリセットするlastIndex属性は0または-1 です.は、正規表現の を意味する.
貪欲モードは、最大長さマッチング文字列を表し、例えば、
参考資料無 読んでくれてありがとうございます.
《 - - 》
データの順序付けとは、StringタイプではないデータをStringタイプに変換するデータのことである.データのアンチプログレッシブとは、プログレッシブ後のStringタイプのデータをプログレッシブ前のタイプに変換するデータのことです.JavaScriptデータタイプの識別方法及び制限
//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
Numberlet a = 1;
//
let serializationA = JSON.stringify(a);
//
let deserializationA = JSON.parse(serializationA);
console.log(typeof serializationA);//string
console.log(typeof deserializationA);//number
Udefinedエラー: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);//
Nulllet a = null;
//
let serializationA = JSON.stringify(a);
//
let deserializationA = JSON.parse(serializationA);
console.log(typeof serializationA);//string
console.log(typeof deserializationA);//object
Regexplet a = /[a-z]/ig;
//
let serializationA = JSON.stringify(a);
//
let deserializationA = JSON.parse(serializationA);
console.log(serializationA);//{}
console.log(deserializationA);//{}
Araylet 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
Objectlet 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 ] }
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 ] }
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修饰子はグローバルマッチングを実行するために使用されます.最初のマッチを見つけた後に停止するのではなく、すべてのマッチを検索します.
let str = '[1,2,3]'
let reg = /^\[.*\]$/i;
console.log(reg.test(str));//true
console.log(reg.test(str));//true
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を含む文字列と一致する.参考資料
^-^