逻辑AND(&&)运算符

2009-03-03 15:49:02

先看下面这段代码,注释有运行结果。

var t = true;
var f = false;
var i = 1;
var s = "hello";
var a = [1,10,100];
alert("t&&i: " + (t && i)); //1
alert("f&&i: " + (f && i)); //false

alert("i&&t: " + (i && t)); //true
alert("i&&f: " + (i && f)); //false

alert("i&&s: " + (i && s)); //"hello"
alert("i&&a: " + (i && a)); //1,10,100

alert("s&&i: " + (s && i)); //1
alert("a&&i: " + (a && i)); //1

再看来自w3school的一段文字:

如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值:

  • 如果一个运算数是对象,另一个是 Boolean 值,返回该对象。
  • 如果两个运算数都是对象,返回第二个对象。
  • 如果某个运算数是 null,返回 null。
  • 如果某个运算数是 NaN,返回 NaN。
  • 如果某个运算数是 undefined,发生错误。

第一条:如果一个运算数是对象,另一个是 Boolean 值,返回该对象。如果这种说法成立,那么先前测试中的以下代码都应输出i。

alert("t&&i: " + (t && i)); //1
alert("f&&i: " + (f && i)); //false

alert("i&&t: " + (i && t)); //true
alert("i&&f: " + (i && f)); //false

但实际并非如此。再看规则第二条:如果两个运算数都是对象,返回第二个对象。对先前的测试代码稍作修改,把0赋值给i:

var t = true;
var f = false;
var i = 0;
var s = "hello";
var a = [1,10,100];
alert("t&&i: " + (t && i)); //0
alert("f&&i: " + (f && i)); //false

alert("i&&t: " + (i && t)); //0
alert("i&&f: " + (i && f)); //0

alert("i&&s: " + (i && s)); //0
alert("i&&a: " + (i && a)); //0

alert("s&&i: " + (s && i)); //0
alert("a&&i: " + (a && i)); //0

i与另外一个不是boolean类型的运算数的AND运算都返回了i,并不是规则中所说的第二个对象。

再看如下代码,将字符串s赋值成空字符串,将数组a也赋值为空数组:

var i = 0;
var s = "";
var a = [];

alert("i&&s: " + (i && s)); //0
alert("i&&a: " + (i && a)); //0

alert("s&&i: " + (s && i)); //""
alert("a&&i: " + (a && i)); //0

于是,我的结论是:AND(&&) 运算不论运算数的类型是什么,如果运算结果为true,那么返回第二个运算数;如果运算结果为false,那么返回第一个布尔值等于(==)false的运算数。似乎这个结论是正确的,但是仔细看看最后一条测试语句的结果,并不遵循所得出的结论。

其实这里又涉及到另外一个typeof为object的值的布尔运算问题,如果object类型的值为空那么等于运算符(==)会视其为false,但是其他运算符则会视其为true。所以也才有了下面的现象:

alert([]==false); //true
if([]) alert("ok"); //ok

所以AND(&&)运算符测试中的最后一句a&&i其结果为false,但是a为true,所以有结果0。

如此看来,我们得出的结论也是完全正确的。

骚乱的季节

2009-02-25 11:05:57

每日,我除了感受到强烈的春潮涌动外,还在上个星期的某个上午目睹了一场火灾。一时间,同学们对火灾表现出了极大关注,奔走相告,异常躁动~···

http://news.163.com/09/0220/10/52JDDMVQ0001124J.html

除此之外,这几天还有一件事情也让同学们极为躁动~这个PR10的中文网站这两天基本处于瘫痪状态足以说明本次躁动事件的强度和广度,也说不好这是一次有组织有预谋的的×××活动。我们向来是一个易于接受新鲜事物,学习先进文化和思想的民族,圣人在两千多年前就教育我们要“敏而好学,不耻下问”,于是乎,我们现在向小弟朝鲜学习~···不负圣人厚望!

我小时候的语文课本第一课《春天》写道:“冰雪融化,种子发芽,果树开花 。我们来到小河边,来到田野里,来到山冈上。我们找到了春天。”所以,在这样一个美好的季节请大家少安毋躁,小心被封IP,ID,IQ~···

情人节前一段猥琐的聊天

2009-02-13 17:37:02

RZ:明天搞啥活动去啊?

ME:你不搞学习了?

