通过this
进行一些实验,我发现了以下内容:
var foo={foo:'bar',hello:'world'};
$.fn.test=function(){return this;}
$(foo).test()===$(foo); //returns false
我无法解释为什么最后一次比较会返回 false 。我确信调用函数this
时$(foo).test
为$(foo)
...
同样的事情发生在$(this).test()===$(this)
,它也返回 false ;但$(this).test()[0]===window
会按预期返回 true 。
有任何解释吗?
答案 0 :(得分:3)
执行$(foo)
时,您正在执行创建新jQuery对象的函数。
如果您再次尝试示例,但将对象存储在变量中,它应该按预期工作:
var $foo = $(foo);
$foo.test()===$foo; //=> true
这是因为JavaScript中的对象之间的比较是由身份完成的,而不是由内容完成。
如果您知道像C这样的语言,您应该理解为什么,如果不是,我会尝试解释:
var x = { a: 1 };
// What happens in memory is that the variable x stores a pointer to a location
// in memory with the actual content. So in C, if you tried to print x, you
// would get a long number instead of the actual object, eg: 2435080915
var y = { a: 1 };
// Now we created another object with the same content, but the content is
// duplicated in memory, it's not at the same place than x, because if it was,
// a modification to y would also affect x. So the pointer is
// another number, eg: 7043815509
// So when we do:
x == y
// what happens is that JavaScript compares the two numbers:
// 2435080915 == 7043815509
// which returns false.