abf*_*rid 33 javascript for-loop
我不确定这是否是正常行为,但运行此:
for (var i in [1, 2, 3]) {
console.log(i + 1);
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
// 01
// 11
// 21
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下,为什么var i
在这种情况下被视为字符串而不是如果我这样做for (var i = 0; i < [1, 2, 3].length; i++)
?
Der*_*ard 37
它很可能是因为在这个for循环风格(for..in)中,它被i
视为一个键,因为对象中的键通常是字符串(是的,数组是javascript中的一种对象),它将它视为一个字符串.
parseInt(i)
适用于这种情况,但对于良好的编程习惯,您可能希望使用for
类似于此的循环:
var array = [1, 2, 3];
for (var i = array.length - 1; i >= 0; i--) {
// do work with each array element here
}
Run Code Online (Sandbox Code Playgroud)
Ami*_*mit 18
原因是for .. in
迭代对象属性("键"),即使对于数组也是如此.在这种情况下,"键"是数组的"索引",但它仍然只是对象键.由于所有对象键都是字符串,因此i
获取字符串值.
D_4*_*_ni 11
我想你想要数组的值,而不是键.如果您不能使用ES6,Xorifelse的答案是有效的,但如果可以的话,那就for ... of
完全按照您的想法运作:
for (let i of [1, 2, 3]) {
console.log(i + 1);
}
Run Code Online (Sandbox Code Playgroud)
也有Array.prototype.forEach
在ES5和高达:
[1, 2, 3].forEach(function(value, index) {
console.log(value + 1);
});
Run Code Online (Sandbox Code Playgroud)
使用in
你遍历每个关键字关键的对象,而这些都是字符串类型和使用时+
对操作字符串,将导致它做一个级联分配.
如果要执行算术赋值,则运算符的左值和右值都必须是整数类型.解决方案是尝试将字符串解析为整数:
console.log(parseInt("0") + 1); // 1
Run Code Online (Sandbox Code Playgroud)
但是......
你应该循环使用该值:
var data = [1, 2, 3];
for(var key in data){
console.log('a: data['+ key + '] = ' + data[key]);
}
for (var i = 0; i < data.length; i++) {
console.log('b: data['+ i + '] = ' + data[i]);
}
data.forEach(function(value, index){
console.log('c: data[' + index + '] = ' + value);
});
Run Code Online (Sandbox Code Playgroud)
您可以使用ES6方法单独循环该值:
for(let v of [1, 2, 3]) {
console.log(v);
}
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是旧的Android设备不兼容,因为它有点新的标准.
如果您正在使用jQuery,您还可以查看$ .each,因为它允许在与旧设备兼容的漂亮单行中进行关键的值迭代.
$.each([1, 2, 3], function(index, value) {
console.log( index + ": " + value );
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3785 次 |
最近记录: |