标识符和变量的区别(JavaScript)
Difference between identifier and variable (in JavaScript)
我一直在寻找这个 query 的答案。
使用以下 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
标识的变量听起来很笨拙)。
I would like to know, whether var1
/var2
/var3
are variables or identifiers.
Amadan 是一个人还是一个名字?我想,两者都是,这取决于你对它的看法有多严格。对于变量和标识符,答案又是完全平行的。
编辑:
Can I say, Name
and Value
, in general?
准确地说,"value"是第三个概念,变量的"contents"是相关的第四个概念。
也许对变量更好的类比是储物柜:它们有标识符(写在盒子上的数字)和内容(无论你放在里面什么)。变量不一定是值的内存位置,因为变量可以包含引用,而不是对象本身(有点像将一块房地产的地址放入储物柜,而不是试图塞满一个整个房子都放进盒子里)。所以,在这个延伸的例子中,房子就是价值;储物柜是变量;储物柜上写的#284
是标识符;而带有“102 Nowhere Lane, Nowhereville”的那张纸是对值的引用,也是变量的内容。如果该值足够小且足够简单(在编程术语中,"primitive"),您可以将值本身填充到变量中,而不是引用。
例如:
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
的变量,其内容是对函数的引用。函数本身就是一个值。
var1
、var2
、var3
是标识符,其中 1
、function()
和 callToFunction
是实际值变量。变量的值可能不同,但其标识符始终相同。
以下内容基于 Amadan 于 2015 年 1 月 28 日发表的 'Whosebug' post,并受到其启发;为了我的个人利益和澄清,我重新编写了它,然后想分享它,以防它可能对其他人在试图理解这个主题时有所帮助。
标识符和变量之间的区别等同于名称和人之间的区别。
名字可以识别人,也可以识别狗、马、宠物等。名字不是人,也不是人名。一般来说,说“我是Amadan”比说“我和Amadan这个名字有关联”更容易,后者虽然意思更简洁,但在对话中效率较低。
因此,Amadan 是一个人还是一个名字?好吧,这取决于您查看问题的上下文。因此它也适用于变量和标识符。
同理:-
标识符可以与变量相关联;它们还可以与标签、函数、过程、程序、应用程序、类、方法等相关联。标识符不是变量,变量不是标识符。因此,可以说某个任意变量是 'var2',这避免了稍微 'clunky' 的说法“我将使用一个变量并将其与标识符 'var2' 相关联”。
所以现在,问题可能会出现“我可以改为通常使用名称和值这两个术语吗?”。对我来说,不!,通常不是因为,准确地说,“值”引入了第三个概念,顺便说一句,变量的“内容”引入了相关的第四个概念。
也许变量的一个很好的类比是考虑一个储物柜:它们都有标识符(一些 number/name/colour/icon)和内容(无论那里放什么)。
变量不一定是一个值的内存位置,它可以是一个对象引用的内存位置,而不包含对象本身(这有点像把一个真实的地址将不动产放入储物柜,而不是试图将那块不动产放入储物柜。
所以,总结这个类比,储物柜就是变量;标识符是储物柜的 number/name/colour/icon;内容是一张纸,上面有地址;参考是该房地产的地址;价值是一块不动产。
因此,如果一个值足够小且足够简单(在编程术语中是“原始”),则可以将值本身直接分配给变量,而不是将引用分配给该值。
例如:-
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'
上面声明了四个变量和'allocates'四个标识符(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'
'assigned' 有函数;
两个代码块的内容都引用了一个函数 - console.log();
每个函数本身就是一个值。
我一直在寻找这个 query 的答案。
使用以下 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
标识的变量听起来很笨拙)。
I would like to know, whether
var1
/var2
/var3
are variables or identifiers.
Amadan 是一个人还是一个名字?我想,两者都是,这取决于你对它的看法有多严格。对于变量和标识符,答案又是完全平行的。
编辑:
Can I say,
Name
andValue
, in general?
准确地说,"value"是第三个概念,变量的"contents"是相关的第四个概念。
也许对变量更好的类比是储物柜:它们有标识符(写在盒子上的数字)和内容(无论你放在里面什么)。变量不一定是值的内存位置,因为变量可以包含引用,而不是对象本身(有点像将一块房地产的地址放入储物柜,而不是试图塞满一个整个房子都放进盒子里)。所以,在这个延伸的例子中,房子就是价值;储物柜是变量;储物柜上写的#284
是标识符;而带有“102 Nowhere Lane, Nowhereville”的那张纸是对值的引用,也是变量的内容。如果该值足够小且足够简单(在编程术语中,"primitive"),您可以将值本身填充到变量中,而不是引用。
例如:
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
的变量,其内容是对函数的引用。函数本身就是一个值。
var1
、var2
、var3
是标识符,其中 1
、function()
和 callToFunction
是实际值变量。变量的值可能不同,但其标识符始终相同。
以下内容基于 Amadan 于 2015 年 1 月 28 日发表的 'Whosebug' post,并受到其启发;为了我的个人利益和澄清,我重新编写了它,然后想分享它,以防它可能对其他人在试图理解这个主题时有所帮助。
标识符和变量之间的区别等同于名称和人之间的区别。
名字可以识别人,也可以识别狗、马、宠物等。名字不是人,也不是人名。一般来说,说“我是Amadan”比说“我和Amadan这个名字有关联”更容易,后者虽然意思更简洁,但在对话中效率较低。
因此,Amadan 是一个人还是一个名字?好吧,这取决于您查看问题的上下文。因此它也适用于变量和标识符。
同理:- 标识符可以与变量相关联;它们还可以与标签、函数、过程、程序、应用程序、类、方法等相关联。标识符不是变量,变量不是标识符。因此,可以说某个任意变量是 'var2',这避免了稍微 'clunky' 的说法“我将使用一个变量并将其与标识符 'var2' 相关联”。
所以现在,问题可能会出现“我可以改为通常使用名称和值这两个术语吗?”。对我来说,不!,通常不是因为,准确地说,“值”引入了第三个概念,顺便说一句,变量的“内容”引入了相关的第四个概念。
也许变量的一个很好的类比是考虑一个储物柜:它们都有标识符(一些 number/name/colour/icon)和内容(无论那里放什么)。
变量不一定是一个值的内存位置,它可以是一个对象引用的内存位置,而不包含对象本身(这有点像把一个真实的地址将不动产放入储物柜,而不是试图将那块不动产放入储物柜。
所以,总结这个类比,储物柜就是变量;标识符是储物柜的 number/name/colour/icon;内容是一张纸,上面有地址;参考是该房地产的地址;价值是一块不动产。
因此,如果一个值足够小且足够简单(在编程术语中是“原始”),则可以将值本身直接分配给变量,而不是将引用分配给该值。
例如:-
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'
上面声明了四个变量和'allocates'四个标识符(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'
'assigned' 有函数;
两个代码块的内容都引用了一个函数 - console.log();
每个函数本身就是一个值。