相等的界定:作用域相同,函数内容相同否则,不相等如下代码:
<script type="text/javascript">var txt = 'w';var x = function(){
var txt = 'x';
return function(){alert(txt)};
};var y = function(){
var txt = 'y';
return function(){alert(txt)};
};
var a = x(),b = y();var A = function(){alert(txt)},B = function(){alert(txt)};//怎样判断a和b不等
//怎样判断A和B相等</script>
欢迎大家踊跃讨论!
<script type="text/javascript">var txt = 'w';var x = function(){
var txt = 'x';
return function(){alert(txt)};
};var y = function(){
var txt = 'y';
return function(){alert(txt)};
};
var a = x(),b = y();var A = function(){alert(txt)},B = function(){alert(txt)};//怎样判断a和b不等
//怎样判断A和B相等</script>
欢迎大家踊跃讨论!
用valueOf()或toString()可以获得函数的源代码。
原先FF2左右的版本还可以用eval来访问到scope里面,不过现在FF3貌似把那个功能给和谐了...
是啊,现在object.eval木有用鸟~~``` - -!
如果就函数体而言,可以判断是否相等(检查函数体字符串即可)但a!=b, A!=B,a!==b, A!==B,这是永远成立的(内存地址个各不相同)
对象就有toString方法
对象就有内存地址
答案是不存在,证明如下:假定存在一个function P能判断任意两个一般函数f1和f2是否等价,即
若f1、f2等价,P(f1,f2) return true
若f1、f2不等价, P(f1,f2) return false;
现在我定义一个函数P1
function P1(f1,f2){
if(P(P,f1) && P(P1,f2)) return false;
else return P(f1,f2);
}
那么对于P(P,P1)
1) 若P(P,P1) return true,那么P,P1等价,可P1(P,P1)却return false,显然和P,P1等价假设矛盾
2) 若P(P,P1) return false,那么P1(P,P1) return false,而对于任意其它f1,f2,显然P1(f1,f2)的返回值都和P(f1,f2)的返回值完全相同,根据前面的定义,P与P1等价,同P(P,P1) return false矛盾。
综上所述,不存在一个函数P,能够判定JavaScript的两个function等价。
证毕。
如果这样赋值 a和b是值对象
a = 3;
b = 4;
这时候比较是拿值来比较的
a = function(){return true;};
b = function(){return false;};
这个时候a和b已经被function一词给改变了 a和b是类对象了 比较的时候是拿a和b这两个对象在内存中的地址来比较的
要想比较两个方法相等
a = "function(){return true;};";
b = "function(){return false;}";
就直接拿a和b的字符串来比
.prototype.construcotr == 可以吗
比较toString几乎没任何意义:<script>
function doSomething() {
alert('go stop');
}
function f() {
doSomething();
}
var f2 = function() {
function doSomething() {
alert('do nothing');
}
function f() {
doSomething();
}
return f;
}();
f();
f2();
alert(f);
alert(f2);
alert(f == f2);
</script>
假定存在一个function P能判断任意两个一般函数f1和f2是否等价。
若f1与f2等价 P(f1,f2) 返回true
若f1与f2不等价 P(f1,f2) 返回false
重新定义一个新的function P1:
function P1(f1, f2){
if(P(f1,P) && P(f2,P1)) return false;
else return P(f1,f2);
}现在讨论P(P,P1)的值:
1)若P(P,P1) return true,则P1与P等价,但P1(P,P1) 却return false,与P和P1等价性矛盾。
2)若P(P,P1) return false,则P1与P不等价。但P1(P,P1)return false,而对于其他任意情况的f1,f2,显然P(f1,f2)的返回值都和P1(f1,f2)的返回值相同。根据等价性的定义P与P1等价,与P(P,P1) return false矛盾。
结论:不存在能判断任意两个函数等价性的一般函数,由于一般函数与图灵机程序是等价的,故不存在能判断任意两个一般递归函数等价性的程序。“任意两个一般函数等价性”是不可判定的。
证毕。
return (typeof a=="function" && typeof b=="function" && a.toString()==b.toString());
}
//这样可以判断两个函数(字面上)相同,包括空格和缩进等都相同才返回true。
//现实中,function a(s){alert(s)} 和 function abc(str){alert(str)} 也是等效的函数,但这个就不容易判断了,但不是不可以判断,只是没那个必要。