3.2 关键字和保留字
ECMA-262 描述了一组关键字--用于表示控制语句的开始或结束,或用于执行特定操作。
- | - | - | - |
---|---|---|---|
break | do | instanceof | typeof |
case | else | new | var |
catch | finally | return | void |
continue | for | switch | while |
debugger* | function | this | with |
default | if | throw | |
delete | in | try |
break
终止当前循环
let a = 0;
while( a < 5 ) {
if ( a === 3) {
break;
}
console.log(a);
a++;
}
// 0
// 1
// 2
case switch break default
const a = 92;
switch (true) {
case (a >= 90):
console.log('优秀');
break;
case (a > 80 && a < 90):
console.log('良好');
case (a > 60 && a < 80):
console.log('及格');
break;
default:
console.log('不及格');
break;
}
// 优秀
try catch finally
try {
JSON.parse('');
} catch (e) {
console.log(e); // SyntaxError: Unexpected end of JSON input
} finally {
console.log('finally'); // finally
}
continue
for (let i = 0; i < 5; i++) {
if (i === 3) {
continue;
}
console.log(i); // 跳出当前循环,不会打印 3
}
// 0
// 1
// 2
// 4
delete
删除对象的某个属性
const obj = {
name: 'obj',
};
delete obj.name;
console.log(obj); // {}
var obj2 = {
name: 'obj2',
};
window.obj3 = {
name: 'obj3',
};
console.log(window.obj2); // {name: "obj2"}
console.log(window.obj3); // {name: "obj3"}
delete obj2;
delete obj3;
console.log(window.obj2); // {name: "obj2"}
console.log(window.obj3); // undefined
do...while
创建一个循环,执行指定的声明语句,直到条件为 false。至少执行一次。
let i = 1;
do {
console.log(i);
i++;
} while( i < 3);
// 1
// 2
if else
指定的条件为真时,执行 if 中的声明语句,否则执行另一段语句。
const a = 'exit';
if (a) {
console.log('execute if statement'); // execute if statement
} else {
console.log('another statement');
}
for
for 创建一个循环,由三个包含在括号中的可选表达式组成,表达式之间用分号分隔,紧跟着一段需在循环中执行的声明语句。
for (let i = 0; i < 2; i++) {
console.log(i);
}
// 0
// 1
for...of 语句创建一个循环,用于迭代可迭代的对象,包括内置对象 String
, Array
, Array-like
对象(比如 arguments
或NodeList
), TypedArray
, Map
, Set
, 以及用户自定义的可迭代对象。
const arr = ['a', 'b', 'c'];
for (const val of arr) {
console.log(val);
}
// 'a'
// 'b'
// 'c'
const str = 'abc';
for (const val of str) {
console.log(val);
}
// 'a'
// 'b'
// 'c'
const set = new Set(['a', 'b', 'c']);
for (const val of set) {
console.log(val);
}
// 'a'
// 'b'
// 'c'
const map = new Map([['a', 1], ['b', 2]]);
console.log(map); // Map(2) {"a" => 1, "b" => 2}
for (const val of map) {
console.log(val);
}
// ['a', 1]
// ['b', 2]
// 自定义迭代器
function* foo(){
yield 1;
yield 2;
}
for (const o of foo()) {
console.log(o);
}
// 1
// 2
for...in 语句迭代一个对象的非Symbol、可枚举属性。
const obj1 = {
name: 'obj1',
age: 18,
};
for (const key in obj1) {
console.log(key);
}
// name
// age
instanceof
测试构造函数的 prototype 属性是否存在于对象的原型链中。
function P() {}
const p1 = new P();
console.log(p1 instanceof P); // true
console.log(Object.getPrototypeOf(p1) === P.prototype); // true
P.prototype = {}; // 改变 P 的 prototype 的指向
const p2 = new P();
console.log(p1 instanceof P); // false
console.log(Object.getPrototypeOf(p1)); // {constructor: ƒ P()} 在 p1 的原型链中找不到 P 的 prototype
console.log(p2 instanceof P); // true
console.log(Object.getPrototypeOf(p2)); // {}