【问题标题】:Determining string length in Node JS when string may be null当字符串可能为空时确定 Node JS 中的字符串长度
【发布时间】:2012-05-25 00:43:36
【问题描述】:

我正在努力学习Node并拥有功能:

this.logMeIn = function(username,stream) {
  if (username === null || username.length() < 1) {
    stream.write("Invalid username, please try again:\n\r");
    return false;
  } else {
  ....etc

我正在通过它

if (!client.loggedIn) {
  if (client.logMeIn(String(data.match(/\S+/)),stream)) {

我已经尝试了 == 和 ===,但我仍然收到错误,因为用户名没有检测到它为空,并且 username.length() 失败:

if (username === null || username.length() < 1) {
                                  ^
TypeError: Property 'length' of object null is not a function

我确定 Node 不会评估 || 的第二部分。在第一部分为真时的 if 语句中 - 但我不明白为什么当用户名是空对象时 if 语句的第一部分评估为假。有人可以帮我理解我做错了什么吗?

【问题讨论】:

  • 删除这条评论并添加到我的回答下,我们会在我的回答下继续聊天。

标签: javascript string node.js if-statement null


【解决方案1】:

试试

if( username === null || username.toString().length

我使用了 if( username === null || username.length

【讨论】:

    【解决方案2】:

    您将String(data.match(/\S+/)) 作为username 参数传递,因此当data.match(/\S+/)null 时,您将得到"null" 而不是null for null,如下所示:

    String(null) === "null"
    

    所以你需要改变你的条件:

    if( username === null || username === "null" || username.length < 1 )
    

    【讨论】:

    • 如果他得到字符串"null",那么他就不会在"null".length" 上得到错误——它会是4。
    • @jmar777 在这种情况下不会发生,因为在这种情况下username === "null"true,而if 的主体将被执行。
    • 对,但现有代码与null 比较,而不是"null" - 所以调用.length 时的错误是分开的。不过,这很好地抓住了时髦的 String(data.match()) 东西。
    • @jmar777 所以 OP 的问题是与null 比较,而不是'null'。我也更新了我的状况。
    • 我认为情况并非如此。 OP 的原始错误是TypeError: Property 'length' of object null is not a function。如果此时username 实际上是一个包含"null" 的字符串,则不会发生该错误,因为username.length 将返回4,而不是抛出错误。
    【解决方案3】:

    如果您需要非空字符串,您可以进行简单的“真实”检查,适用于 nullundefined'' 等:

    if (username) { ... }
    

    使用这种方法,您甚至不需要.length 检查。另外,length 是一个属性,而不是一个方法。


    编辑:你有一些时髦。我认为您需要从传递用户名的方式开始 - 我不认为您的 String(data.match(/\S+/)) 逻辑的行为方式与您期望的一样(感谢 @Engineer 发现这一点)。

    您的匹配表达式将返回一种或两种类型的值:nullArray。在它为空的情况下,正如@Engineer 指出的那样,您最终将"null" 作为字符串传递,结果应该稍后通过您的用户名检查。您应该考虑将其修改为:

    if (!client.loggedIn) {
        var matches = data.match(/\S+/);
        if (client.logMeIn(matches ? matches[0] : '',stream)) {
    

    关于.length 在所有情况下都等于1 - 老实说,这没有多大意义。我建议添加很多 console.log() 语句来尝试找出发生了什么。

    【讨论】:

    • 这解决了评估的第一部分的问题(谢谢),但现在 username.length 始终评估为 1,无论数据输入多长时间。有什么想法吗?
    • Hrm,实际上 - 这也不起作用......如果(用户名)正在评估是否为空......
    • 我最终希望长度检查更多......它是更复杂逻辑的占位符。
    • 第一次运行时发生的事情是我在想 .match 正在返回一个字符串 - 它正在返回一个数组,正如你提到的 - 它正在评估长度 [1] (因为我正在输入一个名字)。应用了进一步的逻辑,我迷失在所有的变化中。既然我知道 String(null) 给你“null”并且 data.match() 给你一个数组,那么一切都已经整理好了。谢谢。
    【解决方案4】:

    length 是一个属性,而不是一个函数。试试username.length

    【讨论】:

    • 要么username 不是字符串,要么你做错了什么!
    • 我错了 - 长度正确评估为传递字符串的长度。但是,这并没有解决我如何知道我是否传递了一个空对象的原始问题? null.length 不计算?!
    猜你喜欢
    • 2016-04-15
    • 2012-09-14
    • 2018-10-09
    • 2018-07-22
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    相关资源
    最近更新 更多