RZ:明天啊?

ME:明天怎么了?

RZ:在广州逛逛,看看行情

ME:什么行情?

ME:老子有病,情人节我和你一起去逛逛~···

此处省略大量DISU(我怕被低俗了)内容~···敬请各位看官发挥想象~···

(RZ花了几十万在东瀛国买了个本,连MM那也不去了,来纠缠我,鄙视之~···)

谢谢~···

精通CSS?

2009-02-09 17:37:32

经常看到些招聘都要求精通CSS,然后后面也会有一大群人信心十足地回复“精通CSS”“手写代码”“通过W3C验证”“兼容IE5678,FF,opera,safari…”,姑且对你对自身认识的准确度不谈,你所罗列的这一大堆东西你真的觉得是有意义的吗?

难道CSS的最高境界就是熟知各浏览器的对HTML/XHTML,CSS解析的差异性,然后熟记一大堆hack技巧?表现上差异性,hack技巧可以说都是可以量化的,是可以通过付出时间成本来获取的。你用了两年的实际工作时间,通过你的辛勤实践总结掌握了很多不同浏览器表现上的差异性,也通过各种手段解决了这些差异性,做到了完美的兼容,你觉得你很有经验,你精通了CSS,你很牛叉了。可是事实上,你引以为傲的这些东西,一个勤奋的学生可能通过书籍、搜索引擎两个月就搞定了。然后某天,浏览器市场在经过多年的厮杀和开发者的口诛笔伐后实现了天下一统,你所有的付出、你所有的经验、你所有的精通就会在一夜之间迅速贬值!这一天是完全可以预见的!

但并不是说研究浏览器对HTML/XHTML、CSS解析的差异性毫无意义,熟知这些东西对提高工作效率还是相当有帮助的。只是它的意义远没有到要把它当着神一样膜拜的地步,也绝对不应该成为你学习CSS的终极目标。

知识技术的研究要么是基础研究要么是应用研究的。显然,对于大多数开发人员而言都属于应用层面的研究,所要做的就是如何灵活运用已有的技术成果高效率的去完成工作。而具体到web前端开发,具体到页面制作人员,重心就应该是在如何去构建简洁、强壮、易扩充和高效的代码上面!而不是成天在无数个浏览器之间来回切换地去寻找表现差异性的规律,它们在很多时候就是没有规律的,还有很多时候是你庸人自扰,本来可以很简单的页面结构你却写的更复杂,兼容性问题自然就会更多,这就是自己给自己制造麻烦。浏览器自身的缺陷留给他们自己去解决,你的没日没夜的辛勤劳动在那帮开发浏览器的家伙眼里也就是自作多情罢了。

简洁、强壮、易扩充和高效的代码不但能提高页面效率的,为JS编程提供良好的接口,同时能够大大的提高开发效率和质量。但是这个却是很难从书上看来的,只能在实践中不断的总结积累,属于经验问题。在我刚接触CSS的时候,看了很多到底是该用id还是class的文章(相信很多人都看过~囧~),现在想来价值甚少,到底是用id还是class绝不单单是id只能唯一而class可以重复多次使用的问题,你还得为JS编程提供了好接口作更多考虑~···大型项目样式文件结构的安排,命名规则,页面结构往往也并不如想像中那样随意和简单,经验问题,仁者见仁,智者见智。

兼容性的研究,适可而止,不要走火入魔!好久没更新,随便扯两句~···

I am back

2009-02-01 15:38:15

我好像越来越自闭了,很多次我都会写几个字然后又会觉得太幼稚,然后就会猛按“Delete”~···

十天的春节假期结束了,基本是按计划来的。27中午放假后找同学先玩了一天,29人基本都走完了,所以我也闪了。29到初四和父母在一起过年。初四晚上到了珠海,我想象中的美丽的海滨城市和东莞的制造业小镇基本没什么两样,大失所望~···还看到了小平同志的题字——珠海经济特区好!好×××

今年CCTV的春晚我瞟都没瞟一眼~昨天中午从珠海回来后看了看本山大叔的小品,也让我很失望,比以往的小品至少降了一个档次。笑点太少,小沈阳的模仿我也听了不止一次了,每次都刀郎那个~···在长途汽车上看报纸说,山寨春晚惨败,所以我也不去看了~···

09年,我打算先学学做饭~···