13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_cienum Mammals {
173af6ab5fSopenharmony_ci  Humans = 'Humans',
183af6ab5fSopenharmony_ci  Bats = 'Bats',
193af6ab5fSopenharmony_ci  Dolphins = 'Dolphins',
203af6ab5fSopenharmony_ci}
213af6ab5fSopenharmony_ci
223af6ab5fSopenharmony_cifor (const m in Mammals) {
233af6ab5fSopenharmony_ci  if (true) console.log(m);
243af6ab5fSopenharmony_ci}
253af6ab5fSopenharmony_ci
263af6ab5fSopenharmony_ci/**
273af6ab5fSopenharmony_ci * OK, spec 7.5.2 Type inference from Types of Elements
283af6ab5fSopenharmony_ci * type is (number | string | boolean)[], it is inferred from types of the elements. 
293af6ab5fSopenharmony_ci */
303af6ab5fSopenharmony_ciconst someArray = [1, 'string', false];
313af6ab5fSopenharmony_cifor (const entry of someArray) {
323af6ab5fSopenharmony_ci  console.log(entry); // 1, "string", false
333af6ab5fSopenharmony_ci}
343af6ab5fSopenharmony_ci
353af6ab5fSopenharmony_cifor (const entry of [1, 'string', false]) {
363af6ab5fSopenharmony_ci  console.log(entry); // 1, "string", false
373af6ab5fSopenharmony_ci}
383af6ab5fSopenharmony_ci
393af6ab5fSopenharmony_ci/**
403af6ab5fSopenharmony_ci * NOT OK
413af6ab5fSopenharmony_ci * type is explicitly specified to be tuple
423af6ab5fSopenharmony_ci */
433af6ab5fSopenharmony_ciconst someTuple: [number, string, boolean] = [1, 'string', false];
443af6ab5fSopenharmony_cifor (const entry of someTuple) {
453af6ab5fSopenharmony_ci  console.log(entry); // 1, "string", false
463af6ab5fSopenharmony_ci}
473af6ab5fSopenharmony_ci
483af6ab5fSopenharmony_ciconst list = [4, 5, 6];
493af6ab5fSopenharmony_cifor (const i in list) {
503af6ab5fSopenharmony_ci  if (true) console.log(i); // "0", "1", "2",
513af6ab5fSopenharmony_ci}
523af6ab5fSopenharmony_ci
533af6ab5fSopenharmony_cifor (const i of list) {
543af6ab5fSopenharmony_ci  console.log(i); // 4, 5, 6
553af6ab5fSopenharmony_ci}
563af6ab5fSopenharmony_ci
573af6ab5fSopenharmony_cifor (const i of [4, 5, 6]) {
583af6ab5fSopenharmony_ci  console.log(i); // 4, 5, 6
593af6ab5fSopenharmony_ci}
603af6ab5fSopenharmony_ci
613af6ab5fSopenharmony_ciconst s = 'abc'; // type is 'abc'
623af6ab5fSopenharmony_cifor (const c of s) {
633af6ab5fSopenharmony_ci  console.log(c);
643af6ab5fSopenharmony_ci}
653af6ab5fSopenharmony_ci
663af6ab5fSopenharmony_cilet s2 = 'abs' // type is string
673af6ab5fSopenharmony_cifor (const c of s2) {
683af6ab5fSopenharmony_ci  console.log(c);
693af6ab5fSopenharmony_ci}
703af6ab5fSopenharmony_ci
713af6ab5fSopenharmony_cifor (const c of 'abc') {
723af6ab5fSopenharmony_ci  console.log(c);
733af6ab5fSopenharmony_ci}
743af6ab5fSopenharmony_ci
753af6ab5fSopenharmony_cifor (const i in s) {
763af6ab5fSopenharmony_ci  if (true) console.log(i);
773af6ab5fSopenharmony_ci}
783af6ab5fSopenharmony_ci
793af6ab5fSopenharmony_ciconst arr = ['z', 'x', 'y'];
803af6ab5fSopenharmony_ci
813af6ab5fSopenharmony_cifor (const c of arr) {
823af6ab5fSopenharmony_ci  console.log(c);
833af6ab5fSopenharmony_ci}
843af6ab5fSopenharmony_ci
853af6ab5fSopenharmony_cilet i: number, j: number, k: number;
863af6ab5fSopenharmony_ci// legal 'comma' operator
873af6ab5fSopenharmony_cifor (i = 1, j = 2, k = 3; i * j * k > 0; i++, k--, j += 2) {
883af6ab5fSopenharmony_ci  continue;
893af6ab5fSopenharmony_ci}
903af6ab5fSopenharmony_ci// illegal 'comma' operator
913af6ab5fSopenharmony_cifor (i = 1, ((j = 2), (k = 3)); i * j * k > 0; i--, (k++, j--)) {
923af6ab5fSopenharmony_ci  continue;
933af6ab5fSopenharmony_ci}
943af6ab5fSopenharmony_ci
953af6ab5fSopenharmony_ciconst a1 = [0, 1];
963af6ab5fSopenharmony_ciconst a2 = [1, 2, 3, 4, 5];
973af6ab5fSopenharmony_ciconst a3: number[] = [1, 2, 3, 4, 5];
983af6ab5fSopenharmony_ciconst a4: Array<number> = [1, 2, 3, 4, 5];
993af6ab5fSopenharmony_ciconst a5 = new Array(10);
1003af6ab5fSopenharmony_ciconst a6 = new Int8Array(10);
1013af6ab5fSopenharmony_ciconst a7 = new Uint8Array(10);
1023af6ab5fSopenharmony_ciconst a8 = new Uint8ClampedArray(10);
1033af6ab5fSopenharmony_ciconst a9 = new Int16Array(10);
1043af6ab5fSopenharmony_ciconst a10 = new Uint16Array(10);
1053af6ab5fSopenharmony_ciconst a11 = new Int32Array(10);
1063af6ab5fSopenharmony_ciconst a12 = new Uint32Array(10);
1073af6ab5fSopenharmony_ciconst a13 = new Float32Array(10);
1083af6ab5fSopenharmony_ciconst a14 = new Float64Array(10);
1093af6ab5fSopenharmony_ciconst a15 = new BigInt64Array(10);
1103af6ab5fSopenharmony_ciconst a16 = new BigUint64Array(10);
1113af6ab5fSopenharmony_ci
1123af6ab5fSopenharmony_cifor (const i of a1) {
1133af6ab5fSopenharmony_ci  console.log(i);
1143af6ab5fSopenharmony_ci}
1153af6ab5fSopenharmony_cifor (const i of a2) {
1163af6ab5fSopenharmony_ci  console.log(i);
1173af6ab5fSopenharmony_ci}
1183af6ab5fSopenharmony_cifor (const i of a3) {
1193af6ab5fSopenharmony_ci  console.log(i);
1203af6ab5fSopenharmony_ci}
1213af6ab5fSopenharmony_cifor (const i of a4) {
1223af6ab5fSopenharmony_ci  console.log(i);
1233af6ab5fSopenharmony_ci}
1243af6ab5fSopenharmony_cifor (const i of a5) {
1253af6ab5fSopenharmony_ci  console.log(i);
1263af6ab5fSopenharmony_ci}
1273af6ab5fSopenharmony_cifor (const i of a6) {
1283af6ab5fSopenharmony_ci  console.log(i);
1293af6ab5fSopenharmony_ci}
1303af6ab5fSopenharmony_cifor (const i of a7) {
1313af6ab5fSopenharmony_ci  console.log(i);
1323af6ab5fSopenharmony_ci}
1333af6ab5fSopenharmony_cifor (const i of a8) {
1343af6ab5fSopenharmony_ci  console.log(i);
1353af6ab5fSopenharmony_ci}
1363af6ab5fSopenharmony_cifor (const i of a9) {
1373af6ab5fSopenharmony_ci  console.log(i);
1383af6ab5fSopenharmony_ci}
1393af6ab5fSopenharmony_cifor (const i of a10) {
1403af6ab5fSopenharmony_ci  console.log(i);
1413af6ab5fSopenharmony_ci}
1423af6ab5fSopenharmony_cifor (const i of a11) {
1433af6ab5fSopenharmony_ci  console.log(i);
1443af6ab5fSopenharmony_ci}
1453af6ab5fSopenharmony_cifor (const i of a12) {
1463af6ab5fSopenharmony_ci  console.log(i);
1473af6ab5fSopenharmony_ci}
1483af6ab5fSopenharmony_cifor (const i of a13) {
1493af6ab5fSopenharmony_ci  console.log(i);
1503af6ab5fSopenharmony_ci}
1513af6ab5fSopenharmony_cifor (const i of a14) {
1523af6ab5fSopenharmony_ci  console.log(i);
1533af6ab5fSopenharmony_ci}
1543af6ab5fSopenharmony_cifor (const i of a15) {
1553af6ab5fSopenharmony_ci  console.log(i);
1563af6ab5fSopenharmony_ci}
1573af6ab5fSopenharmony_cifor (const i of a16) {
1583af6ab5fSopenharmony_ci  console.log(i);
1593af6ab5fSopenharmony_ci}
1603af6ab5fSopenharmony_ci
1613af6ab5fSopenharmony_ciconst a17: (number | string)[] = []
1623af6ab5fSopenharmony_ci
1633af6ab5fSopenharmony_cifor (const i of a17) {
1643af6ab5fSopenharmony_ci  console.log(i)
1653af6ab5fSopenharmony_ci}
1663af6ab5fSopenharmony_ci
1673af6ab5fSopenharmony_ciclass P<T> extends Array<T> {
1683af6ab5fSopenharmony_ci  foo() {
1693af6ab5fSopenharmony_ci    for (let t of this) {
1703af6ab5fSopenharmony_ci      console.log(t)
1713af6ab5fSopenharmony_ci    }
1723af6ab5fSopenharmony_ci  }
1733af6ab5fSopenharmony_ci}
1743af6ab5fSopenharmony_ci
1753af6ab5fSopenharmony_cilet a18 = new P<number>(1, 2, 3)
1763af6ab5fSopenharmony_cia18.foo()
1773af6ab5fSopenharmony_cifor (let t of a18) {
1783af6ab5fSopenharmony_ci  console.log(t)
1793af6ab5fSopenharmony_ci}
1803af6ab5fSopenharmony_ci
1813af6ab5fSopenharmony_ciclass PN extends Array<number> {
1823af6ab5fSopenharmony_ci  foo() {
1833af6ab5fSopenharmony_ci    for (let t of this) {
1843af6ab5fSopenharmony_ci      console.log(t)
1853af6ab5fSopenharmony_ci    }
1863af6ab5fSopenharmony_ci  }
1873af6ab5fSopenharmony_ci}
1883af6ab5fSopenharmony_ci
1893af6ab5fSopenharmony_cilet a19 = new PN(1, 2, 3)
1903af6ab5fSopenharmony_cia19.foo()
1913af6ab5fSopenharmony_cifor (let t of a19) {
1923af6ab5fSopenharmony_ci  console.log(t)
1933af6ab5fSopenharmony_ci}
1943af6ab5fSopenharmony_ci
1953af6ab5fSopenharmony_ciclass MyInt8Array extends Int8Array {}
1963af6ab5fSopenharmony_ciclass MyUint8Array extends Uint8Array {}
1973af6ab5fSopenharmony_ciclass MyUint8ClampedArray extends Uint8ClampedArray {}
1983af6ab5fSopenharmony_ciclass MyInt16Array extends Int16Array {}
1993af6ab5fSopenharmony_ciclass MyUint16Array extends Uint16Array {}
2003af6ab5fSopenharmony_ciclass MyInt32Array extends Int32Array {}
2013af6ab5fSopenharmony_ciclass MyUint32Array extends Uint32Array {}
2023af6ab5fSopenharmony_ciclass MyFloat32Array extends Float32Array {}
2033af6ab5fSopenharmony_ciclass MyFloat64Array extends Float64Array {}
2043af6ab5fSopenharmony_ciclass MyBigInt64Array extends BigInt64Array {}
2053af6ab5fSopenharmony_ciclass MyBigUint64Array extends BigUint64Array {}
2063af6ab5fSopenharmony_ci
2073af6ab5fSopenharmony_ciconst a20 = new MyInt8Array(10);
2083af6ab5fSopenharmony_ciconst a21 = new MyUint8Array(10);
2093af6ab5fSopenharmony_ciconst a22 = new MyUint8ClampedArray(10);
2103af6ab5fSopenharmony_ciconst a23 = new MyInt16Array(10);
2113af6ab5fSopenharmony_ciconst a24 = new MyUint16Array(10);
2123af6ab5fSopenharmony_ciconst a25 = new MyInt32Array(10);
2133af6ab5fSopenharmony_ciconst a26 = new MyUint32Array(10);
2143af6ab5fSopenharmony_ciconst a27 = new MyFloat32Array(10);
2153af6ab5fSopenharmony_ciconst a28 = new MyFloat64Array(10);
2163af6ab5fSopenharmony_ciconst a29 = new MyBigInt64Array(10);
2173af6ab5fSopenharmony_ciconst a30 = new MyBigUint64Array(10);
2183af6ab5fSopenharmony_ci
2193af6ab5fSopenharmony_cifor (const i of a20) {
2203af6ab5fSopenharmony_ci  console.log(i);
2213af6ab5fSopenharmony_ci}
2223af6ab5fSopenharmony_cifor (const i of a21) {
2233af6ab5fSopenharmony_ci  console.log(i);
2243af6ab5fSopenharmony_ci}
2253af6ab5fSopenharmony_cifor (const i of a22) {
2263af6ab5fSopenharmony_ci  console.log(i);
2273af6ab5fSopenharmony_ci}
2283af6ab5fSopenharmony_cifor (const i of a23) {
2293af6ab5fSopenharmony_ci  console.log(i);
2303af6ab5fSopenharmony_ci}
2313af6ab5fSopenharmony_cifor (const i of a24) {
2323af6ab5fSopenharmony_ci  console.log(i);
2333af6ab5fSopenharmony_ci}
2343af6ab5fSopenharmony_cifor (const i of a25) {
2353af6ab5fSopenharmony_ci  console.log(i);
2363af6ab5fSopenharmony_ci}
2373af6ab5fSopenharmony_cifor (const i of a26) {
2383af6ab5fSopenharmony_ci  console.log(i);
2393af6ab5fSopenharmony_ci}
2403af6ab5fSopenharmony_cifor (const i of a27) {
2413af6ab5fSopenharmony_ci  console.log(i);
2423af6ab5fSopenharmony_ci}
2433af6ab5fSopenharmony_cifor (const i of a28) {
2443af6ab5fSopenharmony_ci  console.log(i);
2453af6ab5fSopenharmony_ci}
2463af6ab5fSopenharmony_cifor (const i of a29) {
2473af6ab5fSopenharmony_ci  console.log(i);
2483af6ab5fSopenharmony_ci}
2493af6ab5fSopenharmony_cifor (const i of a30) {
2503af6ab5fSopenharmony_ci  console.log(i);
2513af6ab5fSopenharmony_ci}
2523af6ab5fSopenharmony_ci
2533af6ab5fSopenharmony_ciclass A<type1, type2> extends Map<type1, type2> {}
2543af6ab5fSopenharmony_ciclass B<type> extends Set<type> {}
2553af6ab5fSopenharmony_ciclass C extends String {}
2563af6ab5fSopenharmony_ci
2573af6ab5fSopenharmony_cilet map = new Map([["a", 1], ["b", 2], ["c", 3]]);
2583af6ab5fSopenharmony_cilet derivedFromMap = new A([["d", 4], ["e", 5], ["f", 6]]);
2593af6ab5fSopenharmony_cilet set = new Set<number>([1, 2, 3]);
2603af6ab5fSopenharmony_cilet derivedFromSet = new B<number>([4, 5, 6]);
2613af6ab5fSopenharmony_cilet str = "hello";
2623af6ab5fSopenharmony_cilet derivedFromString = new C("world")
2633af6ab5fSopenharmony_ci
2643af6ab5fSopenharmony_cifor (let i of map) {
2653af6ab5fSopenharmony_ci  console.log(i);
2663af6ab5fSopenharmony_ci}
2673af6ab5fSopenharmony_ci
2683af6ab5fSopenharmony_cifor (let i of derivedFromMap) {
2693af6ab5fSopenharmony_ci  console.log(i);
2703af6ab5fSopenharmony_ci}
2713af6ab5fSopenharmony_ci
2723af6ab5fSopenharmony_cifor (let i of set) {
2733af6ab5fSopenharmony_ci  console.log(i);
2743af6ab5fSopenharmony_ci}
2753af6ab5fSopenharmony_ci
2763af6ab5fSopenharmony_cifor (let i of derivedFromSet) {
2773af6ab5fSopenharmony_ci  console.log(i);
2783af6ab5fSopenharmony_ci}
2793af6ab5fSopenharmony_ci
2803af6ab5fSopenharmony_cifor (let i of str) {
2813af6ab5fSopenharmony_ci  console.log(i);
2823af6ab5fSopenharmony_ci}
2833af6ab5fSopenharmony_ci
2843af6ab5fSopenharmony_cifor (let i of derivedFromString) {
2853af6ab5fSopenharmony_ci  console.log(i);
2863af6ab5fSopenharmony_ci}
287