我正在尝试在Javascript代码下面打印,它显示第一行true
和第二行false
。虽然它们看起来都一样,但我不明白它们的区别
var someObj = {
data: function() {
console.log(this == someObj) // true
console.log("Value of this " + this == someObj) //false
}
};
someObj.data();
答案 0 :(得分:3)
+
将字符串连接到对象的toString,以便进行比较:
("Value of this " + this) == someObj
而不是
"Value of this " + (this == someObj)
var someObj = {
data: function() {
console.log(this == someObj) // true
console.log("Value of this " + this == someObj) // false
console.log("Value of this " + (this == someObj)) // true
}
};
someObj.data();

答案 1 :(得分:2)
console.log("Value of this " + this == someObj) //false
导致错误的原因是因为concate +
运算符的优先级高于比较运算符==
。要获得所需的结果,您可以使用括号
var someObj = {
data: function() {
console.log(this == someObj) // true
console.log("Value of this " + (this == someObj)) //true
}
};
someObj.data();
为了更好地说明,您可以考虑使用javascript opearator precedence表。
答案 2 :(得分:1)
第二行被解析为:
("Value of this " + this) == someObj
基本上评估为:
("Value of this " + this.toString()) == someObj
所以在左侧你有一个字符串,右边是一个对象,因此不平等。
作为旁注,此处您的具体问题更多的是关于如何解析该行(评估顺序,隐式.toString()
转换和连接发生)而不是关键字this
。现在,Javascript中的this
主题本身就是一个完整的课程,与您可能习惯使用的Java,C#或其他面向对象语言完全不同。如果您从其中一种OOP语言进入Javascript(非OOP语言)的精彩世界,绝对值得一读。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
作为长期用C#编码的人,我经常不得不提醒自己,Javascript是prototype
s,function
和object literal
的语言。方法就像属性一样,它们可以随时在不同的对象和上下文中传递,绑定和执行。而this
则完全不同!
答案 3 :(得分:0)
使用关键字这是javascript中最难以理解它是如何工作的事情之一,使用这些引用意味着不同的东西取决于它的调用方式和位置;与基于类的Java语言相比,它也会变得混乱。 this关键字引用调用它的上下文。引用它的方式导致了回调函数的bind()等解决方案,它使异步操作更加混乱。现在arrow functions()=> {someObject}隐式地将this关键字绑定到包含调用的上下文,无论上下文是否在执行时都已经过,如异步操作中的情况。 至于案例比较的参考,你在代码中并不理解JavaScript在松散比较运算符中如何作为一种语言运行,并且与关键字this没有多大关系。
var someObj = {
data: function() {
console.log(this == someObj)
上面这一行是真的,因为'this'的上下文是someObj所以这个=== someObj
console.log("Value of this " + this == someObj) // false
上面的行是false,因为你将对象连接到“this of this”,所以调用toString方法,JavaScript将someObj转换为String以执行比较,而右侧的String不等于左侧的字符串,因此值为false
console.log("Value of this " + (this == someObj)) // true
上面的语句再次将'this'对象与someObj进行比较,并且它们都引用同一个对象,因此您可以期望控制台记录此值的值
如果您想了解更多有关此关键字的信息,请点击此链接 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this 如果您想了解松散比较运算符与严格比较运算符的更多信息,请参阅此处链接 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators
我希望这可以解决一些问题