1 for-in
for-in语句是一种严格的迭代语句,用于枚举对象中的非符号键属性
let stu = {
name: "kobe",
age: 12,
[Symbol("foo")]: "符号属性",
};
for (const prop in stu) {
console.log(prop);
}
输出:指数出了name和age两个属性,没有输出符号属性
name
age
关于符号属性定义:js语法基础-数据类型
如果for-in循环要迭代的变量是null或undefined,则不执行循环体。
2 for-of语句
for-of语句是一种严格的迭代语句,用于遍历可迭代对象的元素
for (const el of [2,4,6,8]) {
console.log(el);
}
如果尝试迭代的变量不支持迭代,则for-of语句会抛出错误。
ES2018对for-of语句进行了扩展,增加了for-await-of循环,以支持生成期约(promise)的异步可迭代对象。
3 with语句
with语句的用途是将代码作用域设置为特定的对象
使用with语句的主要场景是针对一个对象反复操作,这时候将代码作用域设置为该对象能提供便利
let qs = location.search.substring(1);
let hostName = location.hostname;
let url = location.href;
上面代码中的每一行都用到了location对象。如果使用with语句,就可以少写一些代码:
with(location) {
let qs = search.substring(1);
let hostName = hostname;
let url = href;
}
with语句用于连接location对象。这意味着在这个语句内部,每个变量首先会被认为是一个局部变量。如果没有找到该局部变量,则会搜索location对象,看它是否有一个同名的属性。如果有,则该变量会被求值为location对象的属性。
严格模式不允许使用with语句,否则会抛出错误。
由于with语句影响性能且难于调试其中的代码,通常不推荐在产品代码中使用with语句。