【问题标题】:variable may not have been initialized when test测试时变量可能尚未初始化
【发布时间】:2015-07-01 03:48:37
【问题描述】:

我试图理解为什么我在测试时得到“变量可能尚未初始化”(变量 === “某些文本”),但在使用时却没有得到(typeof passwordHashOrg !== 'undefined')

工作代码:

checkPass('share', function (error, response) {
    "use strict";
    if (error) {
        console.log(error);
    } else {
        console.log(response);
    }
});

function checkPass(username, callback) {
    "use strict";

    // Require
    var fs = require('fs');

    // Static Parameters
    var usernameInput = username;

    // Open shadow file
    fs.readFile('/etc/shadow', function (error, file) {
        if (error) {
            return callback(error); // file does not exit
        }
        // file is a buffer, convert to string and then to array
        var shadowArray = file.toString().split('\n');

        var passwordHashOrg;
        shadowArray.forEach(function (line) {
            var shadowLineArray = line.split(":");
            var usernameOrg = shadowLineArray[0];
            if (usernameOrg === usernameInput) {
                passwordHashOrg = shadowLineArray[1];
            }
        });
        if (typeof passwordHashOrg !== 'undefined') {
            callback(null, 'userExist');
        } else {
            callback(null, 'unknownUser');
        }

    });
}

我得到“变量可能尚未初始化”的代码:

checkPass('share', function (error, response) {
    "use strict";
    if (error) {
        console.log(error);
    } else {
        console.log(response);
    }
});

function checkPass(username, callback) {
    "use strict";

    // Require
    var fs = require('fs');

    // Static Parameters
    var usernameInput = username;

    // Open shadow file
    fs.readFile('/etc/shadow', function (error, file) {
        if (error) {
            return callback(error); // file does not exit
        }
        // file is a buffer, convert to string and then to array
        var shadowArray = file.toString().split('\n');

        var passwordHashOrg;
        shadowArray.forEach(function (line) {
            var shadowLineArray = line.split(":");
            var usernameOrg = shadowLineArray[0];
            if (usernameOrg === usernameInput) {
                passwordHashOrg = shadowLineArray[1];
            }
        });
        if (passwordHashOrg === 'some text') {
            callback(null, 'userExist');
        } else {
            callback(null, 'unknownUser');
        }

    });
}

这两个代码唯一不同的是:

if (typeof passwordHashOrg !== 'undefined') {
vs
if (passwordHashOrg === "some text") {

【问题讨论】:

  • 在我看来,您不必初始化变量即可比较其类型。也许未初始化变量的类型已经是“未定义”?
  • 这是 jslint 还是 jshint 警告?请适当标记您的问题。
  • 问题是:我正在尝试在 linux 影子文件中查找特定用户,如果该用户存在,请执行某些操作。问题是:当我尝试测试变量“passwordHashOrg”是否具有某些值但如果我测试定义它成功时,为什么会得到“unknownUser”。
  • @AdrianGherasim:可能是因为影子文件不太可能包含“some text”?

标签: javascript node.js


【解决方案1】:

警告的意思就是它所说的 - 在比较时变量可能没有用值初始化。由于这是预期的行为,基本上就是您想要测试的行为,因此可以安全地忽略该警告。或者,使用

var passwordHashOrg = null; // or
var passwordHashOrg = undefined; // or whatever default value you want

那么为什么在使用typeof 时没有收到警告?因为这不一定要评估变量的值,并且 jshlint 可能会认为它对非初始化变量是合理的(它甚至适用于未声明的变量)。如果您将该值与undefined 进行比较,您可能会收到相同的警告。

【讨论】:

  • 如果我 (passwordHashOrg === undefined) 我没有收到任何警告但代码不起作用。
  • 那么它可能也取决于比较值的类型 - 它警告您未初始化的变量将无法通过 === 对字符串文字的类型检查。
  • 是的,但为什么呢?我真的不明白,
  • if 测试都在 forEach 之后,为什么两者都不成功?
  • 重点是:你不应该在意。你似乎知道这个变量要么仍然是undefined,要么包含一个字符串,你应该测试你想要做什么。
猜你喜欢
  • 2012-03-25
  • 2015-07-04
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多