基本写法//RecordsconstmyRecord=#{name:'01',age:23}//TupleconstmyTuple=#['1','2','3']其实就是加了一个#ReadablefeaturesRecord和Tuple都有与对象和数组相同的语法,所以?constmyRecord=#{name:'01'}constmyTuple=#['1','2']myRecord['age']=23//errormyTuple.push('3')//为什么会报错错误??开头有提到~因为这两个类型是只读的,Object和Array是非唯一的。平时开发中,数组与数组、对象与对象不适合用===直接比较判断,因为每次生成的对象在内存中的地址都不一样constobj1={name:'01'}constobj2={name:'01'}constobjIsSame=obj1===obj2//falseconstarr1=[1]constarr2=[1]constarrIsSame=arr1===arr2//false真正比较两个数组或对象是否相等(即就是,我们要的内容是一样的),我们需要遍历递归来逐一比较,但是现在呢?Record和Tuple能解决这个问题吗?constrecord1=#{name:'01'}constrecord2=#{name:'01'}constrecordIsSame=record1===record2//trueconsttuple1=#[1]consttuple2=#[1]consttupleIsSame=tuple1===tuple2//true可以看到,只要内部内容一致,即使比较分别生成的两个Records或Tuples,也等同于普通对象和数组的转换。我可以使用对象Record和Tuple转换普通对象和Array转换constmyRecord=Record({name:'01',age:23});//#{名称:'01',age:23}constmyTuple=Tuple([1,2,3,4,5]);//#[1,2,3,4,5]支持扩展运算符,我们也可以将它用于Record和Tuple扩展运算符constmyTuple=#[1,2,3];constmyRecord=#{姓名:'01',年龄:23??};constnewRecord=#{...myRecord,money:0}//#{name:'01',age:23,money:0}constnewTuple=#[...myTuple,4,5];//#[1,2,3,4,5]JSON方法扩展现在没有JSON。有两种方法:parse和JSON.stringfy。据说草案中提到了一个好主意,就是给JSON对象增加一个parseImmutable方法。功能应该是直接将一个Record字符串或者Tuple字符串解析成对应的RecordTuple对象早期体验如果现在想体验这个功能可以安装babel插件#babel基础库yarnadd@babel/cli@babel/core@babel/preset-env-D#RecordandTupleBabelpolyfillyarnadd@babel/plugin-proposal-record-and-tuple@bloomberg/record-tuple-polyfill-D在目录下创建.babelrc,内容如下:{"presets":["@babel/preset-env"],"plugins":[["@babel/plugin-proposal-record-and-tuple",{"importPolyfill":true,"syntaxType":"hash"}]]}使用以下内容创建另一个index.js:consttuple1=#[1,2,3]consttuple2=#[1,2,3]constrecord1=#{name:'01'}constrecord2=#{name:'02'}console.log(tuple1===tuple2,record1===record2)执行编译babel命令./node_modules/.bin/babelindex.js--out-filecompiled.jscompiled.js文件输出如下:"usestrict";var_recordTuplePolyfill=require("@bloomberg/record-tuple-polyfill");vartuple1=(0,_recordTuplePolyfill.Tuple)(1,2,3);vartuple2=(0,_recordTuplePolyfill.Tuple)(1,2,3);varrecord1=(0,_recordTuplePolyfill.Record)({name:'01'});varrecord2=(0,_recordTuplePolyfill.Record)({name:'02'});console.log(tuple1===tuple2,record1===record2);最后执行compiled.js得到结果节点compiled.js#Result:truefalse
