当string可能为空时,确定节点JS中的string长度
我正在尝试学习Node,并具有以下function:
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语句的第一部分计算为false时,用户名是一个空对象。 有人能帮我理解我做错了什么吗?
你传递String(data.match(/\S+/))
作为username
参数,所以当data.match(/\S+/)
为null
,你会得到"null"
String(null) === "null"
所以你需要改变你的状况:
if( username === null || username === "null" || username.length < 1 )
length
是一个属性,而不是一个函数。 试试username.length
如果你需要一个非空的string,你可以做一个简单的“truthy”检查,将工作为null
, undefined
,等等:
if (username) { ... }
用这种方法,你甚至不需要.length
检查。 另外, length
是一个属性,而不是一个方法。
编辑:你有一些funkiness继续。 我认为你需要从如何传递用户名开始 – 我不认为你的String(data.match(/\S+/))
逻辑的行为是你所期望的@Engineer发现这一点)。
您的匹配expression式将返回一个或两个types的值: null
或一个Array
。 在@Engineer指出的情况下它是空的,最终会以"null"
作为string传递,这将最终通过您的用户名检查。 你应该考虑修改这个:
if (!client.loggedIn) { var matches = data.match(/\S+/); if (client.logMeIn(matches ? matches[0] : '',stream)) {
关于.length
在所有情况下都等于1
,这并不是真的很有意义。 我会build议添加大量的console.log()
语句来试图弄清楚发生了什么事情。
尝试
if(username === null || username.toString()。length <1)
我用if(username === null || username.length <1),并且在长度检查时失败。