在Javascript中理解此关键字

时间:2018-01-20 06:25:17

标签: javascript

我正在尝试在Javascript代码下面打印,它显示第一行true和第二行false。虽然它们看起来都一样,但我不明白它们的区别

var someObj = {
  data: function() {
    console.log(this == someObj) // true
    console.log("Value of this " + this == someObj) //false
  }
};

someObj.data();

4 个答案:

答案 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,functionobject 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

我希望这可以解决一些问题