手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >JavaScript中令你抓狂的魔术变量
JavaScript中令你抓狂的魔术变量
摘要:在存在这么一个变量tt,它满足下面的代码.代码执行完毕后,errCount=0而且断言函数也从未alert信息代码如下:复制代码代码如下:v...

在存在这么一个变量tt,它满足下面的代码.

代码执行完毕后,errCount=0而且断言函数也从未alert信息

代码如下:

复制代码 代码如下:<script>

vartt=/*请在这里定义tt*/;

varerrCount=0//全局变量,用来记录assert函数出现断言宣告的次数

/*

断言函数

如果v为假,该函数就alert("asserterror"),并累加计数器errCount

如果v为真,就什么也不做

*/

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允许重复定义函数,执行的时候以以后一个为准。

【JavaScript中令你抓狂的魔术变量】相关文章:

JavaScript中search()方法的使用

JavaScript中指定函数名称的相关方法

javascript中动态函数用法

javascript中this的四种用法

JavaScript中reduce()方法的使用详解

JavaScript函数使用的基本教程

Javascript 不能释放内存.

JavaScript中的函数嵌套使用

简介JavaScript中Math.LOG10E属性的使用

JavaScript模版引擎的基本实现方法浅析

精品推荐
分类导航