1# Arkts子系统变更说明 2 3## cl.arkts.1 TreeSet.clear()和TreeMap.clear()接口行为变更 4 5**访问级别** 6 7公开接口 8 9**变更原因** 10 11容器类TreeMap和TreeSet的构造函数支持传入比较器,用户可以通过传入比较器来控制元素在二叉树上的插入位置。当用户调用了TreeMap和TreeSet的clear方法时,预期结果为仅清除数据, 12实际结果为清除数据的同时还清除了用户传入的比较器,导致再次插入数据时不会遵循用户传入的比较器的规则,而是按照默认比较器的规则,不符合用户预期,需要变更接口行为。 13 14**变更影响** 15 16不兼容变更,影响调用clear()后的排序规则。 17 18**变更前** 19 20- 情况一: 用户传入比较器,调用了TreeMap的clear方法后,比较器失效。 21 22``` 23//使用comparator firstValue > secondValue,表示为降序排序。 24let treeMap : TreeMap<string,string> = new TreeMap<string,string>((firstValue: string, secondValue: string) : boolean => {return firstValue > secondValue}); 25treeMap.set("aa","3"); 26treeMap.set("dd","1"); 27treeMap.set("cc","2"); 28treeMap.set("bb","4"); 29let numbers = Array.from(treeMap.keys()) 30for (let item of numbers) { 31 console.log("treeMap:" + item); // key: dd cc bb aa 32} 33treeMap.clear(); 34treeMap.set("aa","3"); 35treeMap.set("dd","1"); 36treeMap.set("cc","2"); 37treeMap.set("bb","4"); 38numbers = Array.from(treeMap.keys()) 39for (let item of numbers) { 40 console.log("treeMap:" + item); //key: aa bb cc dd 41} 42``` 43 44- 情况二: 用户传入比较器,调用了TreeSet的clear方法后,比较器失效。 45 46``` 47let treeSet : TreeSet<string> = new TreeSet<string>((firstValue: string, secondValue: string) : boolean => {return firstValue > secondValue}); 48treeSet.add("a"); 49treeSet.add("c"); 50treeSet.add("d"); 51treeSet.add("b"); 52let numbers = Array.from(treeSet.values()) 53for (let item of numbers) { 54 console.log("TreeSet:" + item); // value: d c b a 55} 56treeSet.clear(); 57treeSet.add("a"); 58treeSet.add("c"); 59treeSet.add("d"); 60treeSet.add("b"); 61numbers = Array.from(treeSet.values()) 62for (let item of numbers) { 63 console.log("TreeSet:" + item); // value: a b c d 64} 65``` 66**变更后** 67 68- 情况一: 用户传入比较器,调用了TreeMap的clear方法后,比较器正常排序。 69 70``` 71//使用comparator firstValue > secondValue,表示为降序排序。 72let treeMap : TreeMap<string,string> = new TreeMap<string,string>((firstValue: string, secondValue: string) : boolean => {return firstValue > secondValue}); 73treeMap.set("aa","3"); 74treeMap.set("dd","1"); 75treeMap.set("cc","2"); 76treeMap.set("bb","4"); 77let numbers = Array.from(treeMap.keys()) 78for (let item of numbers) { 79 console.log("treeMap:" + item); // treeMap: dd cc bb aa 80} 81treeMap.clear(); 82treeMap.set("aa","3"); 83treeMap.set("dd","1"); 84treeMap.set("cc","2"); 85treeMap.set("bb","4"); 86numbers = Array.from(treeMap.keys()) 87for (let item of numbers) { 88 console.log("treeMap:" + item); // treeMap: dd cc bb aa 89} 90``` 91 92- 情况二: 用户传入比较器,调用了TreeSet的clear方法后,比较器正常排序。 93 94``` 95let treeSet : TreeSet<string> = new TreeSet<string>((firstValue: string, secondValue: string) : boolean => {return firstValue > secondValue}); 96treeSet.add("a"); 97treeSet.add("c"); 98treeSet.add("d"); 99treeSet.add("b"); 100let numbers = Array.from(treeSet.values()) 101for (let item of numbers) { 102 console.log("TreeSet:" + item); // TreeSet: d c b a 103} 104treeSet.clear(); 105treeSet.add("a"); 106treeSet.add("c"); 107treeSet.add("d"); 108treeSet.add("b"); 109numbers = Array.from(treeSet.values()) 110for (let item of numbers) { 111 console.log("TreeSet:" + item); // TreeSet: d c b a 112} 113``` 114**起始API Level** 115 1168 117 118**变更发生版本** 119 120从OpenHarmony SDK 5.0.0.32 版本开始。 121 122**变更的接口/组件** 123 124TreeMap.clear(); 125TreeSet.clear(); 126 127**适配指导** 128 129TreeSet.clear()和TreeMap.clear()方法行为变更之后,用户无需重新设置比较器也能正常排序,也可以重新设置比较器来改变元素的排序方式。 130 131文档可参考如下: 132 133[TreeMap.clear()](../../../application-dev/reference/apis-arkts/js-apis-treemap.md#clear) 134 135[TreeSet.clear()](../../../application-dev/reference/apis-arkts/js-apis-treeset.md#clear) 136 137## cl.arkts.2 TreeMap.setAll()接口行为变更 138 139**访问级别** 140 141公开接口 142 143**变更原因** 144 145使用setAll接口添加一个空的TreeMap,预期长度+0,实际长度+1。 146 147**变更影响** 148 149该变更为不兼容性变更,影响调用TreeMap.setAll()后TreeMap的长度。 150 151- **变更前** 使用setAll接口添加treeMap1后treeMap长度为1 152 153``` 154let treeMap : TreeMap<string, number> = new TreeMap(); 155let treeMap1 : TreeMap<string, number> = new TreeMap(); 156treeMap.setAll(treeMap1); // 将treeMap1中的所有元素添加到treeMap中 157console.info("length:", treeMap.length) // length:1 158``` 159 160- **变更后** 使用setAll接口添加treeMap1后treeMap长度为0 161 162``` 163let treeMap : TreeMap<string, number> = new TreeMap(); 164let treeMap1 : TreeMap<string, number> = new TreeMap(); 165treeMap.setAll(treeMap1); // 将treeMap1中的所有元素添加到treeMap中 166console.info("length:",treeMap.length) // length:0 167``` 168 169**起始API Level** 170 1718 172 173**变更发生版本** 174 175从OpenHarmony SDK 5.0.0.32 版本开始。 176 177**变更的接口/组件** 178 179TreeMap.setAll(); 180 181**适配指导** 182 183对于TreeMap.setAll()传入空TreeMap的情况,开发者需要针对变更前后TreeMap的长度变化进行适配。 184 185文档可参考如下: 186 187[TreeMap.setAll()](../../../application-dev/reference/apis-arkts/js-apis-treemap.md#setall) 188 189## cl.arkts.3 TreeMap、TreeSet的hasKey和has接口行为变更 190 191**访问级别** 192 193公开接口 194 195**变更原因** 196 1971. 对于传入用户自定义比较器的TreeMap, 不能正确区分undefined或null与其他元素的比较关系,导致在没有插入null或undefined的情况下hasKey(null/undefined)错误返回true。 1982. 对于传入用户自定义比较器的TreeSet, 不能正确区分undefined或null与其他元素的比较关系,导致在没有插入null或undefined的情况下has(null/undefined)错误返回true。 199 200**变更影响** 201 202不兼容变更,影响TreeMap.hasKey()、TreeSet.has()传入undefined或null时的返回值。 203 204- **变更前** 205 206- 情况一: 对于传入用户自定义比较器的TreeMap,在没有插入null或undefined的情况下hasKey(null/undefined)错误返回true。 207 208``` 209let treeMap : TreeMap<string, number> = new TreeMap((firstValue: string, secondValue: string) : boolean => {return firstValue > secondValue}); 210treeMap.set("aa",3); 211treeMap.set("dd",1); 212let res = treeMap.hasKey(null); 213let res1 = treeMap.hasKey(undefined); 214console.info("res:", res) // res:true 215console.info("res1:",res1) // res1:true 216``` 217 218- 情况二: 对于传入用户自定义比较器的TreeSet,在没有插入null或undefined的情况下has(null/undefined)错误返回true。 219 220``` 221let treeSet : TreeSet<string> = new TreeSet<string>((firstValue: string, secondValue: string) : boolean => {return firstValue > secondValue}); 222treeSet.add("a"); 223treeSet.add("c"); 224let res = treeSet.has(null); 225let res1 = treeSet.has(undefined); 226console.info("res:", res) // res:true 227console.info("res1:",res1) // res1:true 228``` 229 230- **变更后** 231 232- 情况一: 对于传入用户自定义比较器的TreeMap,在没有插入null或undefined的情况下hasKey(null/undefined)返回fasle。 233 234``` 235let treeMap : TreeMap<string, number> = new TreeMap((firstValue: string, secondValue: string) : boolean => {return firstValue > secondValue}); 236treeMap.set("aa",3); 237treeMap.set("dd",1); 238let res = treeMap.hasKey(null); 239let res1 = treeMap.hasKey(undefined); 240console.info("res:", res) // res:false 241console.info("res1:",res1) // res1:false 242``` 243 244- 情况二: 对于传入用户自定义比较器的TreeSet,在没有插入null或undefined的情况下has(null/undefined)返回false。 245 246``` 247let treeSet : TreeSet<string> = new TreeSet<string>((firstValue: string, secondValue: string) : boolean => {return firstValue > secondValue}); 248treeSet.add("a"); 249treeSet.add("c"); 250let res = treeSet.has(null); 251let res1 = treeSet.has(undefined); 252console.info("res:", res) // res:false 253console.info("res1:",res1) // res1:false 254``` 255 256 257**起始API Level** 258 2598 260 261**变更发生版本** 262 263从OpenHarmony SDK 5.0.0.32 版本开始。 264 265**变更的接口/组件** 266 267TreeMap.hasKey(); 268TreeSet.has(); 269 270**适配指导** 271 272对于TreeMap.hasKey()、TreeSet.has()接口传入null或undefined的情况。开发者需要针对变更前后返回值的变化进行适配。 273 274文档可参考如下: 275 276[TreeMap.hasKey()](../../../application-dev/reference/apis-arkts/js-apis-treemap.md#haskey) 277 278[TreeSet.has()](../../../application-dev/reference/apis-arkts/js-apis-treeset.md#has) 279 280 281## cl.arkts.4 URLParams类append接口添加的值中包含连续空格时行为变更 282 283**访问级别** 284 285公开接口 286 287**变更原因** 288 289URLParams类append接口添加的字符串中包含连续多个空格时,连续空格会被错误处理成只转换为一个'+',该实现不符合URL的标准。 290 291 **变更影响** 292 293不兼容变更,影响URLParams.append()接口在入参包含连续空格时的处理结果。 294 295**起始 API Level** 296 2979 298 299**变更发生版本** 300 301从OpenHarmony SDK 5.0.0.32开始。 302 303**变更的接口/组件** 304 305URLParams对象的append接口。 306 307变更前:URLParams对象使用append()方法添加键值对时,若添加的字符串中存在连续多个空格时,接口表现为将连续多个空格只转换为一个'+'。 308```ts 309{ 310 const objectParams = new url.URLParams("key=abc") 311 console.log(objectParams.toString()) // "key=abc" 312 objectParams.append('key1', 'd e f'); 313 console.log(objectParams.toString()) // "key=abc&key1=d+e+f" 314} 315``` 316 317变更后:URLParams对象使用append()方法添加键值对时,若添加的字符串中存在连续多个空格时,接口表现为将连续多个空格转换为对应空格数量的'+'。 318```ts 319{ 320 const objectParams = new url.URLParams("key=abc") 321 console.log(objectParams.toString()) // "key=abc" 322 objectParams.append('key1', 'd e f'); 323 console.log(objectParams.toString()) // "key=abc&key1=d+++e+++f" 324} 325``` 326 327**适配指导** 328 329开发者在涉及上面append的使用场景时,在变更生效前如果对append添加的键值对做后续处理操作,变更后需针对表现不同做针对性适配。 330 331## cl.arkts.5 URLParams类在入参字符串中包含大小写不同编码值时,toString()接口表现结果不一致变更 332 333**访问级别** 334 335公开接口 336 337**变更原因** 338 339URLParams类在入参字符串中包含大小写不同编码值时toString()接口返回值有误,主要涉及:"%2b"和"%2B"的表现不一致,"%2B"被处理为"%2B"是符合标准的,但"%2b"会被错误处理成'+'。 340 341 **变更影响** 342 343不兼容变更,影响当URLParams构造函数入参字符串中存在"%2b"时URLParams.toString()的返回结果。 344 345**起始 API Level** 346 3479 348 349**变更发生版本** 350 351从OpenHarmony SDK 5.0.0.32开始。 352 353**变更的接口/组件** 354 355URL模块URLParams类toString接口, 356 357变更前:创建URLParams对象,如果入参字符串中存在"%2b"和"%2B"时,在toString()后返回的字符串分别表现为"+"和"%2B"。 358```ts 359{ 360 const objectParams = new url.URLParams("key%2b=abc%2B") 361 console.log(objectParams.toString()) // "key+=abc%2B" 362} 363``` 364 365变更后:创建URLParams对象,如果入参字符串中存在"%2b"和"%2B"时,在toString()后返回的字符串均表现为"%2B"; 366```ts 367{ 368 const objectParams = new url.URLParams("key%2b=abc%2B") 369 console.log(objectParams.toString()) // "key%2B=abc%2B" 370} 371``` 372 373**适配指导** 374 375开发者在涉及上述使用场景时,在变更生效前如果对toString()返回值做后续处理操作,变更后需针对表现不同做针对性适配。 376 377## cl.arkts.6 URLParams类append接口行为变更 378 379**访问级别** 380 381公开接口 382 383**变更原因** 384 385URLParams使用append()方法时,对入参键值对中的特殊字符会错误进行encode,该行为与URL标准不一致,导致后续对键值对进行增删改查等操作出现异常。 386 387 **变更影响** 388 389不兼容变更,影响当URLParams.append()入参包含中文等特殊字符时该函数的处理结果。 390 391**起始 API Level** 392 3939 394 395**变更发生版本** 396 397从OpenHarmony SDK 5.0.0.32开始。 398 399**变更的接口/组件** 400 401URLParams类append接口。 402 403变更前:URLParams使用append()方法添加键值对, 若想通过添加的key使用get、has、delete、set接口进行增删改查操作,需先对key进行额外encode。 404```ts 405{ 406 const objectParams = new url.URLParams('?fod=1&bard=2') 407 objectParams.append("key&大", "abc"); 408 objectParams.has('key&大'); // false 409 objectParams.has('%E5%A4%A7'); // true 410 objectParams.get('key&大'); // undefined 411 objectParams.get('%E5%A4%A7'); // abc 412} 413``` 414 415变更后: URLParams使用append()方法添加键值对,可直接使用添加的key拿到对应value进行增删改查操作。 416```ts 417{ 418 const objectParams = new url.URLParams('?fod=1&bard=2') 419 objectParams.append("key&大", "abc"); 420 objectParams.has('key&大'); // true 421 objectParams.has('%E5%A4%A7'); // false 422 objectParams.get('key&大'); // abc 423 objectParams.get('%E5%A4%A7'); // undefined 424} 425``` 426 427**适配指导** 428 429对于URLParams.append()入参包含中文等特殊字符的情况。开发者需要针对变更前后调用has()、get()、delete()、set()传入这些字符时处理结果及返回值的变化进行适配。