JavaScript Allongé 序幕:值和表达式

序幕:值和表达式
 
下面的内容非常基础,然而,就像大多数的故事一样,在最初的时候开始才是最好的开端。
想象一下,我们要去最喜欢的咖啡馆,他们会为你制作几乎任何你想要的饮料,从小而强烈的 Espresso Ristretto (浓缩瑞斯德)到干卡布奇诺,再到那些咖啡味的注了糖浆和牛奶的沙漠调酒(你容忍含糖饮料的存在,因为他们提供了足够的利润——你整天挂在那里,使用他们的WIFI,每隔几小时要一杯3美元的饮料)。
你在柜台一边传了订单, 柜台后面的人们表演完他们的魔法,在另一边把你要的咖啡递给你。javascript环境就是这样工作的,这正是这本书的目的。我们将放弃web服务器,浏览器以及其他复杂的事物,只处理这样一个简单的模型:你给计算机一个表达式,然后它返回一个值,正如你向咖啡师表达你的意愿而后收到一杯咖啡作为回报一样。
 
 
值和表达式
 
 
所有值都是表达式。假设你递给咖啡师一杯古巴咖啡。是的,你递出一个杯子,里面有一些注了部分焦糖的咖啡。你说,“我想要其中的一种”,咖啡师并不是傻瓜,她直接把它给你,而你确实得到了你想要的,因此。一杯古巴咖啡就是一个表达式(你可以用它来下订单)或一个值(你从咖啡师那里拿回来的)。
我们试试这种计算机容易理解的方式:
 
42

这是一个表达式?一个值?都不是?或者二者兼有?
答案是,这既是一个表达式又是一个值。你证明它两者都是的方法很简单:当你在javascript中输入它的时候,返回的是同样的结果,正如我们的古巴咖啡。
 
42
//=> 42

所有的值都是表达式,这很简单!是否有其他任何类型的表达式呢?当然了!让我们回到咖啡馆。我们交出成分而不是成品咖啡,我们交出一些磨碎的咖啡再加一些开水。
聪明的读者可能会意思到我们忽略了一些东西,祝贺你!尝一口浓缩咖啡,稍后我们会谈到。
现在,咖啡师送还给我们一杯浓缩咖啡,并且如果我们交出这杯浓缩咖啡,马上就拿回来了。所以,开水加咖啡渣是一个表达式,但它不是一个值。开水是一个值,咖啡渣是一个值,浓缩咖啡是一个值,开水加咖啡渣是一个表达式。
同样的,我们试试计算机容易理解的方式:
 
"JavaScript" + " " + "Allonge"
//=> "JavaScript Allonge"

现在,我们看到,字符串是值,而且你可以用字符串和“+”运算符造出一个表达式,既然字符串是值,他们自身也是表达式。但是带运算符的字符串并不是值,他们是表达式。现在我们知道在“开水加咖啡渣”的例子中被遗漏的是什么了。咖啡渣是一个值,热开水是一个值,它们之间的“+”运算符使得这个整体成为一个表达式而不是一个值。
 
值和恒等式
 
在javascript中,我们用操作符“===”测试两个值是否相等,是否不相等用操作符“!=="。

2 === 2
//=> true    
'hello' !== 'goodbye'
//=> true

它到底是如何工作的呢?想象一下,你看到一杯咖啡,然后又看到另一杯咖啡,这两杯咖啡是恒等的么?在javascript中有4种可能:
首先,有时候,咖啡杯是不同的,一只是小型咖啡杯,另一只是马克杯,这与在javascript中比较两个不同类型的值相对应。举个例子,字符串“2”和数值2不是一回事,字符串和数值是不同的类型,所以字符串和数值从不恒等:

2 === '2'
//=> false
   
true !== 'true'
//=> true

第二,有时,杯子是同样的类型,可能是两只浓缩咖啡杯,但他们有不同的容量,一只是单倍的,一只是双倍的。这与比较两个同种类型但不同”容量“的javascript值相对应,比如,数值5与数值2不是一回事。

true === false
//=> false
  
2 !== 5
//=> true
  
'two' === 'five'
//=> false

如果杯子是同种类型,其容量也是一样呢?那么,javascript的第三种和第四种可能性会涵盖这一点。
 
值类型

第三,有时,一些杯子的类型没有区分标志,如果它们是同种类型的杯子,其"容量"也相同,我们没有办法分辨它们之间的不同点,这是我们到目前为止所看到的字符串、数值和布尔值的情况。
2 + 2 === 4
//=> true
  
(2 + 2 === 4) === (2 !== 5)
//=> true


注意这些例子中发生的事情:当我们获得一个作为表达式结果的字符串、数值和布尔值时,它与另一个相同类型相同内容的值是相同的,字符串、数值和布尔值是javascript中所谓的“值”或“原始值”的例子。

我们将交替使用这两个术语。

我们还没有遇到第四种可能性,稍微拉伸一下这个比喻,某些类型的杯子底部有一个序列号,所以即便你有两只同种类型相同容量的杯子,你还是能区分它们。

引用类型
所以在javascript中哪种类型的值会是相同类型且相同内容时,但不被认为在相同的呢?我们来看一种在现代编程语言中非常常见的数据结构——数组(其他语言中有时称其为列表或向量)。
数组看起来像这样:[1, 2, 3],这是一个表达式,你可以用"[]"与其他表达式结合起来,诸如:
[2-1, 2, 2+1]
[1, 1+1, 1+1+1]

注意:你总是生成相同内容的数组,但是数组的每一个值与另一个数组的每一个值都相同,他们就同样恒等么?自己试试这些:
[2-1, 2, 2+1] === [1,2,3]
[1,2,3] === [1, 2, 3]
[1, 2, 3] === [1, 2, 3]

怎么样?当你输入[1,2,3]或其任何变体,你正在输入一个不同于其他任何数组的生成了其自身唯一的数组的表达式。即便其他的数组看起来也像[1,2,3],就好像javascript生成两个底部有不同序列号的咖啡杯一样。
数组看起来非常简单,然而“引用”这个词充满了太多的可能性,有一整个章节专门讨论重新绑定与引用。试着输入这个代码:
var ouroboros = [];
ouroboros[0] = ouroboros;
//=> [ [Circular] ]

你正在创建一个ouroborian数组,一个包含本身的数组。
它们看似相同,但如果你用“===”检测,你看到它们是不同的。每次你计算一个表达式(包括输入一些东西)来创建一个数组,你在创建一个新的、不同的值,即便它看起来与某些其他数组的值相同。正如我们所见,许多其他类型的值是如此的,包括函数,这本书的主题。

(序幕完)

hi,我的新博客地址:ysha.me !!
原文地址:https://www.cnblogs.com/qianlegeqian/p/3612723.html