为什么("foo"=== new String("foo"))在JavaScript中评估为false?

Mic*_*ler 98 javascript equality object

在比较字符串值时,我会一直开始使用===(三等号,严格比较),但现在我发现了

"foo" === new String("foo")
Run Code Online (Sandbox Code Playgroud)

是假的,与此相同:

var f = "foo", g = new String("foo");
f === g; // false
Run Code Online (Sandbox Code Playgroud)

当然:

f == g; // true
Run Code Online (Sandbox Code Playgroud)

那么建议总是使用==进行字符串比较,或者总是在比较之前将变量转换为字符串?

SLa*_*aks 126

"foo"是一个字符串原语.(这个概念在C#或Java中不存在)

new String("foo") 是盒装字符串对象.

===运营商的行为有所不同的原语和对象.
比较基元(相同类型)时,===如果它们都具有相同的值,则返回true.

比较对象时,===只有当它们引用同一个对象时才会返回true(通过引用进行比较).因此,new String("a") !== new String("a").

在您的情况下,===返回false,因为操作数具有不同的类型(一个是基元,另一个是对象).


基元根本不是对象.
typeof运营商将不会返回"object"原语.

当您尝试访问基元的属性(将其用作对象)时,Javascript语言会将其设置为对象,每次都创建一个新对象.这在说明书中描述.

这就是为什么你不能在基元上放置属性的原因:

var x = "a";
x.property = 2;
alert(x.property) //undefined
Run Code Online (Sandbox Code Playgroud)

每次编写时x.property,都会创建一个不同的盒装String对象.

  • +1`typeof"foo"; //"string"`,`typeof new String("foo"); //"对象"` (32认同)
  • `if(Object(a)!== a){//它是原始的}` (2认同)

小智 34

使用===,

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

  • 如果它的类型和值相同,则与另一个原语相比时,原语是相等的.

  • `new String("foo")=== new String("foo")```false` :-P (3认同)

rai*_*7ow 10

这个new词在这里是个罪犯(像往常一样,我可以说)......

当您使用时new,您明确表达了使用对象的愿望.你可能会感到惊讶,但是这个:

var x = new String('foo');
var y = new String('foo');
x === y; 
Run Code Online (Sandbox Code Playgroud)

......会给你一个强大的力量false.这很简单:比较不是对象的内部,而是对象的引用.当然,它们并不相同,因为创建了两个不同的对象.

您可能想要使用的是转换:

var x = String('foo');
var y = String('foo');
x === y;
Run Code Online (Sandbox Code Playgroud)

......正如预期的那样,这会给你带来的true结果,所以你可以foos永远享受你的平等而欢欣鼓舞.)

  • 关于使用它的快速问题.你是在没有'new'关键字的情况下调用String(一个构造函数?).这是否意味着您将使用String构造函数中指定的任何属性污染范围?或者这不会发生,因为构造函数是本机代码?换句话说,假设String函数包含"this.a = 1;" - 这意味着你的函数/对象现在有一个属性a = 1. (2认同)