【问题标题】:'hello' == (anything that will return true other than 'hello') in JavaScript?JavaScript 中的 'hello' == (除了 'hello' 之外的任何返回 true 的东西)?
【发布时间】:2014-05-10 07:56:28
【问题描述】:

我知道 JavaScript 中的 == 是与类型强制比较。而且我知道以下语句是true

'' == false;
' ' == false;
'0' == false;
'\n' == false;

但是,我无法与左侧的“你好”进行比较:

'hello' == true; // no this is false
'hello' == false; // no this is false
'hello' == 1; // no this is false
'hello' == 0; // no this is false

除了 'hello' 之外,还有什么 'hello' 可以与 true 的结果相比较吗?

【问题讨论】:

  • 没有。如果您不允许其他东西包含"hello",那么没有其他东西会强制将== 转换为"hello"。这个问题的意义何在?现在,如果没有问题背后的一些逻辑,这似乎毫无意义。
  • 如果你研究强制规则,你会发现只有 =="Hello" 的东西有一个 .toString() 方法返回 "Hello" 这样的东西:@987654321 @ 或者这个:jsfiddle.net/jfriend00/KSgwb
  • 如果你想知道比较算法是如何工作的,可以看这里:ecma-international.org/ecma-262/5.1/#sec-11.9.3
  • @jfriend00:也许您应该将解释发布为答案。
  • @FelixKling - 我把它放在一个答案中。

标签: javascript string-comparison ecmascript-5 triple-equals


【解决方案1】:

有这个:

if('hello') {
  alert('true') 
}

这将被评估为true,因为字符串不为空或null

既然你想比较:

'hello' == String.fromCharCode.apply(String, [104, 101, 108, 108, 111])

【讨论】:

  • 我想要一个比较。它必须是'hello' == <something other than 'hello'>
  • 已更新。将字符串与字节进行比较。
【解决方案2】:

这算不算?

["hello"] == "hello"  // true

【讨论】:

  • 不能有"hello" :)
【解决方案3】:

这是一个:

var x = ['H', 'e', 'l', 'l', 'o'];
x.toString = function() {
    return this.join("");
}

alert(x == "Hello");   // true

http://jsfiddle.net/jfriend00/KSgwb/

或者其他:

var x = {
    toString: function() {return "Hello";}
}

alert(x == "Hello");   // true

http://jsfiddle.net/jfriend00/hKx9x/

如果你研究== 的强制规则,你会发现唯一能满足=="Hello" 的东西是已经是"Hello" 的字符串或具有@987654330 的东西@ 方法返回 "Hello"

这可以通过加入数组、直接返回字符串、处理组合形成该字符串的一堆字符代码等多种创造性方式来完成...但是,最后,@987654332 @ 必须返回 "Hello" 才能满足 == 测试。


如果您不允许您要比较的东西以任何方式在其中包含 "Hello" 或能够根据需要生成该字符串,那么没有任何其他东西可以满足 == 除了某些东西当被要求强制转换为字符串时,会生成字符串"Hello"


这里是外行对 Javascript 的类型强制规则的描述:http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html


简而言之,以下是涉及字符串时的强制规则:

  1. 如果这两种类型都是字符串,那么只有当两个字符串包含完全相同的字符时,比较才为true

  2. 如果一个是字符串而另一个是数字,则尝试将字符串转换为数字并将其与另一个数字进行比较。由于Number("Hello")NaN,这对数字永远不起作用,因为NaN 不能是== 对另一个数字。

  3. 如果一个是字符串,另一个是对象,则调用内部方法 valueOf(如果已定义)或 toString(如果未定义)并将其结果与您的字符串进行比较。

  4. 如果一个是字符串而另一个是布尔值,则将两者都转换为数字并进行比较。因为Number("Hello")NaN,所以它永远不会匹配一个布尔值,当转换为数字时,它要么是0,要么是1。例如:true == "1"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多