首页 新闻 搜索 专区 学院

js 判断未定义

0
悬赏园豆:10 [已解决问题] 解决于 2015-06-19 11:10
  $(function () {
            alert(typeof(para) == "undefined"); // 不报错
            alert(isUndefined(para)); // 会报错

        });

        function isUndefined(para) {
            return typeof(para) == "undefined";
        }

para 未定义;

上面的代码为什么一个会报错,一个不报错

xmj112288的主页 xmj112288 | 菜鸟二级 | 园豆:324
提问于:2015-06-17 17:14
< >
分享
最佳答案
0

(3)undefined

undefined返回undefined。

typeof undefined // "undefined"

利用这一点,typeof可以用来检查一个没有声明的变量,而不报错。

羽商宫 | 老鸟四级 |园豆:2493 | 2015-06-17 19:24

function isUndefined(para) {
            return typeof(para) == "undefined";
        };alert(isUndefined(undefined));

函数的参数要么省略,被省略的参数的值就变为undefined。

没有办法只省略靠前的参数,而保留靠后的参数。如果一定要省略靠前的参数,只有显式传入undefined。

function f(a,b){ return a; } f(,1) // error f(undefined,1) // undefined
羽商宫 | 园豆:2493 (老鸟四级) | 2015-06-17 19:28

@羽商宫: 是不是可以这么理解,

isUndefined(para) 这个函数传递的不是para这个对象,而是para的值,

但获取para的值时,因为para未定义所以报错了

xmj112288 | 园豆:324 (菜鸟二级) | 2015-06-18 09:57

@2727551894: JavaScript的函数参数传递方式是传值传递(passes by value),这意味着,在函数体内修改参数值,不会影响到函数外部。需要十分注意的是,虽然参数本身是传值传递,但是对于复合类型的变量来说,属性值是传址传递(pass by reference),也就是说,属性值是通过地址读取的。所以在函数体内修改复合类型变量的属性值,会影响到函数外部。

羽商宫 | 园豆:2493 (老鸟四级) | 2015-06-18 09:59
其他回答(6)
1

    很明显的  传的参数没有定义啊

醉心 | 园豆:99 (初学一级) | 2015-06-17 17:29
0

typeof(para) == "undefined"  中para 未定义 所以 typeof(para)=undefined 所以不会报错,isUndefined(para)未定义para的话 貌似根本进不了方法中 function 的参数不能为 undefined ,你可以加一个默认值试试

葛朗台 | 园豆:202 (菜鸟二级) | 2015-06-17 17:51
0

1楼正解,

alert(typeof(para) == "undefined"); // 这个是类型测试,typeof是可以测试未定义的变量的。

alert(isUndefined(para)); // 这个是方法调用,人家方法要求有个参数,但你传的这个para未定义,未定就不会有值(连默认值都么有),没有值怎么充当实参,方法自然就不允许被调用了,于是乎报个错吧!

3楼讲了一点undefined的使用挺好

收获园豆:10
i迷倪 | 园豆:204 (菜鸟二级) | 2015-06-17 20:36
0

这个是由于typeof的特殊性造成的,typeof测试变量不关心是否定义。然而在函数调用中,是在使用一个未定义的值,导致报错。

幻天芒 | 园豆:36594 (高人七级) | 2015-06-18 10:03
0

因为第一个para被包含在了typeof里,

第二个para却放在了isUndefined的参数里。

typeof可以接受 undefined 类型,但是自定义的isUndefined方法不能接受

傲慢与偏剑 | 园豆:381 (菜鸟二级) | 2015-06-18 16:28
0

直接使用if(para){}

.NET快速开发框架 | 园豆:914 (小虾三级) | 2015-06-19 10:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册