Javascript:同时评估为true和false!到底是怎么回事?

时间:2009-03-05 05:43:49

标签: javascript

有没有人解释javascript如何做到这一点。不知何故,这个函数在同一时间既是真的又是假的。这只是一次通过,没有循环或任何东西。

  console.log(key);
    if (this.watches.get(key)) {
      console.log("found it");
    } else {
      console.log("whhhat?");
    }
    console.log(this.watches);

Firebug Console按原样登录。

search-key
found it
Object search-key=Object $family=Object
whhhat?
Object search-key=Object $family=Object

[编辑] 这里是。上面的完整脚本和输出块是从firebug复制和粘贴的。这是我见过的最奇怪的事情。 http://snipt.org/Hkl

我使用mootools框架,所以this.watches = $ H({});是一个哈希表。我正在使用一个数组并遇到完全相同的问题,然后将其切换为$ H({}),因为我认为我做错了。

3 个答案:

答案 0 :(得分:9)

如果这个

Object search-key=Object $family=Object

由以下人员制作:

console.log(this.watches);

然后这显然是 而不仅仅是一次传递。

这并不是说它在一个循环或任何东西中,只是这个代码被多次调用。

有人可能会说

  

为什么搜索键只出现一次呢?

答案是:我们真的不知道,因为我们没有看到所有的代码。

最可能的情况是第二次key是空字符串

尝试console.log("") 什么都不打印

也试试这个:

>>> console.log(""); console.log(1); console.log(""); console.log(2)

复制输出并将其粘贴到任何文本编辑器中(即将其粘贴为纯文本)

1
2

看起来像在1和2之间没有任何东西,即使控制台 显示空行的提示,但当你复制粘贴时这个提示消失了输出为纯文本。

<强>更新

好吧,如果这个过程是通过调用WCHistory.implement(..)启动的,并且这个方法被调用了两次,那么很明显,第二次,由于某种原因,键是空的。

试试这个

console.log(key)更改为console.log("key: " + key),您应该会看到以下内容:

key: search-key
found it
Object search-key=Object $family=Object
key: 
whhhat?
Object search-key=Object $family=Object

答案 1 :(得分:1)

我认为答案是这不仅仅是一次通过。

这看起来代码被调用两次,然后第二次调用空键。可能需要查看更多代码才能确定。

我猜你可以在if语句之前加上一个整数计数来确认这个假设。

答案 2 :(得分:0)

将您的代码段更改为此,以查看它是否实际被调用了两次,但由于某种原因,console.log(key)第二次没有输出内容。

console.log("=====");
console.log(key);
if (this.watches.get(key)) {
  console.log("found it");
} else {
  console.log("whhhat?");
}
console.log(this.watches);

然后你会得到输出:

=====
search-key
found it
Object search-key=Object $family=Object
=====
whhhat?
Object search-key=Object $family=Object

如果你得到输出:

=====
search-key
found it
Object search-key=Object $family=Object
whhhat?
Object search-key=Object $family=Object

然后我错了,我会删除答案(或者更有可能将其作为社区维基,以便其他人不会遵循相同的路径)。