关于javascript的undefined和null的一些思考

来源:互联网 发布:台湾人用淘宝吗 编辑:程序博客网 时间:2024/06/05 21:57

在javascript中,调用函数时,会开启一个上下文,在上下文初始化的时候,会按照顺序执行三个步骤:

1、函数参数:按照参数的顺序传入参数,如果没有传入的参数会被定义为undefined;

2、函数声明:如果发生命名冲突(主要是与参数命名冲突),会覆盖;

3、变量声明:初始化变量的值为undefined,如果发生命名冲突,会忽略。

function func(a,b) {        console.log(a);/*变量a为传入的值,10*/        var a;/*变量a声明,在函数上下文初始化的时候,变量声明冲突时会忽略,否则会初始化为undefined*/        console.log(a);        console.log(b);        var b = 10;        console.log(b);    }    func(1,2);    var b = {};console.log('');    console.log('b',b);/*Object {}*/    console.log('b == null',b == null);/*false*/    console.log('undefined == null',undefined == null);/*true*/    console.log('');    console.log('b.a',b.a);/*undefined*/    console.log('');    console.log('typeof b.a',typeof b.a);/*undefined*/    console.log("'a' in b'",'a' in b);/*false*/    console.log('b.a == undefined',b.a == undefined);/*true*/    console.log('b.a == null',b.a == null);/*true*/    console.log('b.a === undefined',b.a === undefined);/*true*/    console.log('b.a === null',b.a === null);/*true*/    b.a = null;console.log('');    console.log('typeof b.a',typeof b.a);/*object*/    console.log("'a' in b",'a' in b);/*true*/    console.log('b.a == undefine',b.a == undefined);/*true*/    console.log('b.a == null',b.a == null);/*true*/    console.log('b.a === undefined',b.a === undefined);/*true*/    console.log('b.a === null',b.a === null);/*true*/    console.log('');    console.log('x',x);/*undefined:变量声明会被前置,而且赋值为undefined*/    console.log('x == undefined',x == undefined);/*true*/    console.log("'x' in window",'x' in window);/*true,变量声明会被前置,函数外声明的变量会被视为全局变量,全局变量会保存在全局上下文中,全局上下文指向window对象,所以window对象中存在x属性*/    var x = 10;console.log('');    console.log('x',x);/*10*/    console.log('window.k == null',window.k == null);/*true*/    console.log('window.k == undefined',window.k == undefined);/*true*/    console.log('window.k == k',window.k == k);/*Uncaught ReferenceError: k is not defined:后面这个k报错*/
执行结果:


当一个对象的属性为undefined时,有可能是这个对象的属性根本不存在(判断对象属性是否存在可以通过'x' in obj判断),有可能是这个对象属性的值为undefined,有可能是这个对象的属性为null,要区别是undefined还是null需要使用严格等于或者严格不等于。

目前令我疑惑的是,理论上全局变量都会保存在全局上下文中,而全局上下文是window,当一个全局变量咩有定义时(代码中的k),调用window.k为undefined,

调用window.k == k会直接报错后面的k没有定义,但是如果声明了全局变量k(需要赋值,可以是null或者undefined),window.k == k就是true,这令我十分费解,希望有知道的同学麻烦告知一下,我会在知道原因之后第一时间更新。

原创粉丝点击