JavaScript:For ... Each/With

dco*_*bus 6 javascript

可能重复:
JavaScript foreach Vs for

for循环和for ...之间有什么区别?我的意思是,如果存在差异,那就不会太多了.

并且,我在验证脚本中看到有时编写的函数如下:

function check() {
    with(something) {
        if(){
            // do something
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

"有"条件有什么意义?

Dan*_*llo 15

for each..in语句在对象属性的所有值上迭代指定的变量.对于每个不同的属性,执行指定的语句.这是由Mozilla在JavaScript 1.6中引入的(请参阅下面的@CMS评论),并不是所有主流浏览器都支持.

对于每个例子:

var sum = 0;
var obj = {prop1: 5, prop2: 13, prop3: 8};
for each (var item in obj) {
  sum += item;
}
console.log(sum); // prints "26", which is 5 + 13 + 8
Run Code Online (Sandbox Code Playgroud)

类似的声明是for..in迭代属性名而不是属性值.使用for..in以下编写的相同示例:

var sum = 0;
var obj = {prop1: 5, prop2: 13, prop3: 8};
for (var prop in obj) {
  sum += obj[prop];
}
console.log(sum); // prints "26", which is 5 + 13 + 8
Run Code Online (Sandbox Code Playgroud)

for..in声明自JavaScript 1.0开始就存在,因此您可以安全地在所有浏览器中使用它.

这些语句与传统for循环不同,因为它们用于迭代对象的属性.甲for环可用于迭代数组的元素,但它不能被用于迭代的对象的属性,除非可以使用的ECMAScript 5的Object.keys,它可以用来实现上面的例子如下:

var sum = 0;
var obj = {prop1: 5, prop2: 13, prop3: 8};
var keys = Object.keys(obj)
for (var i = 0; i < keys.length; i++) {
  sum += obj[keys[i]];
}
console.log(sum); // prints "26", which is 5 + 13 + 8
Run Code Online (Sandbox Code Playgroud)

至于with声明,请注意以下内容:

JavaScript通过搜索与包含该非限定名称的脚本或函数的执行上下文关联的作用域链来查找非限定名称.'with'语句在评估其语句体时将给定对象添加到此作用域链的头部.如果正文中使用的非限定名称与作用域链中的属性匹配,则该名称将绑定到属性和包含该属性的对象.否则抛出'ReferenceError'.

因此,请考虑以下事项:

var prop1 = 10;
var obj = {prop1: 5, prop2: 13, prop3: 8};

with (obj) {
   console.log(prop1); // prints 5 instead of 10
}
Run Code Online (Sandbox Code Playgroud)

建议不要使用with,并且在ECMAScript 5 严格模式下禁止使用.建议的替代方法是将要访问其属性的对象分配给临时变量.