【问题标题】:How do for/in loops work in Javascript? codecademy exercise [duplicate]for/in 循环如何在 Javascript 中工作? codecademy 练习
【发布时间】:2017-01-07 07:19:39
【问题描述】:

这是我第二次复习 codecademy 中的 Javascript 课程,但有些东西我不太明白。在名为“联系人列表项目”的练习中,以下应该是课程提供的用于查看示例的结束代码。

var friends = {};
    friends.bill = {
      firstName: "Bill",
      lastName: "Gates",
      number: "(206) 555-5555",
      address: ['One Microsoft Way','Redmond','WA','98052']
    };
    friends.steve = {
      firstName: "Steve",
      lastName: "Jobs",
      number: "(408) 555-5555",
      address: ['1 Infinite Loop','Cupertino','CA','95014']
    };

    var list = function(obj) {
      for(var prop in obj) {
        console.log(prop);
      }
    };

    var search = function(name) {
      for(var prop in friends) {
        if(friends[prop].firstName === name) {
          console.log(friends[prop]);
          return friends[prop];
        }
      }
    };

    list(friends);
    search("Steve");

代码在控制台中产生以下结果:

bill
steve
{ firstName: 'Steve',
  lastName: 'Jobs',
  number: '(408) 555-5555',
  address: [ '1 Infinite Loop', 'Cupertino', 'CA', '95014' ] }
{"firstName":"Steve","lastName":"Jobs","number":"(408) 555-5555","address":["1 Infinite Loop","Cupertino","CA","95014"]}

for/in 循环究竟是如何工作的?我知道这只是一个占位符,但为什么 list(friends) 只提供“bill”和“steve”?不是应该贯穿一个对象的所有属性吗?

【问题讨论】:

    标签: javascript for-loop


    【解决方案1】:

    它贯穿friends 对象的所有属性。该对象只有 2 个属性,billsteve,定义如下:

    var friends = {};
        friends.bill = {
          ...
        };
        friends.steve = {
          ...
        };
    

    这两个中的所有子属性都与初始 for/in 循环无关。 search 函数是在找到带有 firstName === 'steve' 的函数后将它们打印出来的原因

    【讨论】:

    • Codecademy 将“bill”和“steve”称为对象的键,即 obj.[key],并将其子属性称为“属性”。这些术语(键、属性、子属性)是否可以互换,或者它们是否有我没有得到的特定定义?如果您能对此有所了解,请提前感谢您。
    • 属性由键和值组成。这里 bill 是键,steve 是键,它们相等的对象是它们的值。
    • 感谢您的帮助。最后一个问题,为什么代码需要list(friends); 才能运行search("Steve");?这些功能不是相互独立的吗?
    • 没有!它只是在那里向您展示属性。如果您注释掉list(friends) 行,您会发现搜索工作正常。 list() 只是将它们打印到控制台(或“列出”它们)供您查看
    【解决方案2】:

    我认为深入了解Object.defineProperty() 描述的here 将消除您对propertykeyvalue 的困惑。

    Object.defineProperty(obj, 'key', {
      enumerable: false,
      configurable: false,
      writable: false,
      value: 'static'
    });
    

    【讨论】:

    • 他没有使用Object.defineProperty(),那么这将如何消除他的困惑?
    • 从他对问题的期望和对另一个答案的评论中可以看出,对属性和键的困惑。
    • 看起来他的困惑是关于嵌套在其他对象中的对象。他不懂等级制度。我不确定defineProperty() 的文档对此有何帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 2023-02-05
    • 2014-06-27
    • 1970-01-01
    • 2022-08-12
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多