gpt4 book ai didi

javascript - 无法理解 Javascript Koans 中的反射测试

转载 作者:搜寻专家 更新时间:2023-11-01 04:33:28 25 4
gpt4 key购买 nike

已经有一个答案发布到测试本身,可以找到here ,但我似乎无法弄清楚为什么这个答案是正确的。

test的部分给我带来麻烦的是:

var keys = [];
var fruits = ['apple', 'orange'];
for(propertyName in fruits) {
keys.push(propertyName);
}
ok(keys.equalTo(['__', '__', '__']), 'what are the properties of the array?');

如上述链接问题所述,(显然)正确答案是

ok(keys.equalTo(['0', '1', 'fruits.prototype'), 'what are the properties of the array?');

我尝试插入答案 - 修复了语法错误 - 但我的测试仍然失败。

在同一个测试文件中,另一个测试几乎相同,答案是我所期望的:

test("property enumeration", function() {
var keys = [];
var values = [];
var person = {name: 'Amory Blaine', age: 102, unemployed: true};
for(propertyName in person) {
keys.push(propertyName);
values.push(person[propertyName]);
}
ok(keys.equalTo(['name','age','unemployed']), 'what are the property names of the object?');
ok(values.equalTo(['Amory Blaine',102,true]), 'what are the property values of the object?');
});

我能看出这两个测试之间的唯一区别是第二个测试使用的是对象而不是数组。

我自己运行第一个测试的代码(在单元测试框架之外)并输出键的值,它显示为 ["0","1"] - 什么我会期待。这个隐藏的第三个值在哪里,我如何访问它?

所以,我想我最终有两个问题:

  1. 为什么另一个问题的答案对我不起作用?
  2. 第一个测试和第二个测试有什么不同?

最佳答案

免责声明:我很确定这是正确的,但还没有费心去测试它。既然你已经运行了测试,你能试试我的答案吗?

查看 GitHub 上的文件,有一个名为 koan.js 的帮助脚本.我假设它在测试之前加载,因为我懒得自己运行它们:P。 (它在 support 目录中。)

在这个文件中,在所有数组上定义了一个名为equalTo的方法:

Array.prototype.equalTo = function(compareTo) { ... }

所以你的问题的答案:

  1. 因为另一个问题的答案是错误的。完全被误导了。等
  2. 因为该方法是在 Array 而不是 Object 上定义的。

似乎有点平淡无奇。

如果你在原型(prototype)上定义这样一个函数,它会被所有的数组继承。尝试在控制台中定义类似的内容,然后计算 [].equalTo。然后,为了获得更多乐趣,请尝试以下操作:

for (x in []) console.log(x)

由于此方法是在原型(prototype)上定义的,因此循环也会对其进行迭代。所以测试的答案可能是 0, 1, 'equalTo'。但是,如果您使用带有 hasOwnProperty 检查的 for 循环,它自然不会迭代该方法。

这确实是一个关于不使用 for in 遍历数组的实例类(class):)。你永远不知道会潜入什么......巧合的是,这就是为什么 prototype.js 尽管实际上是一个很好的框架却失宠的原因。

关于javascript - 无法理解 Javascript Koans 中的反射测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9322459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com