【问题标题】:What is the difference between javascript property and javascript variable?javascript属性和javascript变量有什么区别?
【发布时间】:2014-12-12 19:47:15
【问题描述】:

在 javascript 中分配值时,我遇到了这个

var obj = {
  resultCodeId: data[i].resultCodes[j].resultCodeId
};
var resultCodeId= data[i].resultCodes[j].resultCodeId;

':' 和 '=' 在 javascript 中有何根本区别?变量是否也可以具有属性,或者只是 javascript 中的对象具有属性?

【问题讨论】:

    标签: javascript object properties


    【解决方案1】:

    = 用于对象属性或全局/局部变量赋值。 : 仅用于对象定义时的属性分配。

    还有: 您可以delete 一个属性。 你不能delete一个变量。

    var obj = {
      p1: 'im p1',
      p2: 2
    };
    obj.p1 = 'im updated p1'; // assign a new value to object property
    var v = 'just a var'; // is global outside a function and local inside a function
    
    delete obj.p1; // is ok
    delete v; // is not ok
    

    【讨论】:

    • 那么基本的区别就在于删除之间??没有其他区别?
    • @rahulb - 这是变量和对象属性之间的细微差别 - 我认为主要答案是对象属性分配之间的区别。冒号只用于对象定义(不是变量赋值)
    • 所以冒号不能用于重新赋值给属性?首次为属性赋值时是否总是使用它?那么我们将如何覆盖这些属性呢?
    • 正确。当你说覆盖时,如果你的意思是重新分配一个值,那么看看我的例子 - 你使用 equals。
    【解决方案2】:

    ':' 以对象方式用于将键分配给值作为键/值对。 '=' 是赋值运算符。它将一个变量分配给一个值。

    是的,变量可以具有属性,因为可以为变量分配对象。

    【讨论】:

      【解决方案3】:

      属性通常与 javascript 对象相关联。

      var obj = {
        name: 'test', --> property
        getName: function(){ --> property
          return this.name
        }
      };
      

      相反,变量用于函数内部甚至函数外部。

      var global = "string"; --> variable
      function test(){
        var local = "string"; --> variable
      }
      

      但属性和变量的基本思想保持不变,即存储或指向内存中的对象。

      • ':' 用于将属性关联到对象时使用。

      • '=' 用于在内存中存储实际数据或引用时使用

      【讨论】:

        【解决方案4】:

        如果你使用成员函数,会有很大的不同。局部变量是立即可见的,但属性不是。他们需要this。但是——这是最大的区别——有时成员函数根本看不到它们自己的属性。一些标准代码,带有基本构造函数:

        function Cat() { // constructor with a var and property
          var a="local a"; // variable
          this.b="local b"; // property
        
          this.showBad = function() { return a+", "+b; } // local a, but searches for b in global
          this.showGood = function() { return a+", "+this.b; } // local a and b (but has a bug, explained below)
        }
        
        var c1=new Cat(); // using the constructor
        var a="GLOBAL A", b="GLOBAL B"; // if we can't see c1's locals, we get these
        
        console.log(c1.showBad()); // local a, GLOBAL B // oops on B
        console.log(c1.showGood()); // local a, local b // works fine, using "this"
        

        到目前为止,没什么大不了的。属性需要this,而变量不需要(实际上他们没有)。小东西。但是this 并不总是有效。在 javascript 成员函数中,this 可以是任何东西。如果您习惯于 OOP 语言,那似乎是错误的。这里我们调用c1.showGood 并将this 设置为全局范围:

        var sGood=c1.showGood; // sGood is the function "c1.showGood"
        console.log(sGood()); // local a, GLOBAL B // Argg. this.b didn't work!
        

        这似乎是假的,但这样的事情可能会发生。由于这两件事(变量总是有效的,我们需要一种可靠的方法来始终查看我们的属性),一个标准的技巧是在构造过程中将你的this 锁定在一个变量中。它很好地显示了 var/property 的差异:

        function Cat() { // constructor with a var and property
          var self = this; // self is our permanent, always visible link to this Cat
          this.a="local a";
          this.b="local b";
        
          this.showGood = function() { return self.a+", "+self.b; }
        }
        

        self 是一个变量,所以我们的showGood 总能找到我们的。同时ab只能通过链接找到,self完成。

        【讨论】:

          【解决方案5】:

          让我们以你的例子来解释,

          • var obj = { resultCodeId: data[i].resultCodes[j].resultCodeId }; 这意味着 resultCodeId 是“obj”对象的成员。您可以像 obj.resultCodeId 一样访问它。
          • var resultCodeId= data[i].resultCodes[j].resultCodeId; 这是一个全局变量,所有全局变量都是窗口对象的属性。所以你可以像 window.resultCodeId 一样访问它。

          另外:

          var resultCodeId= data[i].resultCodes[j].resultCodeId; 对象/函数中的这条语句将被视为局部变量,只能在该对象/函数中访问。

          【讨论】:

            【解决方案6】:

            : 与创建 obj(及其属性)有关

            let obj = {prop1: true, prop2: false};
            

            = 与执行期间的某些定义(变量、函数、obj、属性或其他)有关

            obj.prop1 = false;
            obj.prop2 = true;
            let foo;
            foo = function(){}
            let variable;
            variable = true;
            

            只有 obj 有属性(但 JS 中几乎所有东西都是 obj;函数是 obj;我们有全局/窗口 obj;等等)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-09-17
              • 2010-10-23
              • 2013-12-30
              • 2016-02-23
              • 2016-10-27
              • 2019-07-17
              • 1970-01-01
              相关资源
              最近更新 更多