时间:2021-05-26
在存在这么一个变量tt,它满足下面的代码.
代码执行完毕后,errCount=0而且断言函数也从未alert信息
代码如下:
复制代码 代码如下:<script>
vartt=;
varerrCount=0//全局变量,用来记录assert函数出现断言宣告的次数
functionassert(v){
if(!v){
alert("asserterror");
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>
同发CSDN:JavaScript中的魔术变量
这个问题是我一个同事在下班后考我的一个题目.我当时想了很久,也尝试了很久.
得到如下答案,能满足题目的要求.
答案如下:
vartt=newObject(false);
vartt=newBoolean();
vartt=newBoolean(false);
通过这个题目我们足可以感受到js的灵活,更可以加深对js的理解.
我以前经常在代码中使用如下判断
if(a){
alert('ok')
}
现在看来,这样写的逻辑隐患是非常大的.
借csdn中一个网友的精彩回复来解释一下上面的问题
||是这样运算的:从第一个开始,遇到有意义的返回,否则返回最后一个表达式(注意不一定是Boolean值);
&&是这样运算的:从第一个开始,遇到无意义的返回,否则返回最后一个表达式(注意同上);
!是这样运算的:对表达式的值取非(注意不是对表达式)。
什么是无意义呢:如下六个0,null,undefined,"",false,NaN
除此,视为有意义。
newBoolean(),newBoolean(false)是同一个东西,由于它是一个对象,故是有意义的,但其值为false,所以,可以看为“有意义的false”,这样,就可以解释所有的问题了。
newObject(false),也是有意义的,其值也为false,只不过其类型为Object,而newBoolean()其类型为Boolean而已。
再提醒一点:||与&&这两个运算符不是对值的运算,即在运算过程中不管表达式的值,而是对表达式本身进行运算;
这两个运算符对表达式究竟如何运算?
答:只管表达式是否有意义,而不管其值几何。
对于表达式,无意义的只有6个;这里要注意:所有以new方式生成的对象为动态对象,动态对象均视为有意义
再举例两个说明:
一、0||false||newBoolean(false)
运算如下:
首先:0是一个常数,刚好是无意义之一,故继续;而false也是无意义之一,故再继续;newBoolean(false)为动态对象,有意义,故上面运算结果为newBoolean(false)
二、0||newBoolean(false)||true
这会是什么结果?很多人不注意就会以为结果为true,但这是不对的。
先说答案:结果同上
首先:0是一个常数,刚好是无意义之一,故继续;newBoolean(false)为动态对象,有意义;这里已经找到有意义的表达式,故不再往下运算了。所以结果同上。
=====
对&&运算符,同理,不再多说。
题外话:
有意思的是,在答案出来后,我们还采用了一些非常规手段的答这个题(仅供娱乐)
vartt=window["assert"]=newFunction();
这句话的意思相当于下面两行代码
functionassert(){}
functiontt(){}
javascript允许重复定义函数,执行的时候以以后一个为准。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
我们在PHP中经常用到魔术方法,像构造方法,析构方法等等魔术变量,下面总结一下一些常用的魔术变量:__construct(),__destruct(),__cl
一、变量说到javascript中的delete操作符,还是首先要搞清楚javascript中的变量和属性之间的关系。javascript中,变量和对象属性关系
作用域是可访问变量的集合。JavaScript作用域在JavaScript中,对象和函数同样也是变量。在JavaScript中,作用域为可访问变量,对象,函数的
PHP在设计的时候已经预定义了9个超级全局变量、8个魔术变量和13魔术函数,这些变量和函数可以在脚本的任何地方不用声明就可以使用。在PHP开发会频繁的使用这些变
1.JavaScript访问C#函数2.JavaScript访问C#变量3.C#中访问JavaScript的已有变量4.如何在C#中访问JavaScript函数