JavaScript中令你抓狂的魔术变量


Posted in Javascript onNovember 30, 2006

在存在这么一个变量 tt, 它满足下面的代码.
代码执行完毕后 ,errCount=0 而且 断言函数也从未 alert 信息
代码如下: 
 

<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)为动态对象,有意义;这里已经找到有意义的表达式,故不再往下运算了。所以结果同上。
=====
对&&运算符,同理,不再多说。
题外话:
  有意思的是,在答案出来后,我们还采用了一些非常规手段的答这个题(仅供娱乐)

var tt=window["assert"]=new Function();
这句话的意思相当于下面两行代码 
function assert(){} 
function tt(){} 
javascript允许重复定义函数,执行的时候以以后一个为准。

Javascript 相关文章推荐
JavaScript入门教程(7) History历史对象
Jan 31 Javascript
javascript 支持链式调用的异步调用框架Async.Operation
Aug 04 Javascript
JavaScript中yield实用简洁实现方式
Jun 12 Javascript
jquery animate图片模向滑动示例代码
Jan 26 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
Jul 31 Javascript
使用text方法获取Html元素文本信息示例
Sep 01 Javascript
Windows8下搭建Node.js开发环境教程
Sep 03 Javascript
js实现简单div拖拽功能实例
May 12 Javascript
bootstrap Table的一些小操作
Nov 01 Javascript
在Create React App中使用CSS Modules的方法示例
Jan 15 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
Feb 21 Javascript
JS setTimeout与setInterval的区别
Apr 20 Javascript
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
Nov 30 #Javascript
小议Function.apply() 之一------(函数的劫持与对象的复制)
Nov 30 #Javascript
addRule在firefox下的兼容写法
Nov 30 #Javascript
跟随鼠标旋转的文字
Nov 30 #Javascript
推荐:极酷右键菜单
Nov 29 #Javascript
双击滚屏-常用推荐
Nov 29 #Javascript
js获取单选按钮的数据
Nov 27 #Javascript
You might like
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
php数组编码转换示例详解
2014/03/11 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
js CSS操作方法集合
2008/10/31 Javascript
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
在MAC上搭建python数据分析开发环境
2016/01/26 Python
浅析python中的分片与截断序列
2016/08/09 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
破解安装Pycharm的方法
2018/10/19 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
自我评价范文分享
2014/01/04 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
党员剖析材料范文
2014/12/18 职场文书
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers