【问题标题】:Comparison String to String比较字符串到字符串
【发布时间】:2021-08-05 13:36:51
【问题描述】:

我在下面有这 2 个例子 -

console.log("a" > "3") // 输出为真

console.log("hello" > "3") // 输出为真

根据MDNIf both values are strings, they are compared as strings, based on the values of the Unicode code points they contain

但随后他们在下一段中也写了以下内容,Strings are converted based on the values they contain, and are converted as NaN if they do not contain numeric values.

按照这个逻辑,不应该两个语句都是false,因为无论是什么运算符,“a”和“hello”都是字符串中的单词,它们没有数值,因此,它应该返回NaN,而NaN为假;因此,只要其中一个操作数是false,它就会输出false?

如果我需要坚持上面的前一条陈述,你能帮我看看这个逻辑吗?

谢谢。

【问题讨论】:

  • 我是JS新手,对细节超级细致,请不要对我评价太苛刻..

标签: javascript comparison-operators


【解决方案1】:

来自 MDN 文章的关键词是

如果两个值都是字符串,[…]。
否则 JavaScript 会尝试将非数字类型转换为数值

所以不,"a""3""hello" 都是字符串,在比较它们时,它们会作为字符串进行比较。不会发生任何转换。

【讨论】:

  • 那么这里的比较究竟是如何发生的呢?
  • 他们引用了 Unicode 代码点,但我如何在这里应用它?我在任何地方都找不到任何适当/可靠的文档
  • Unicode 中的基本字符与ASCII 相同
【解决方案2】:

您正在比较两个字符串(用引号引起来),而不是字符串与数字。这应该回答你的问题:

"a" > "3" //true
"a" > 3 //false

【讨论】:

  • 是的,我了解第二个前任。你在这里提供。我在问"a" > "3" 的比较究竟是如何发生的
  • 它比较字符串的unicode,一个字符一个字符,从第一个开始。 "a" 在 unicode 中是 61,而 "3" 是 33。61 > 33 所以它返回 true。
  • 你能把你引用的 unicode 文档发给我吗?
  • Tbh 我不确定我的第二条评论是否准确(只是用谷歌搜索了一个随机的 unicode 表,不是 100% 确定它是否完全使用该表)但在几乎所有标准中,字母字符都被分配了一个无论如何,代码都比数字字符高。例如你也可以试试 JS 内部函数 "a".charCodeAt(0) //97 vs "3".charCodeAt(0) //51。仍然是 97 > 51。
【解决方案3】:

正如你所写,

如果两个值都是字符串,则将它们作为字符串进行比较,基于 它们包含的 Unicode 代码点的值

因此,在这两个示例中,两个值都是字符串。如果把“3”改成3,结果是:

console.log("a" > 3)
// expected output: false

console.log("hello" > 3)
// expected output: false

那是因为,首先将其转换为 NaN,然后​​:

如果任一值为 NaN,则运算符返回 false。

【讨论】:

    【解决方案4】:

    文档:

    如果两个值都是字符串,则根据它们包含的 Unicode 代码点的值将它们作为字符串进行比较。

    否则 JavaScript 会尝试将非数字类型转换为数值:....

    阅读文档,我了解到,如果两个字符串都有数值(都不是 NaN),那么两者都被视为 Unicode 代码点。否则,如果 BOTH 都有数值,则它们会被转换。

    但无论如何,我对 js 初学者的建议:暂时不要太执着于该语言的工作方式,即使它可以将字符串与“大于”和“小于”进行比较,我认为不会(或不应该)存在您需要它的现实生活场景。

    另外,为了好玩,请查看我刚开始使用js时所做的this pen(我对比较和输入xD也很困惑):

    "" == null // this one is fun
    

    稍后,在进一步了解该语言后,您会明白为什么有些事情会像在 js 中那样工作,我还建议了解 js 和 web 的历史,它解释了该语言的许多奇怪行为。

    【讨论】:

    • == 与这里有什么关系?
    • 如前所述“另外,只是为了好玩......”。这与问题无关,但是当您不熟悉 js 时,这是一种奇怪/有趣的行为。
    • 好吧,虽然==与订单关系无关,即a == b!(a < b) && !(b < a)不一样; a === b 也不一样;这些具有非常不同的语义。其中一些运算符会强制它们的参数,如规范的运行时语义中所指定(例如,<, >, <=, >===, !=, ===, !==)。
    • 我同意。但我想你也错过了“我第一次开始使用 js 时所做的(我对比较和输入 xD 也很困惑)”。现在我知道了这些差异以及为什么事情会以它们的方式工作。但这并没有改变这样一个事实,即对于初学者来说,它看起来和感觉都很奇怪。而且由于提问的人自己是初学者,我认为分享我自己的经验会很有趣。
    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多