以下是javascript中不直观的行为,
function function1 () {};
function function2 () {};
var class_a_functions = {function1:true, function2:true};
var contained = function1 in class_a_functions;//false
var equals = function1.name in class_a_functions;//true
为什么in
包含测试失败,即使我已将函数而不是其名称插入到字典中?
编辑: 如果它不明显,我知道function1.name是" function1"。这就是为什么我问为什么测试失败"即使我插入了函数,而不是他们的名字"。
答案 0 :(得分:3)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in
// Arrays
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees // returns true
3 in trees // returns true
6 in trees // returns false cause there's no 6th key in trees Array
"bay" in trees // returns false (you must specify the
// index number, not the value at that index)
"length" in trees // returns true (length is an Array property)
这就是它返回false
在另一种情况下,class_a_functions[0]
是对Array中存储函数的引用,这就是为什么相等返回true
导致fn1() === fn1()
现在,在您编辑的问题之后,上述内容似乎是无稽之谈,所以我会进一步回答:
var class_a_functions = {function1:true, function2:true};
现在是对象,其中function1
和function2
是简单属性,将true
作为值。
var contained = function1 in class_a_functions;//false
以上返回false
因为没有" function1"对象引用class_a_functions
var equals = function1.name in class_a_functions;//true
以上......好吧,让我们回到MDN,说:
Summary:
The in operator returns true if the specified property
is in the specified object.
所以你拥有function1
的属性现在让我们看看对象class_a_functions
中是否存在...是的。所以 TRUE
答案 1 :(得分:1)
我不确定为什么大多数答案都是如此微不足道并且没有真正解决激发问题的根本问题,即在javascipt中获取内存地址/对象散列/对象id是“不可能的”,并且因此,通过对象引用进行的相等测试也是“不可能的”。
How can I get the memory address of a JavaScript variable?
该包含问题的解决方案是对对象进行修补,以包含可用作键的唯一属性/字符串。
答案 2 :(得分:0)
in
用于标识密钥而不是值。
答案 3 :(得分:0)
in
运算符测试属性是否在对象中。 function1
不是数组的属性,它是成员。
答案 4 :(得分:0)
应该有
'function1' in class_a_functions;//true
这是因为
在字典中
obj = {key:5}
这等于
obj = {"key":5} // so it will be stored as string
如果您将看到文档prop
表示属性名称或数组索引的字符串或数字表达式。