JavaScript 无效检查

我发现了以下代码:

function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}

我对 JavaScript 有些陌生,但是从我在这里读到的其他问题来看,我的印象是这段代码没有多大意义。


这个答案特别指出

如果在 typeof以外的任何上下文中访问未定义的变量,就会得到一个错误。

更新: 上面的(引用)答案可能有误导性,应该说 “一个未声明的变量”,而不是 “一个未定义的变量”

正如我所发现的,在 瑞安[俄语]新闻中心的答案中,即使没有向函数提供参数,它的参数变量也总是声明的。这个事实也证明下面列表中的第一项是错误的。


据我所知,可能会出现以下情况:

  • 调用该函数时没有参数,因此使 data成为未定义的变量,并在 data != null上引发错误。

  • 函数是用 null(或 undefined)作为参数调用的,在这种情况下,data != null已经保护了内部代码,使得 && data !== undefined无用。

  • 该函数是用非空参数调用的,在这种情况下,它将传递两个 data != null 还有 data !== undefined

问: 我的理解正确吗?


我在 Firefox 的控制台中尝试了以下方法:

--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true

我想不出 data !== undefined 之后 data != null有什么用。

515277 次浏览

“未定义变量”与值 undefined不同。

一个未定义的变量:

var a;
alert(b); // ReferenceError: b is not defined

值为 undefined的变量:

var a;
alert(a); // Alerts “undefined”

当一个函数接受一个参数时,即使它的值是 undefined,也总是声明该参数,因此不会有任何错误。但是,关于 != null后面跟着 !== undefined是无用的,你是对的。

typeof foo === "undefined"不同于 foo === undefined,不要混淆它们。typeof foo === "undefined"是你真正需要的。此外,使用 !==代替 !=

所以语句可以写成

function (data) {
if (typeof data !== "undefined" && data !== null) {
// some code here
}
}

编辑:

不能对未声明的变量使用 foo === undefined

var t1;


if(typeof t1 === "undefined")
{
alert("cp1");
}


if(t1 === undefined)
{
alert("cp2");
}


if(typeof t2 === "undefined")
{
alert("cp3");
}


if(t2 === undefined) // fails as t2 is never declared
{
alert("cp4");
}

在 JavaScript 中,null是一个特殊的单例对象,它有助于发出“无值”信号。您可以通过比较来测试它,并且,像通常在 JavaScript 中一样,使用 ===操作符来避免令人困惑的类型强制是一个很好的实践:

var a = null;
alert(a === null); // true

正如@rynah 所提到的,在 JavaScript 中“未定义”有点令人困惑。然而,测试 typeof(x)是否是字符串“未定义”总是安全的,即使“ x”不是声明的变量:

alert(typeof(x) === 'undefined'); // true

此外,如果变量没有初始化,它们可能具有“未定义的值”:

var y;
alert(typeof(y) === 'undefined'); // true

把它们放在一起,你的支票应该是这样的:

if ((typeof(data) !== 'undefined') && (data !== null)) {
// ...

但是,由于变量“ data”总是定义的,因为它是一个形式化的函数参数,所以不需要使用“ typeof”运算符,您可以安全地直接与“未定义的值”进行比较。

function(data) {
if ((data !== undefined) && (data !== null)) {
// ...

这段代码相当于说“如果函数是用一个已定义且不为 null 的参数调用的...”

做测试的简单方法是:

function (data) {
if (data) { // check if null, undefined, empty ...
// some code here
}
}

问: 调用该函数时没有参数,因此使数据成为一个未定义的变量,并在数据上产生一个错误!= 无效。

A: Yes,data将被设置为未定义。请参阅规范的 第10.5节声明绑定实例化。但是访问未定义的值不会引发错误。您可能会将其与访问严格模式下的未声明变量混淆,因为这确实会引发错误。

Q: 这个函数是用 null (或未定义的)作为参数调用的,在这种情况下是数据!= null 已经保护了内部代码,渲染 & & 数据!= = 未定义的无用。

Q: 这个函数是用非空参数调用的,在这种情况下,它会轻松地传递两个数据!= 空和数据!= = 未定义。

答: 正确,请注意以下测试是等效的:

data != null
data != undefined
data !== null && data !== undefined

请参阅规范中的 第11.9.3节抽象等式比较算法第11.9.6节严格等式比较算法

var a;
alert(a); //Value is undefined


var b = "Volvo";
alert(b); //Value is Volvo


var c = null;
alert(c); //Value is null

我认为,一般来说,测试变量的值不是一个好主意。因为测试作为你可以考虑写一个禁止值的黑名单。但是如果你忘记列出所有被禁止的价值观呢?有些人,甚至是你,可以通过传递一个意想不到的值来破解你的代码。因此,更合适的方法是类似于白名单的方法——仅对预期值测试变量,而不是出乎意料的测试变量。例如,如果期望数据值是一个字符串,而不是这个:

function (data) {
if (data != null && data !== undefined) {
// some code here
// but what if data === false?
// or data === '' - empty string?
}
}

做这样的事:

function (data) {
if (typeof data === 'string' && data.length) {
// consume string here, it is here for sure
// cleaner, it is obvious what type you expect
// safer, less error prone due to implicit coercion
}
}

在您的情况下,使用 data==null(这是真实的,只有空和未定义的第二张图片的行/列空未定义的焦点)

function test(data) {
if (data != null) {
console.log('Data: ', data);
}
}


test();          // the data=undefined
test(null);      // the data=null
test(undefined); // the data=undefined


test(0);
test(false);
test('something');

这里你有所有(Src) :

如果

enter image description here

= = (其负 !=)

enter image description here

= = (其否定 !==)

enter image description here