标识符和变量之间的区别(在JavaScript中)

时间:2015-01-28 06:17:56

标签: javascript variables identifier

我一直在查看这个query的答案。

使用以下javascript语法:

var var1 = 1;
var var2 = function(a, b){
         return a + b;
      };
var var3 = var2(3, 5);

我想知道,var1 / var2 / var3是变量还是标识符。
与javascript中的var关键字有点混淆。

3 个答案:

答案 0 :(得分:8)

标识符和变量之间的区别与名称和人员之间的差异相同。

名称可识别人物。例如,他们也可以识别狗。名字不是人,也不是人名。但你可以说我是Amadan(因为我说Amadan这个名字听起来很笨拙)。

以同样的方式:

标识符标识变量。例如,他们还可以识别标签。标识符不是变量,也不是变量标识符。但你可以说那个变量是var2(因为说这是由标识符var2标识的变量听起来很笨拙)。

  

我想知道,var1 / var2 / var3是变量还是标识符。

Amadan是个人还是名字?我想,两者都取决于你对它的看法。对于变量和标识符,答案也是完全平行的。

修改

  

一般来说,我可以说NameValue吗?

确切地说,"价值"是第三个概念,"内容"变量相关的第四个变量。

对于变量来说,更好的类比可能是更衣箱:它们有标识符(写在盒子上的数字)和内容(无论你放在哪里)。变量不一定是值的内存位置,因为变量可以包含引用,而不是对象本身(有点像将一块不动产的地址放入一个锁定器,而不是试图填充一个整个房子进入盒子)。所以,在这个拉伸的例子中,房子是价值;储物柜是变量;写在储物柜上的#284是标识符;和#34; 102 Nowhere Lane,Nowhereville"是对值的引用,也是变量的内容。如果值很小且足够简单(在编程术语中,"原语"),您可以将值本身填充到变量中,而不是引用。

例如:

var a = 1;         // assign a value
var b = [2, 3, 4]; // assign a reference
var aa = a;        // copy the contents
var bb = b;        // copy the contents

声明四个变量(abaabb),以及四个标识符(a,{{1} },baa);它还提到了许多值(bb123,数组4)。 [2, 3, 4]a均包含原始值aa的不同副本。 1包含值b引用(不是值[2, 3, 4]本身!),而后者又包含值[2, 3, 4]234包含另一个......参考的副本!因此,如果您更改bb中包含的值,b中的值也会自动更改:

bb

功能也是价值。

b.push(5);
console.log(b);
// => [2, 3, 4, 5]
console.log(bb);
// => [2, 3, 4, 5]

(几乎但不是100%)与

完全相同
function hello(name) {
  console.log("Hello, " + name);
}

定义了一个标识符为var hello = function(name) { console.log("Hello, " + name); } 的变量,其内容是对函数的引用。函数本身就是一个值。

答案 1 :(得分:2)

以下内容基于 Amadan 于 2015 年 1 月 28 日发表的“stackoverflow”帖子并受其启发;为了我的个人利益和澄清,我重新编写了它,然后想分享它,以防其他人在尝试了解这个主题时可能会有所帮助。

标识符和变量之间的区别与名称和人之间的区别是等价的。

名字可以识别人,也可以识别狗、马、宠物等。名字不是人,也不是人名。一般来说,说“我是阿玛丹”比说“我与阿玛丹这个名字有关”更容易,后者在谈话中效率较低,但含义更简洁。

因此,Amadan 是一个人还是一个名字?嗯,这取决于您查看问题的上下文。变量和标识符也是如此。

以同样的方式:- 标识符可以与变量相关联;它们还可以与标签、函数、过程、程序、应用程序、类、方法等相关联。标识符不是变量,变量不是标识符。因此,可以说某个任意变量是“var2”,这避免了“我将使用一个变量并将其与标识符“var2”关联起来的略显“笨拙”的方式。

所以现在,可能会出现这样的问题:“我可以改用名称和值这两个术语吗?”。对我来说,不!,通常不是因为,准确地说,“值”引入了第三个概念,顺便说一句,变量的“内容”引入了相关的第四个概念。

变量的一个很好的类比是考虑一个储物柜:它们都有标识符(一些数字/名称/颜色/图标)和内容(无论放在那里)。

变量不一定是值的内存位置,它可以是对象引用的内存位置,而不包含对象本身(有点像将一块不动产的地址放入一个储物柜,而不是试图将那块不动产放入储物柜)。

所以,总结一下这个比喻,储物柜就是变量;标识符是储物柜的编号/名称/颜色/图标;内容是一张纸,上面有地址;参考是该不动产的地址;价值是一块不动产。

因此,如果一个值足够小且足够简单(在编程术语中,一个“原始值”),则可以将值本身直接分配给变量,而不是将引用分配给该值。

例如:-

var a = 1; // assigns a value
var b = [2, 3, 4]; // assigns a reference
var aa = a; // copy the contents of 'a' to 'aa'
var bb = b; // copy the contents of 'b' to 'bb'

上面声明了四个变量并‘分配’了四个标识符(a, b, aa, bb);
它还指定众多值(1,2,3,4,阵列[]);
a 和 aa 各自包含原始值 1 的不同副本;
b 包含对某些值的引用 [2]、[3]、[4],而在本例中,这些值又恰好包含值 2、3、4;
bb 包含 aa 持有的引用的副本。

因此,如果包含在b变为一个值,在BB中的值自动地改变也: -

b.push(5);
console.log(b);  
// console shows [2, 3, 4, 5]  
console.log(bb);  
// console shows [2, 3, 4, 5] 

函数也是值:-

function greeting(name) {  
  console.log("Hello, " + name);  
}

上述函数使用标识符'greeting',
它(几乎但不是 100%)等同于:-

var greeting = function(name) {  
  console.log("Hello, " + name);  
}

上述变量,与标识符'greeting'相关联
被“分配”了一个函数;
两个代码块的内容都指向一个函数——console.log();
每个函数本身就是一个值。

答案 2 :(得分:0)

var1var2var3是标识符,其1function()callToFunction的实际值是实际变量。变量的值可能不同,但其标识符始终相同。