为什么在JavaScript中(";foo";==新字符串(";foo";)的计算结果为false?

为什么在JavaScript中(";foo";==新字符串(";foo";)的计算结果为false?,javascript,object,equality,Javascript,Object,Equality,我本来打算在比较字符串值时一直使用==(三重相等,严格比较),但现在我发现 "foo" === new String("foo") 为false,与此相同: var f = "foo", g = new String("foo"); f === g; // false 当然: f == g; // true 因此,建议始终使用==进行字符串比较,还是在比较之前始终将变量转换为字符串?“foo”是字符串原语。(这个概念在C#或Java中不存在) 新字符串(“foo”)是装箱字符串对象 =运算

我本来打算在比较字符串值时一直使用==(三重相等,严格比较),但现在我发现

"foo" === new String("foo")
为false,与此相同:

var f = "foo", g = new String("foo");
f === g; // false
当然:

f == g; // true
因此,建议始终使用==进行字符串比较,还是在比较之前始终将变量转换为字符串?

“foo”
是字符串原语。(这个概念在C#或Java中不存在)

新字符串(“foo”)
是装箱字符串对象

=
运算符。
在比较(相同类型的)原语时,
==
如果它们具有相同的值,则返回true

比较对象时,
==
仅当它们引用同一对象时才会返回true(通过引用进行比较)。因此,
newstring(“a”)!=新字符串(“a”)

在本例中,
==
返回false,因为操作数的类型不同(一个是基元,另一个是对象)


基本体根本不是对象。
typeof
操作符不会返回原语的
“object”

当您尝试访问原语的属性(将其用作对象)时,Javascript语言会将其装箱到对象中,每次都会创建一个新对象。这在中进行了描述

这就是为什么不能在基本体上放置属性:

var x = "a";
x.property = 2;
alert(x.property) //undefined

每次编写
x.property
,都会创建一个不同的装箱
字符串
对象。

foo
是纯字符串,
新字符串(“foo”)
是使用
==
的对象字符串

  • 除了对自身的另一个引用外,对象永远不等于任何东西

  • 如果一个基元的类型和值相同,则与另一个基元相比,它们是相等的


    • 新的
      这个词在这里是个罪犯(我可以说,和往常一样)

      当您使用
      new
      时,您明确表示希望使用对象。这可能会让你感到惊讶,但是:

      var x = new String('foo');
      var y = new String('foo');
      x === y; 
      
      。。。将给您一个强大的
      。很简单:比较的不是对象的内部,而是对象的引用。当然,它们并不相等,因为创建了两个不同的对象

      您可能希望使用的是转换:

      。。。正如预期的那样,这将给你带来真正的结果,这样你就可以永远与你的同龄人一起欢欣鼓舞,共同繁荣。)

      来自node.js REPL(“命令行上的node”(如果已安装)):


      可能是因为
      foo
      是纯字符串,
      new string(“foo”)
      是对象StringBackground:建议不要使用
      new string
      (完全没有意义)创建字符串,而不要使用
      ==
      为什么有人要使用像
      new string(“foo”)这样的构造
      首先在Javascript中?我从来没有在代码中见过这样的代码,比如jQuery……在收到“String”参数后,可以使用
      String(obj)
      将装箱字符串转换为原语<代码>(“foo”==String(新字符串(“foo”))==true
      +1
      类型的“foo”;//“字符串”
      新字符串的类型(“foo”);//“object”
      很有趣,我还以为字符串是JS中的对象呢。@Sarfraz:几乎所有的东西。不要忘记
      null
      undefined
      如果(Object(a)!==a){//它是一个基元}
      Java确实有基元/.Net不要
      newstring(“foo”)==newstring(“foo”)
      false
      :-Pquick关于使用这个的问题。您在调用字符串(构造函数?)时没有使用“new”关键字。这难道不意味着在字符串构造函数中分配的任何属性都会污染作用域吗?或者这不是因为构造函数是本机代码而发生的吗?换句话说,假设字符串函数包含“this.a=1;”——这意味着您的函数/对象现在将具有属性a=1。我假设(但不能确定)每个“装箱构造函数”函数首先检查其上下文——如果它不是“新的”(即原型对象),则立即切换到转换方法。例如,如果字符串是
      toString()
      方法。
      var x = String('foo');
      var y = String('foo');
      x === y;
      
      > "foo" === (new String("foo")).valueOf()
      true
      > "foo" === new String("foo")
      false
      > typeof("foo")
      'string'
      > typeof(new String("foo"))
      'object'
      > typeof((new String("foo")).valueOf())
      'string'