for in

for…in语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。
for … in是为遍历对象属性而构建的,不建议与数组一起使用

  1. var obj = {a:1, b:2, c:3};
  2. for (var prop in obj) {
  3. console.log( prop);
  4. }
  5. //a,b,c

仅迭代自身的属性

如果你只要考虑对象本身的属性,而不是它的原型,那么使用 getOwnPropertyNames() 或执行 hasOwnProperty() 来确定某属性是否是对象本身的属性

  1. var triangle = {a: 1, b: 2, c: 3};
  2. function ColoredTriangle() {
  3. this.color = 'red';
  4. }
  5. ColoredTriangle.prototype = triangle;
  6. var obj = new ColoredTriangle();
  7. for (var prop in obj) {
  8. if (obj.hasOwnProperty(prop)) {
  9. console.log(prop);
  10. }
  11. }
  12. //这里就仅输出了 ColoredTriangle 自身的属性
  13. // color
  14. //这里就仅输出了 ColoredTriangle 自身的属性
  15. console.log(Object.getOwnPropertyNames(obj))
  16. //['color']

for of

for…of语句用于循环可迭代对象(ArrayMapSetStringargumentsnodeListHTMLCollection 等等)

  1. //迭代字符串
  2. let iterable = "boo";
  3. for (let value of iterable) {
  4. console.log(value);
  5. }
  6. // "b"
  7. // "o"
  8. // "o"
  9. //迭代Map
  10. let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);
  11. for (let entry of iterable) {
  12. console.log(entry);
  13. }
  14. // ["a", 1]
  15. // ["b", 2]
  16. // ["c", 3]
  17. //迭代 arguments
  18. function test(){
  19. for (let argument of arguments) {
  20. console.log(argument);
  21. }
  22. }
  23. test(1,2,3,4,5)
  24. //1
  25. //2
  26. //3
  27. //4
  28. //5
  29. //迭代 DOM 集合
  30. let nodeList = document.querySelectorAll('li')
  31. for(node of nodeList){
  32. console.log(node)
  33. }
  34. // <li></li>
  35. // ......

两者区别

for … in是为遍历对象属性而构建的,不要用它去遍历数组 。for…in 语句以任意顺序迭代对象的可枚举属性
for…of 语句遍历可迭代对象定义要迭代的数据
部分具体差异如下:

  1. Object.prototype.objCustom = function() {};
  2. Array.prototype.arrCustom = function() {};
  3. let iterable = [3, 5, 7];
  4. iterable.foo = 'hello';
  5. for (let i in iterable) {
  6. console.log(i); //打印得是key
  7. }
  8. for (let i in iterable) {
  9. console.log(iterable[i]); //打印得是value
  10. }
  11. // 0, 1, 2, "foo", "arrCustom", "objCustom" //key
  12. // 3, 5, 7, hello, ƒ () {}, ƒ () {} //value
  13. for(let i of iterable){
  14. console.log(i)
  15. }
  16. // 3 5 7

重要;虽然for … in 也能循环字符串/arguments/NodeList等等。但我们最好不用这个来循环数组/类数组。仅用作循环对象。