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()传入这些字符时处理结果及返回值的变化进行适配。