我在一个对象的属性中有一些文本。我正在测试该对象的属性中是否有要显示的文本;如果没有,那么我将显示“-”而不仅仅是一个空白。看起来这两者之间没有区别:
if (MyObject.SomeText && MyObject.SomeText.length) { ... }
if (MyObject.SomeText && MyObject.SomeText.length > 0) { ... }
字符串
是否有任何边缘情况下,一种语法会比另一种更可取?
我在一个对象的属性中有一些文本。我正在测试该对象的属性中是否有要显示的文本;如果没有,那么我将显示“-”而不仅仅是一个空白。看起来这两者之间没有区别:
if (MyObject.SomeText && MyObject.SomeText.length) { ... }
if (MyObject.SomeText && MyObject.SomeText.length > 0) { ... }
字符串
是否有任何边缘情况下,一种语法会比另一种更可取?
6条答案
按热度按时间ds97pgxw1#
是否有任何边缘情况下,一种语法会比另一种更可取?
仅限
MyObject.SomeText
或MyObject.SomeText.length
不是您期望的边缘情况-例如:字符串
axr492tv2#
它们给出了给予相同的结果。顺便说一句,如果它是“文本”,那么
if (MyObject.SomeText)
就足够了7cjasjjr3#
不,它们是等价的,如果长度等于0,那么它的值为
false
。(This可能是因为JS不是强类型的,在强类型语言中,长度不能被转换为布尔值)。
flseospp4#
是一样的:
字符串
MyObject.SomeText.length
!= 0,则返回true
MyObject.SomeText.length
== 0,则返回false
和
型
MyObject.SomeText.length
> 0,则返回true
MyObject.SomeText.length
<= 0,则返回false
但
MyObject.SomeText.length
只能是0
或正整数,所以MyObject.SomeText.length
== 0,Boolean(MyObject.SomeText.length)
返回**false
**,因为MyObject.SomeText.length
== 0Boolean(MyObject.SomeText.length>0)
返回**false
**,因为MyObject.SomeText.length
<=0MyObject.SomeText.length
> 0,Boolean(MyObject.SomeText.length)
返回**true
**,因为MyObject.SomeText.length
!= 0Boolean(MyObject.SomeText.length>0)
返回**true
**,因为MyObject.SomeText.length
> 0t30tvxxf5#
在JavaScript中,一个数字只有当它是0时才被认为是“falsey”。任何其他值都是“truthy”。因此,
number != 0
(比较,而不是同一性)和!number
语句是完全等价的。你的两个陈述唯一不同的地方是
length
不是正数。7gs2gvoe6#
我将从一个关心阅读代码和人类思想的人的Angular 来回答。
是的,它们实际上是一样的,所以归结为风格。
MyObject.SomeText.length > 0
显式地询问“此字符串中是否有字符”?MyObject.SomeText.length
询问“这个字符串是否有长度属性”?它依赖于额外的知识,即JavaScript隐式地执行与前一个相同的检查。我更喜欢don't make me think的概念。
在未来,没有人,即使是初级开发人员,在浏览
MyObject.SomeText.length > 0
时也会问,if检查是做什么的?是否有任何边缘情况?