enumerability_iterable.md 1.4 KB
Newer Older
杜庆泉's avatar
杜庆泉 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
## 可枚举和可迭代的平台差异

#### Web开发

web开发场景下,存在以下两种访问对象内部变量的方式:

+ 可枚举

ECMAScript 1999:开始支持 for...in 主要用于遍历对象的属性,迭代的是对象的所有可枚举属性(包括原型链中的属性)。

+ 可迭代

ECMAScript 2015:开始支持 for...of 主要用于遍历可迭代的数据结构(如数组、字符串、Set、Map 等),迭代的是集合中的每一个元素的值。它不会遍历对象的属性。


#### 原生开发

在原生开发场景下 `Kotlin``swift` 均仅支持了 for..in 语法,不支持 for..of 语法

但原生的 for..in 的用法,与web 存在一定的差异。实际上对应的是web中的可迭代概念


各平台支持信息:

|平台   |可迭代|可枚举|
|---   |------|-----|
|web   |支持(ECMAScript-2015)|支持(ECMAScript-1999)|
|kotlin|支持|不支持|
|swift |支持|不支持|

各平台实现关键字:

|平台   |可迭代|可枚举|
|---   |------|-----|
|web   |for..of|for..in|
|kotlin|for..in|不支持|
|swift |for..in|不支持|


比如下面的代码

```typescript
let a1 = [111,"222",false]

for(perItem in a1){
	console.log("perItem",perItem)
}

```


Web 执行结果是
```typescript
"perItem" "0"
"perItem" "1"
"perItem" "2"
```

Android 执行结果是
```typescript
perItem [number] 111
perItem 222
perItem [boolean] false
```