Oo缘来是你oO


posts - 120,comments - 125,trackbacks - 0
                               JavaScript中的Boolean,你了解多少?
                                                       马嘉楠      2006-10-30


今天看了一下Flyingis写的《ECMAScript 基础》一文。在看到
Boolean类这一块内容的时候,随手写了几行代码,问题出现了^+^
注:此文讨论的是JavaScript1.5


还是先来看一段非常简单的代码

// code:1
var  x  =   false ;   
var  y  =   true
;

// code:2

var  xObject  =   new  Boolean( false );
var  yObject  =   new  Boolean( true
);

// code:3

var  resX  =   new  Boolean(x);
var  resY  =   new
 Boolean(y);

// code:4

var  resXObject  =   new  Boolean(xObject);
var  resYObject  =   new
 Boolean(yObject);

// code:5

alert( " resX =  "   +  resX  +   "  and resY =  "   +  resY);
alert(
" resXObject =  "   +  resXObject  +   "  and resYObject =  "   +  resYObject);

你明白code:1~4 之间的区别么?(你一定对code:1最为熟悉,这是我们最常用的)
你知道code:5 的输出结果么?(可以先想想,在运行代码看结果,如果不明白,可以继续看下去)


如果你已经开始头晕了,那就暂时不去想了,看我下面的解释。
如果你都知道了(哇,高手啊,呵呵^+^),那我还有个问题需要你的解答,在此先谢过了。


正文:
JavaScript中的Boolean类型

1.   我们所熟悉的

var x = false;
var y = true;

这是我们大家都熟悉的,此时我们使用的是原始的Boolean值(the primitive Boolean values )true和false

2.   我们很少用到的

var xObject = new Boolean(false);
var yObject = new Boolean(true);

此时我们声明了一个Boolean对象,Boolean对象是对Boolean值的一个封装。
Boolean对象:一个值为true或false的Boolean对象。

原始的Boolean值和Boolean对象是有区别的,不要相互混淆,引用Core JavaScript 1.5 Reference中的一句话:Do not confuse the primitive Boolean values true and false with the true and false values of the Boolean object.


3.   区别

区别(1):   声明形式

区别(2):   在条件语句(condition statement)中

var x = false;
var xObject = new Boolean(false);

if(x)
    alert(
"x = true");
else
    alert(
"x = false");

if(xObject)
    alert(
"xObject = " + xObject + ", but in the condition statement, the xObject value is evaluated to true");
else
    alert(
"xObject = false");


输出结果:

= false
xObject 
= false,  but in the condition statement, the xObject value is evaluated to true


当一个值为false的Boolean对象放到条件语句当中的时候,Boolean对象的值会被当作true来计算,但是它本身的值并没有改变,依然是false。很有趣,我只知道现象,具体原因不清楚,不知道发明者出于什么地考虑。但是在JavaScript1.2或者更早的版本中却有所不同,在条件语句(condition statement)中,Boolean对象的计算返回的是其对应的原始Boolean的值。


区别(3):初始化Boolean对象

声明一个Boolean对象,如果我们用一个值为false的Boolean对象对其进行初始化,则新的Boolean对象的值为true

var xObject = new Boolean(false);
var resXObject = new Boolean(xObject);
alert(
"The resXObject value is " + resXObject);

原始的Boolean值和Boolean对象区别如此之大,所以切记二者区别,不要混淆使用。

对于code:5 的输出结果,你现在明白是什么原因了吧。



上面的东东我也是今天遇到了问题,查了一些资料才知道,学无止境啊。可是我的问题依然没有解决。
我的问题是关于Boolean对象的初始化。代码如下,

var ob1 = new Boolean(false);
var ob2 = (ob1&&true);
var ob3 = (true&&ob1);
var ob4 = Boolean(ob1&&true);
var ob5 = Boolean(true&&ob1);
alert(
"ob2 = " + ob2 + " ob3 = " + ob3 + " ob4 = " + ob4 + " ob5 = " + ob5);

结果:

ob2 = true ob3 = false ob4 = true ob5 = true

js.JPG


我对ob2 和 ob3的结果不太理解,为什么我只是更改了ob1和true的顺序,结果去完全不同了。并且可以发现,结果均等于操作符“&&”后面的值。

希望大家能告诉我!


问题已经解决:

||是这样运算的:从第一个开始,遇到有意义的返回,否则返回最后一个表达式(注意不一定是Boolean值);

&&是这样运算的:从第一个开始,遇到无意义的返回,否则返回最后一个表达式(注意同上);

!是这样运算的:
对表达式的值取非(注意不是对表达式)。

什么是无意义呢:如下六个 0,null,undefined,"",false,NaN。除此,视为有意义。

new Boolean(),new Boolean(false)是同一个东西,由于它是一个对象,故是有意义的,但其值为false,所以,可以看为“有意义的false”,所以结果为最后一个表达式的值。

谢谢
jeffjie

继续学习^+^






马嘉楠
jianan.ma@gmail.com

posted on 2006-10-30 23:41 马嘉楠 阅读(4909) 评论(14)  编辑  收藏 所属分类: Java Script

FeedBack:
# re: JavaScript中的Boolean,你了解多少?
2006-10-31 00:17 | JonneyQuest
好像JavaScript的设计者把简单的事情做得复杂了。
这么设计有意义吗?  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2006-10-31 00:53 | jeffjie

var x = false;
var xObject = new Boolean(false);

if(x)
alert("x = true");
else
alert("x = false");

