繁体   English   中英

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

[英]Difference between identifier and variable (in JavaScript)

我一直在寻找这个问题的答案。

使用以下 JavaScript 语法:

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

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

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

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

以同样的方式:

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

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

Amadan 是一个人还是一个名字? 我想,两者都取决于您如何严格地看待它。 对于变量和标识符,答案又是完全平行的。

编辑:

我可以说, NameValue ,一般吗?

准确地说,“值”是第三个概念,变量的“内容”是相关的第四个概念。

也许一个更好的变量类比是储物柜:它们有标识符(写在盒子上的数字)和内容(你放什么东西)。 变量不一定是值的内存位置,因为变量可以包含引用,而不是对象本身(有点像将一块不动产的地址放入储物柜,而不是试图填充一个整个房子都放进盒子里)。 所以,在这个延伸的例子中,房子就是价值; 储物柜是变量; 写在储物柜上的#284是标识符; 而那张写着“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 )和四个用于命名它们的标识符(还有abaabb ); 它还提到了许多值( 1 , 2 , 3 , 4 ,数组[2, 3, 4] )。 aaa各自包含原始值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]

函数也是值。

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

与(几乎但不是 100%)相同

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

它定义了一个变量,其标识符为hello ,其内容是对函数的引用。 函数本身就是一个值。

以下内容基于 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();
每个函数本身就是一个值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM