[英]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 是一个人还是一个名字? 我想,两者都取决于您如何严格地看待它。 对于变量和标识符,答案又是完全平行的。
编辑:
我可以说,
Name
和Value
,一般吗?
准确地说,“值”是第三个概念,变量的“内容”是相关的第四个概念。
也许一个更好的变量类比是储物柜:它们有标识符(写在盒子上的数字)和内容(你放什么东西)。 变量不一定是值的内存位置,因为变量可以包含引用,而不是对象本身(有点像将一块不动产的地址放入储物柜,而不是试图填充一个整个房子都放进盒子里)。 所以,在这个延伸的例子中,房子就是价值; 储物柜是变量; 写在储物柜上的#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
声明四个变量( a
、 b
、 aa
、 bb
)和四个用于命名它们的标识符(还有a
、 b
、 aa
和bb
); 它还提到了许多值( 1
, 2
, 3
, 4
,数组[2, 3, 4]
)。 a
和aa
各自包含原始值1
的不同副本。 b
包含对值[2, 3, 4]
的引用(不是值[2, 3, 4]
本身!),而后者又包含值2
、 3
和4
。 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();
每个函数本身就是一个值。
var1
、 var2
、 var3
是标识符,它们的实际值为1
、 function()
和callToFunction
是实际变量。 变量的值可能不同,但其标识符始终相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.