源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

JavaScript中令你抓狂的魔术变量

  • 时间:2020-04-16 18:18 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:JavaScript中令你抓狂的魔术变量
在存在这么一个变量 tt, 它满足下面的代码. 代码执行完毕后 ,errCount=0 而且 断言函数也从未 alert 信息 代码如下:   
[u]复制代码[/u] 代码如下:
<script>   var tt=/* 请在这里定义tt */;   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> 
   同发 CSDN: JavaScript中的魔术变量 这个问题是我一个同事在下班后考我的一个题目.我当时想了很久,也尝试了很久. 得到如下答案,能满足题目的要求. 答案如下: var tt=new Object(false); var tt=new Boolean(); var tt=new Boolean(false); 通过这个题目我们足可以感受到js的灵活,更可以加深对js的理解. 我以前经常在代码中使用如下判断 if (a){   alert('ok') } 现在看来,这样写的逻辑隐患是非常大的. 借csdn中一个网友的精彩回复来解释一下上面的问题 ||是这样运算的:从第一个开始,遇到有意义的返回,否则返回最后一个表达式(注意不一定是Boolean值); &&是这样运算的:从第一个开始,遇到无意义的返回,否则返回最后一个表达式(注意同上); !是这样运算的:对表达式的值取非(注意不是对表达式)。 什么是无意义呢:如下六个 0,null,undefined,"",false,NaN 除此,视为有意义。 new Boolean(),new Boolean(false)是同一个东西,由于它是一个对象,故是有意义的,但其值为false,所以,可以看为“有意义的false”,这样,就可以解释所有的问题了。 new Object(false),也是有意义的,其值也为false,只不过其类型为Object,而new Boolean()其类型为Boolean而已。 再提醒一点:||与&&这两个运算符不是对值的运算,即在运算过程中不管表达式的值,而是对表达式本身进行运算; 这两个运算符对表达式究竟如何运算? 答:只管表达式是否有意义,而不管其值几何。 对于表达式,无意义的只有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)为动态对象,有意义;这里已经找到有意义的表达式,故不再往下运算了。所以结果同上。 ===== 对&&运算符,同理,不再多说。 题外话:   有意思的是,在答案出来后,我们还采用了一些非常规手段的答这个题(仅供娱乐) [b]var tt=window["assert"]=new Function();[/b] 这句话的意思相当于下面两行代码  function assert(){}  function tt(){}  javascript允许重复定义函数,执行的时候以以后一个为准。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部