序幕:值和表达式
 
下面的内容非常基础,然而,就像大多数的故事一样,在最初的时候开始才是最好的开端。
想象一下,我们要去最喜欢的咖啡馆,他们会为你制作几乎任何你想要的饮料,从小而强烈的 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数组,一个包含本身的数组。
它们看似相同,但如果你用“===”检测,你看到它们是不同的。每次你计算一个表达式(包括输入一些东西)来创建一个数组,你在创建一个新的、不同的值,即便它看起来与某些其他数组的值相同。正如我们所见,许多其他类型的值是如此的,包括函数,这本书的主题。

(序幕完)

JavaScript Allongé 序幕:值和表达式的更多相关文章

  1. 第三章:Javascript类型、值和变量。

    计算机程序的运行需要对值(value)比如数字3.14或者文本"hello world"进行操作,在编程语言中,能够表示并操作的值的类型叫做数据类型(type),编程语言最基本的特 ...

  2. 前端要给力之:语句在JavaScript中的值

    文件夹 文件夹 问题是语句有值吗 那么说你骗我咯 有啥米用呢 研究这个是不是闲得那个啥疼 ES5ES6有什么差异呢 结论是ES6是改了规则但更合理 最后不不过if语句 这两天在写语言精髓那本书的第三版 ...

  3. JavaScript Allongé 第一呷 :基础函数 (2)

    啊!我想要有一个参数 到现在为止,我们已经了解了没有参数的函数.只说我们的函数没有任何参数,甚至还没说参数是什么.大多数程序员非常熟悉参数,中学数学就讨论这个了.所以你知道他们是什么,而我也知道你知道 ...

  4. JavaScript的基础数据类型和表达式

    Java Script的基础数据类型和表达式 基本的数据类型: number(数值)类型:可分为整数和浮点数 string(字符)类型:是用单引号“'”或者双引号“"”来说明的. boole ...

  5. javascript立即调用的函数表达式N种写法(第二篇)

    原文:javascript立即调用的函数表达式N种写法(第二篇) 上一篇博客我谈到将函数声明转换为函数表达式最常见的一种写法是:通过括号()将匿名函数声明转换为函数表达式即(function(){}) ...

  6. JavaScript获取当前值

    JavaScript获取当前值 1.说明        获取select下拉框中的选中的值以及文本值 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  7. Javascript获取value值的三种方法及注意点

    JavaScript获取value值,主要有以下三种: 1.用document.getElementById(“id名”).value来获取(例1): 2.通过form表单中的id名或者name名来获 ...

  8. TOJ1302: 简单计算器 && TOJ 4873: 表达式求值&&TOJ3231: 表达式求值

    这些都是应用Python的eval函数的一些题目! TOJ1302传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=show ...

  9. asp.net后台操作javascript:confirm返回值

    在asp.net中使用confirm可以分为两种: 1.没有使用ajax,confirm会引起也面刷新 2.使用了ajax,不会刷新 A.没有使用ajax,可以用StringBuilder来完成. ( ...

随机推荐

  1. 未公开函数MessageBoxTimeOut 实现定时消息(ZT) MFC实现MessageBox自动消失

    http://www.blogjava.net/baicker/archive/2007/07/13/130072.html #include <windows.h> #include & ...

  2. 调试windows服务最简单的方法之一

    先看一下这段启动代码: using System; using System.Collections.Generic; using System.Linq; using System.ServiceP ...

  3. Web前端行业的了解

    即将从事Web前端的工作的 先对即将从事的行业有个了解. Web前端发展史: 第一个网页诞生于90年代初,早期的网页除了一些小图片和毫无布局可言的标题段落,其全由文字构成.然而随着时代的进步,互联网的 ...

  4. 自然语言处理:问答 + CNN 笔记

    参考 Applying Deep Learning To Answer Selection: A Study And An Open Task follow: http://www.52nlp.cn/ ...

  5. 记SCOI2017

    Day1完挂,OI再见. 居然卡进去了. UESTC的评测机见鬼啊,我本地不到1s.时限是3s的两道题都T了,然后就少了50pt. Day1 T1看完首先O(n^2)DP是裸的,然后感觉n选k好像不能 ...

  6. PBE加密算法

    这是我参加全国信息安全大赛的设计的加密系统中的一个加密算法,虽然比赛的结果不是非常理想但是,我还是学到了很多东西,现在和大家分享一下,比赛收获的东西. 基于口令加密 PBE(Password Base ...

  7. docker 学习(四) springboot + docker

    下面演示: 在Windows上新建一个简单的Springboot工程,生成docker iamge,然后在本地的docker上运行: (1):登录到 https://start.spring.io/, ...

  8. c++重载输入输出运算符

    1 最好打断点看看哦 2例子 #include <iostream> using namespace std; class Complex2 { public: Complex2(, ) ...

  9. JSONObject put List<Double> 后转化为String问题的解决办法

    //原代码 JSONObject powerCurveJsonObj = new JSONObject(); powerCurveJsonObj.put("test",[0.5, ...

  10. 《剑指offer》面试题16—反转链表

    Node* p1  p2  p3 思路:开始时,p1为NULL,p2=phead,p3=p2—>next.使p2—>next = p1,然后使p1=p2,p2=p3.如果只有1个结点则此时 ...