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 对象(比如 argumentsNodeList), 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)); // {}
Last Updated: 7/22/2019, 4:38:31 PM