if(xObject)
alert("xObject = " + xObject + ", but in the condition statement, the xObject value is evaluated to true");
else
alert("yObject = false");
这个的原因我凭自已的经验解释一下:
javascript 的 if表达式内的表达式如果不是比较表达式,即不是类似 == < > 这类的表达式时,会把里面的表达式当作一个对象来处理,只要这个对象不为空,就返回true,正如new Boolean(false)是一个Boolean的对象,不为空。如果你的表达式是这样:if(xObject.valueOf() == true)的话,这时候就会返回Flase了。
个人意见,python也是这样处理if的表达式。

至于
var ob1 = new Boolean(false);
var ob2 = (ob1&&true);
var ob3 = (true&&ob1);
这个,我重现不了您说的结果。
  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2006-10-31 01:17 | 马嘉楠
@jeffjie

谢谢啦
问题已经解决:

||是这样运算的:从第一个开始,遇到有意义的返回,否则返回最后一个表达式(注意不一定是Boolean值);

&&是这样运算的:从第一个开始,遇到无意义的返回,否则返回最后一个表达式(注意同上);

!是这样运算的:对表达式的值取非(注意不是对表达式)。

什么是无意义呢:如下六个 0,null,undefined,"",false,NaN
除此,视为有意义。

new Boolean(),new Boolean(false)是同一个东西,由于它是一个对象,故是有意义的,但其值为false,所以,可以看为“有意义的false”,(正如你所说的一样)。
所以结果为最后一个表达式的值。

继续学习^+^
  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2006-10-31 02:14 | jeffjie
长知识了。谢谢。不过你最后的那个例子,在我的机子上的确重现不了。
firefox1.5 ubuntu。。
明天回公司用IE估计可以重现。应该是Javascipt的支持不同的原因。
像上面的情况,的确有点令人费解。尽管是有道理。。呵  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2006-10-31 09:04 | xinheqishi
长见识了,谢谢楼主。
*****************************************************
||是这样运算的:从第一个开始,遇到有意义的返回,否则返回最后一个表达式(注意不一定是Boolean值);

&&是这样运算的:从第一个开始,遇到无意义的返回,否则返回最后一个表达式(注意同上);

!是这样运算的:对表达式的值取非(注意不是对表达式)。
*****************************************************
请问在java中这些运算符号也是这样操作的吗??  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2006-10-31 10:22 | 马嘉楠
@xinheqishi

*************************
请问在java中这些运算符号也是这样操作的吗??
*************************
提示如下:
The operator && is undefined for the argument type(s) Boolean, boolean.

如果把ob1进行一下转换就可以了,ob1.booleanValue(),但是此时该表达式已经是原始Boolean值false,所以结果为false.同时需要把ob2,ob3的类型改为boolean。
如果把true改为Boolean.valueOf(true),依然提示错误:
The operator && is undefined for the argument type(s) Boolean, Boolean.


代码如下:
Boolean ob1 = new Boolean(true);
boolean ob2 = ( ob1.booleanValue() && true );
boolean ob3 = ( true && ob1.booleanValue() );
System.out.println("ob2 = " + ob2 + " ob3 = " + ob3);
输出结果:
ob2 = true ob3 = true


当然,如果是操作符“&&”,遇到值为false的表达式就不再往下继续计算,直接返回结果false.如果是操作符“||”,遇到值为true的表达式就不再继续往下计算,直接返回结果true。 这个我们都知道,这种计算叫什么名字我突然想不起来了,呵呵
  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2006-10-31 21:02 | Larry.Zhao
其实就是这样的,如果是对象的话,javascript是用对象存在与否来做条件判断的,就是如果你给了一个没有初始化的对象:if(a),那么就会被视为非真,这个在程序语言中是这样表示的: if(a == null),但是在js里面可以表示为if(a)  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2006-10-31 21:29 | Flyingis
@马嘉楠
var obj = new Boolean(false);
if(obj) {
alert("a");
}
else {
alert("b");
}
这段代码返回的结果正如jeffjie所说,if判断的是对象是否存在,而不是对象的值。

"这种计算叫什么名字我突然想不起来了"
这是布尔运算。
需要注意的是,在Java或C#中&&和&、||和|计算方式是有差别的,一种是两侧均进行计算,一种是满足判断条件则立即返回,布尔表达式的运算方向是从右到左。

JavaScript这种语言除具有自身语法特点外,还受到浏览器兼容性、版本的影响,不同的浏览器及相同浏览器的不同版本对于JavaScript版本的支持是不同的,深究其语法有时会让人很费解。  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2006-10-31 22:01 | 马嘉楠
@Flyingis

确实让人费解
不过现在至少明白了一些JavaScript中的对象

谢拉

  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2012-08-09 10:45 | mrsy
var resX = new Boolean(null);
document.writeln(resX); //true
document.writeln(resX.toString());//false
谁能给我解释一下这个是什么原因  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?[未登录]
2013-12-19 13:51 | hewei
typeof true 'boolean'
type of new Boolean(false) 'object'
object 总为真   回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2015-10-31 10:43 | ezqrq
@jeffjie
对,所有的布尔对象要引用都需用(==true)判断;如果要输出值应该这样
var a;
var ob1 = new Boolean(false);
if (ob1==true)
a==true;
else
a==false;
然后用a代替ob1;
  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2015-10-31 11:02 | ezqrq
除此之外,容易混淆的还有数组与Array对象;数与Number对象;字符串和String对象;事件与Event对象  回复  更多评论
  
# re: JavaScript中的Boolean,你了解多少?
2015-10-31 11:52 | 伊泽godv
var s = "Test", S=new String("Test");
console.log(s == S);//true
console.log(s === S);//false  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: