JavaScript checking for null vs. undefined

JS中undefined表示变量没有定义或从来没有赋值,而null是空对象,是有值的。
例如:

var a;
alert(typeof a);
//"undefined"

a = null;
alert(typeof null);
//"object"

JS中==比较为弱类型比较,JS会自动进行类型转换,然后返回值的比较结果。
而===为强类型比较,即必须类型与值同时相同,才会相等。
例如:

alert(0 == "0");
//true

alert(0==="0");
//false

alert(undefined == null);
//true

alert(undefined === null);
//false

判断变量为null:

if (a === null)
// or
if (a == null)

第一种方法,当a为undefined时返回false,
第二种方法,当a为undefined时返回true。

判断变量为undefined:

if (typeof a === "undefined")
// or
if (a === undefined)
// or
if (a == undefined)

第一、二种方法,当a为null时返回false,
第三种方法,当a为null时返回true。

还有一种使用falsey进行检查的方法:

if (!a) {
    // `a` is falsey, which includes `undefined` and `null`
    // (and `""`, and `0`, and `false`)
}

大部分翻译自stackoverflow:
JavaScript checking for null vs. undefined and difference between == and ===

JS中null与undefined

1.undefined是js的一个原始值,不是一个对象,表示变量没有初始化,
null也是js的一个原始值,不是一个对象,他表示变量为空,但由于语言设计的缺陷,导致typeof(null)为object,而正确的应该为null

alert(typeof(null));      // object
alert(typeof(undefined)); // undefined

alert(null !== undefined); //true
alert(null == undefined);  //true

2.object == null 与 !object 是不同的,因为!object相当于!Boolean(object)

alert(Boolean(null)); //false
alert(Boolean(0));    //false
alert(Boolean(""));   //false
alert(Boolean({}));   //true
alert(Boolean([]));   //true

div被activex控件遮住的处理方法

不知什么时候,自己成了写JS的人了

说实话,用过很多种编程语言,但至今发现,最佩服的莫过于JS程序员,调试那叫个烦人啊,写出JQuery的那些人,要么有更好的调试工具,要么就是真正的牛人吧。
JS的调试工具,IE下,直接用IE的调试工具(IE7及以上)或者是Companion.JS
在FF下,自然是FireBug老兄了

现在,主界面上已经集成了JQuery,JQueryUI,JX,SuperFish
还记得当初把JX放到JQuery中,以及修改JX.Tree增加叶子节点的ID等属性,加起来痛苦了有一周左右,终于把JX删的删,改的改,满足了需求。

这两天呢,又遇到了SuperFish的菜单,被一个第三方ActiveX控件遮住的问题,让大家痛苦了许久。
网上找呢,也全是关于flash的东西,只要设个参数就好了。

没办法,只好去修改SuperFish的代码咯。
具体的思路是:

在菜单弹出后,弹出菜单的下方,生成一个同样大小的iframe,

var mydoc=window.frames["FrameId"].document;
var objiframe = mydoc.createElement("iframe");
objiframe.id ="IFuLeU";
objiframe.style.visibility = 'hidden';
objiframe.style.top = 0;
objiframe.style.left = 0;
objiframe.style.width = 0;
objiframe.style.height = 0;
mydoc.body.appendChild(objiframe);

objiframe.style.position = "absolute";
objiframe.style.top = 0;
objiframe.style.left = this.offset().left-1;
objiframe.style.width = this.width();
objiframe.style.height = this.height()-2;
objiframe.style.visibility = 'visible';

在菜单隐藏时,将iframe销毁,

var mydoc=window.frames["FrameId"].document;
var objiframe = mydoc.getElementById("IFuLeU");
mydoc.body.removeChild(objiframe);

但这样呢,还会有个小问题
就是在菜单弹出后,会有个较为明显的先被ActiveX遮住,然后菜单又将Activex遮住的过程。