魔术变量java_JavaScript中令你抓狂的魔术变量

JavaScript中令你抓狂的魔术变量

更新时间:2006年11月30日 00:00:00   作者:

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

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

代码如下:

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

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

相关文章

1a1b05c64693fbf380aa1344a7812747.png

这篇文章主要介绍了微信小程序map组件结合高德地图API实现wx.chooseLocation功能,结合实例形式分析了map组件调用高德地图API接口获取地理位置提示列表并返回location相关操作技巧,需要的朋友可以参考下2019-01-01

4f55910a645b073bc4fc65dc10dc14bd.png

这篇文章主要介绍了详解react-refetch的使用小例子,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-02-02

0ea3c7666119d5615e582f823fb3fad6.png

本文主要介绍了NodeJs创建Web服务器;Express创建Web服务器的两种方法,具有一定的参考价值,下面跟着小编一起来看下吧2017-02-02

4f96a78db829b1556ff16de21e013c7a.png

这篇文章主要给大家分享了完美兼容IE,chrome,ff的设为首页、收藏本站及保存到桌面js代码,有需要的小伙伴参考下。2014-12-12

8cc1031babc6aff2319f1c6af8544aa0.png

今天小编就为大家分享一篇layui 实现二级弹窗弹出之后 关闭一级弹窗的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2019-09-09

0c932a99bb7b6f23c937db507070cc7b.png

下面小编就为大家带来一篇JavaScript DOM节点操作方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2016-08-08

cca732bf65a93ed2ec0ac80c638460fe.png

今天小编就为大家分享一篇利用js将ajax获取到的后台数据动态加载至网页中的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-08-08

2d9f31f2af7b675a3d153d2b7f1035a7.png

这篇文章主要介绍了JS实现json对象数组按对象属性排序操作,涉及javascript使用sort方法针对json数组的遍历与排序相关操作实现技巧,需要的朋友可以参考下2018-05-05

b452cee8ec5cd9e58ab98eba17281e59.png

本篇文章主要介绍了使用JS在浏览器中判断当前网络状态的几种方法,非常具有实用价值,需要的朋友可以参考下2017-05-05

f4838ec7e2d4da28e0b57d4e852dadd4.png

这篇文章主要介绍了浅谈javascript原型链与继承的相关资料,需要的朋友可以参考下2015-07-07

最新评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值