呵呵,估计要用eval了没时间考虑,一下
解决方案 »
- 关于程序中设置了按键控制却没有反应的问题
- js中正则表达式语法KPI(年统计|2011-04-15 18:49:04|qqq|www|eee|rrr|ttt|yyy|uuu)
- IE6后退时表单历史记录的诡异问题
- 建立用户菜单中出现一个问题,麻烦大家帮忙解决下…………
- jquery为什么不能使用after和before来创造一个table
- 下拉列表框与表格的动态增加问题(没有分了,有分时一定补上)
- 控制文本框输入?
- 怎样实时取得服务器时间?不刷新页面!
- 关于浏览器页眉和页脚的问题
- 如果让下面的代码兼容谷歌和firefox浏览器,解决立即给分!
- xmldoc.load()能否导入客户端指定路径下的xml文件
- 祝:大家元旦快乐,顺便问个问题。。。
var tt = new Object();
tt.toString = function(){
// alert(tt.toString.caller)
return false;
}
var errCount = 0;
function assert(v) {
if (!v) {
alert("assert error");
errCount++;
}
}assert((tt || true) == false)
assert((tt || false) == false)
assert((tt && true) == true)
assert((tt && false) == false)
assert((true || tt ) == true)
assert((tt || true ) == false)
assert((false || tt ) == false)
assert((tt || false ) == false)
assert((true && tt) == false)
assert((tt && true ) == true)
assert((false && tt ) == false)
assert((tt && false ) == false)assert((tt ? true : false) == true)
assert((tt == false) == true)
assert((!tt == tt ) == true)
assert((tt + '') == "false")
assert(tt == false)
alert(errCount) //结果是打印 0</script>
断言函数
如果v为假,该函数就 alert("assert error"),并累加计数器 errCount
如果v为真,就什么也不做
*/
function assert(v) {
if (!v) {
alert("assert error");
errCount++;
}
}assert((tt || true) == false) //无解
assert((tt || false) == false) //tt != true
assert((tt && true) == true) //tt =true
assert((tt && false) == false) //tt = any
assert((true || tt ) == true) //tt = any
assert((tt || true ) == false) //无解
assert((false || tt ) == false) //tt=false
assert((tt || false ) == false) //tt=false
assert((true && tt) == false) //tt=any
assert((tt && true ) == true) //tt=true
assert((false && tt ) == false) //tt=any
assert((tt && false ) == false) //tt=any
assert((tt ? true : false) == true) //tt=true
assert((tt == false) == true) //tt=false;
assert((!tt == tt ) == true) //无解
assert((tt + '') == "false") //tt=false
assert(tt == false) //tt=false
alert(errCount) //结果是打印 0</script>
================================================试验了 null/false/NaN都不行
想想,除了一个空的Boolean没别的办法
于是…………搞定
断言函数
如果v为假,该函数就 alert("assert error"),并累加计数器 errCount
如果v为真,就什么也不做
*/
function assert(v) {
if (!v) {
alert("assert error");
errCount++;
}
}assert((tt || true) == false) //无解
assert((tt || false) == false) //tt != true
assert((tt && true) == true) //tt =true
assert((tt && false) == false) //tt = any
assert((true || tt ) == true) //tt = any
assert((tt || true ) == false) //无解
assert((false || tt ) == false) //tt=false
assert((tt || false ) == false) //tt=false
assert((true && tt) == false) //tt=any
assert((tt && true ) == true) //tt=true
assert((false && tt ) == false) //tt=any
assert((tt && false ) == false) //tt=any
assert((tt ? true : false) == true) //tt=true
assert((tt == false) == true) //tt=false;
assert((!tt == tt ) == true) //无解
assert((tt + '') == "false") //tt=false
assert(tt == false) //tt=false
alert(errCount) //结果是打印 0</script>
--------------------------------------------------------
我这个也可以做到
可能和运算符的优先级、自动类型转换、以及JScript的类型机制有关
有时间研究一下
是什么让errCount为1的,发出来看看啊。
var errCount=0 //全局变量,用来记录 assert 函数出现断言宣告的次数/*
断言函数
如果v为假,该函数就 alert("assert error"),并累加计数器 errCount
如果v为真,就什么也不做
*/
function assert(v) {
if (!v) {
alert("assert error");
errCount++;
}
}assert((tt || true) == false) //无解
assert((tt || false) == false) //tt != true
assert((tt && true) == true) //tt =true
assert((tt && false) == false) //tt = any
assert((true || tt ) == true) //tt = any
assert((tt || true ) == false) //无解
assert((false || tt ) == false) //tt=false
assert((tt || false ) == false) //tt=false
assert((true && tt) == false) //tt=any
assert((tt && true ) == true) //tt=true
assert((false && tt ) == false) //tt=any
assert((tt && false ) == false) //tt=any
assert((tt ? true : false) == true) //tt=true
assert((tt == false) == true) //tt=false;
assert((!tt == tt ) == true) //无解
assert((tt + '') == "false") //ft~这个地方不能通过。
assert(tt == false) //tt=false
alert(errCount) //结果是打印 1</script>
我考虑hack手法
function assert(v) {
if (true){}return true; {
alert("assert error");
errCount++;
}
}
如果能适当构造tt,能把assert(v)函数在运行时动态的替换成上面这个就成了
var tt=new Boolean();
var tt=new Boolean(false);都可以但是很难讲出为什么会这样.
alert(new Boolean() || true);
alert(typeof new Boolean() || true);
<script>var tt=(function () {
if (typeof(assert)=="function") {
window.assert = function () {
};
}
}
)();var errCount=0 //全局变量,用来记录 assert 函数出现断言宣告的次数/*
断言函数
如果v为假,该函数就 alert("assert error"),并累加计数器 errCount
如果v为真,就什么也不做
*/
function assert(v) {
if (!v) {
alert("assert error");
errCount++;
}
}assert((tt || true) == false)
assert((tt || false) == false)
assert((tt && true) == true)
assert((tt && false) == false)
assert((true || tt ) == true)
assert((tt || true ) == false)
assert((false || tt ) == false)
assert((tt || false ) == false)
assert((true && tt) == false)
assert((tt && true ) == true)
assert((false && tt ) == false)
assert((tt && false ) == false)assert((tt ? true : false) == true)
assert((tt == false) == true)
assert((!tt == tt ) == true)
assert((tt + '') == "false")
assert(tt == false)
alert(errCount) //结果是打印 0</script>
var tt=window["assert"]=new Function();
foo = {
'bar': function () {
alert(this);
},
'toString': function () {
return 'foo';
}
};
(foo.bar || null)();
</script>
详细参见:http://blog.never-online.net/article.asp?id=117js内部解释器是如何解释的,很难推测或者自己想办法用代码来判断。上面object转型和||的运用也是类似。
if(!document.getElementById("aaa"))
{
alert("没有")
}
也就是说object算true,而现在的程序在看看,一个object和boolean的||就只有可能是object或者true,不可能有其他选择
大家可以看
alert("aaa"||true)
alert("bbbb"||false)
alert(true||"aaa")
alert(false||"bbbb")
也就是说第一个先判断如果为false,还要执行后面的,这就是说这里全部都是(!v)全部都是false
boolean的值默认是false
alert(new Boolean() || true);这句话的意思我感觉其实是false这个对象和true进行比较,而不是false这个value值,也就是说,这样我们再看看上面所有的操作assert((tt || true) == false) //第一个条件就成立,后面不执行,括号内为对象false(注意不是值),和false值相等true
assert((tt || false) == false) //同上
assert((tt && true) == true) //括号内为true,和true值相等true
assert((tt && false) == false) //括号内为false,和false值相等true
assert((true || tt ) == true) //括号内为true,和true值相等true
assert((tt || true ) == false) //第一个条件就成立,后面不执行,括号内为对象false(注意不是值),和false值相等true
assert((false || tt ) == false) //第一个条件就成立,后面不执行,括号内为false值,和false值相等true
assert((tt || false ) == false) //第一个条件就成立,后面不执行,括号内为对象false(注意不是值),和false值相等trueassert((true && tt) == false) //括号内为false,和false值相等true ?????????
assert((tt && true ) == true) //括号内为true,和true值相等true ?????????
assert((false && tt ) == false) //括号内为false,和false值相等true
assert((tt && false ) == false) //括号内为false,和false值相等true assert((tt ? true : false) == true) //后面不写了,同理的
assert((tt == false) == true)
assert((!tt == tt ) == true)
assert((tt + '') == "false")
assert(tt == false)但是现在我有个地方想不通
alert(new Boolean() && true);
alert(new Boolean() && false);
alert(true && new Boolean() );
alert(false && new Boolean() );
上面这四个为什么第一个和第三个不相同。
至于后面的想不通的地方,好象只有最开始的第一个则被当成对象运算,其后的都是值来运算,搞不懂怎么设计的
比如也可以看alert(new Boolean() && true && new Boolean());这样就是false了
&&是这样运算的:从第一个开始,遇到无意义的返回,否则返回最后一个表达式(注意同上);
!是这样运算的:对表达式的值取非(注意不是对表达式)。什么是无意义呢:如下六个 0,null,undefined,"",false,NaN
除此,视为有意义。new Boolean(),new Boolean(false)是同一个东西,由于它是一个对象,故是有意义的,但其值为false,所以,可以看为“有意义的false”,这样,就可以解释所有的问题了。
new Object(false),也是有意义的,其值也为false,只不过其类型为Object,而new Boolean()其类型为Boolean而已。
但在这里类型并不影响所涉及的运算。相信大家都应该明白了。===
注明一下:有意义无意义是我给的概念[不知是不是我以前看别人这么说,呵呵],但是这样的解释是非常合理,而且易记的。
==
楼主结帖吧,版主加精最好。呵呵!
<script language=javascript>
alert(new Boolean() && true && new Boolean());
alert(new Boolean() && new Boolean()&& true);
</script>
assert((tt || false ) == false)//出现了两次
assert((tt && true ) == true)//出现了两次
assert((tt && false ) == false)//出现了两次
我觉得要点在这里:alert(typeof (tt||true))
alert(typeof (tt||false))
alert(typeof (true||tt))
alert(typeof (false||tt))
alert(typeof (tt && true))
alert(typeof (tt && false))
alert(typeof (true && tt))
alert(typeof (false && tt))
alert((tt||false).toString())//"test"
alert((true||tt).toString())//"true"
alert((false||tt).toString())//"test"
alert((tt && true).toString())//"true"
alert((tt && false).toString())//"false"
alert((true && tt).toString())//"test"
alert((false && tt).toString())//"false"
。用||逻辑符是不会进行转型的,至少结果如此
alert("" || true)
alert(' ' || true)用其它的逻辑符就应该会转型。
alert("123"==123)
呵呵
<script language=javascript>
alert(new Boolean() && true && new Boolean());
alert(new Boolean() && new Boolean()&& true);
</script>
我还以为结果应该是object true原来是false true哈哈
xxuu503(被扣信誉是种光荣)的这段经典,刚才我还想说逻辑符有的不会转型,却一时没想到用typeof...:p
。用||逻辑符是不会进行转型的,至少结果如此
alert("" || true)
alert(' ' || true)用其它的逻辑符就应该会转型。
alert("123"==123)
……………………不是不转型,只不过是算法很古怪
答:只管表达式是否有意义,而不管其值几何。
对于表达式,无意义的只有6个(见我上次回复);这里要注意:所有以new方式生成的对象为动态对象,动态对象均视为有意义--这一点上次回复忘加说明(-_-!)。再举例两个说明:
一、0||false||new Boolean(false)
运算如下:
首先:0是一个常数,刚好是无意义之一,故继续;而false也是无意义之一,故再继续;new Boolean(false)为动态对象,有意义,故上面运算结果为new Boolean(false)
二、0||new Boolean(false)||true
这会是什么结果?很多人不注意就会以为结果为true,但这是不对的。
先说答案:结果同上
首先:0是一个常数,刚好是无意义之一,故继续;new Boolean(false)为动态对象,有意义;这里已经找到有意义的表达式,故不再往下运算了。所以结果同上。
=====
对&&运算符,同理,不再多说。
这里tt值是undefined
undefined类型转到bool都是false
但
undefined==false 返回的是false哟
var yn=new Boolean(false);
alert(yn)
alert(!yn)
alert("Fuck Begin");
alert( (yn||false) ) //false
alert( (yn||true) ) //false
alert( (yn&&false) ) //false
alert( (yn&&true) ) //true
alert("-------------------");
alert( (false||yn) ) //false
alert( (true||yn) ) //true
alert( (false&&yn) ) //false
alert( (true&&yn) ) //false
alert("Fuck End");
</script><script>
alert( "||出错时返回第一个对象"||yn );
alert( yn&&"&&出错时返回最后一个对象" );
</script>
var tt;我测试过最后是13
javascript的类型不用指定,会自动转换为任何类型,即使是转换成一个自定义的对象也不成问题。