我试图理解为什么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是一个“字符串”。
这里发生了什么?
答案 0 :(得分:10)
“这也是为什么这是一个”对象“,但s是一个”字符串“。”
如果我们从这个开始就会更容易。
这是因为当你在原始值上调用一个方法时,它会被转换为它的对象包装器(因为那是方法所在的位置)。这意味着函数中的this
值将是对象包装器,而不是原始字符串。
就好像你这样做:
new String( s ).foo();
因此,这解释了typeof
结果和[object Object]
输出。
“我正试图解决为什么这个=== s不正确。”
现在可能更容易理解了。由于this
不是对原始字符串的引用,而是对象包装器的引用,因此您不会按===
的任何定义比较相同的项目。
==
的作用原因是它确实输入了强制。 Object包装器被转换为字符串原语,因此您最终得到了相同的比较。
您应该注意,如果您在严格模式中运行代码,并且在基元上调用该方法,则this
的值将是原语而不是其对象包装
答案 1 :(得分:0)
当您使用===比较某些内容时,它会按值和类型进行比较。由于这是一个对象而s是一个字符串,因此失败。在大多数情况下,这指的是父对象。一个html对象或窗口。没有准备这个,这个==窗口对象。这也可以是类对象,也可以这种方式进行比较。由于您是String类的原型,它自动成为一个对象。