为什么将字符串作为“this”传递会导致这种奇怪?

时间:2011-10-22 02:31:03

标签: javascript

我试图理解为什么javascript会做出意想不到的事情(对我而言)。这里有一些纯粹的代码。换句话说,我实际上并不想扩展String(我实际上是绑定到函数和东西)。所以这是没有库的普通javascript。

var s = 'blah';

String.prototype.foo = function () {
  console.log('this === s:', this === s);
  console.log('this == s:', this == s);
  console.log('typeof this:', typeof this);
  console.log('typeof s:', typeof s);
  console.log('this:', this);
  console.log('s:', s);
};

s.foo()

这是Safari脚本控制台中的输出:

this === s: false
this == s: true
typeof this: object
typeof s: string
this: [object Object]
s: blah

IE,FF,Chrome等的类似输出

我试图解开为什么这= = s不是真的。也是为什么这是一个“对象”,但s是一个“字符串”。

这里发生了什么?

2 个答案:

答案 0 :(得分:10)

  

“这也是为什么这是一个”对象“,但s是一个”字符串“。”

如果我们从这个开始就会更容易。

这是因为当你在原始值上调用一个方法时,它会被转换为它的对象包装器(因为那是方法所在的位置)。这意味着函数中的this值将是对象包装器,而不是原始字符串。

就好像你这样做:

new String( s ).foo();

因此,这解释了typeof结果和[object Object]输出。


  

“我正试图解决为什么这个=== s不正确。”

现在可能更容易理解了。由于this不是对原始字符串的引用,而是对象包装器的引用,因此您不会按===的任何定义比较相同的项目。

==的作用原因是它确实输入了强制。 Object包装器被转换为字符串原语,因此您最终得到了相同的比较。


您应该注意,如果您在严格模式中运行代码,并且在基元上调用该方法,则this的值将是原语而不是其对象包装

答案 1 :(得分:0)

当您使用===比较某些内容时,它会按值和类型进行比较。由于这是一个对象而s是一个字符串,因此失败。在大多数情况下,这指的是父对象。一个html对象或窗口。没有准备这个,这个==窗口对象。这也可以是类对象,也可以这种方式进行比较。由于您是String类的原型,它自动成为一个对象。

比较运算符列表:http://www.w3schools.com/js/js_comparisons.asp