最开始我们要讲的是“值”。
那么什么是“值”呢?这很难说。
这就像问数学中的数字是什么,或几何中的点是什么。“值”是JavaScript世界的基础。
数字是值,但是其他一些东西也是,例如对象和函数,同时,也有很多(例如if语句或变量声明语句)都不是值。
代码和值
为了将值与我的JavaScript程序中的其他所有内容区分开,我们想像一下Antoine deSaint-Exupér所写的《小王子》中的场景:
我站在一颗小行星上——这就是我所写的程序或者代码。
从表面上看,我只看到了if语句和变量声明,逗号,花括号以及在JavaScript代码中可能发现的所有其他内容。
我的代码包含“执行函数调用”或“多次执行此操作”甚至“抛出错误”这类的命令。我一步一步地完成这些命令——在我的小行星上跑来跑去。
但是我偶尔也会抬头,看看天上的世界。
在一个晴朗的夜晚,我抬头望着天空,看到了JavaScript天空中的闪烁着不同的“值”:boolean
, number
, string
, symbol
, function
,object
, null
and undefined
(译者注:bigInt[ES10]
)——哦,天哪!我可能在我的代码中使用了它们,但我完全没有意识到它们的存在。
在我的JavaScript世界中,“值”就是挂在天上的星星。
等等,你可能会说,“我一直认为值在我的代码中!”在这里,我要你在大脑中转换你的思维。这种心理模式还需要稍等一下你才能体会到。给我五分钟。
几年前,我曾经是个傻瓜。每当有人说什么的时候,我都会以另外一种思维取思考。如果有些事情与我所想的不同,我会拼命反对。 这就像我先入为主的思维——可是先入为主又意味着什么。其实其中真正的原因是我对这个问题的思考不够充分。反应越快,您的想法就越少。虽然事事并非总是如此,但经常如此。 当谈论膝盖反射的时候,就好像这只是别人才有的生理现象,你自己其实也有。如果你周围的人都有这个问题,那么通常你也无法避免。 时间回到2007年,我在罗德岛州普罗维登斯举行的企业创新工厂会议上发言。理查德·索尔·沃曼(Richard Saul Wurman)也进行了发言,在我发言之后,Richard在自我介绍的同时赞扬我的发言。这样看来,他很慷慨,当然他也可以不表扬我。 这时我做了什么呢?我针对他发表的内容进行了反对,当他在舞台上发表自己的观点时,我就在想着反驳他的观点或内容。在后面与他交谈时,我马上对他的一些想法进行了反驳。现在看来,我一定像个混蛋。 他的回复改变了我。回复其实很简单,他说:“伙计,给自己五分钟。”我问他那是什么意思?他说,不同意也好,反驳也好,拥有强烈的意见和信念都非常不错,但是当你确定要反驳之前,请给你的大脑一些时间。“五分钟”代表“思考”,而不是反应。他是对的,我来参加会议的目的是要证明一些东西,而不是来学习一些东西的。 对我来说,这是一个重要时刻。 Richard在一生都在思考他发言的问题,他花了30年,而我我只花了几分钟就来反对他。虽然他可能是错的,我可能是正确的,但是最好先深思一下,然后再确定自己观点的正确性。 提问和反驳也是有区别:反驳是你觉得自己知道了,而提出问题意味着您想知道,想了解更多。 学会先思考而不是快速反应是一生都该遵循的,这很难做到,有时候你可能会不自觉的就快速反应了。但是现在慢慢思考给我人生很大的帮助。 如果您不确定为什么这很重要,请考虑乔纳森·艾夫(Jonathan Ive)关于史蒂夫·乔布斯(Steve Jobs)对创意的崇敬之言: “就像史蒂夫喜欢创意,喜欢制作东西一样,他对创意的过程充满了难得的崇敬之情。我认为他比任何人都清楚,最后思维模式都会很强大,但它们开始时是脆弱的,在没有形成思维模式之前,它很容易被忽略,很容易受妥协,如此容易被压扁。” 思维模式这很深刻,但是想法很脆弱。它最初几乎不被察觉,其存在性微乎其微,因此很容易忽略,跳过或错过。 这个世界上有两件事很简单:1.花费别人的钱 2.放弃一个想法。 丢掉某个想法很容易,因为不费吹灰之力。你可以嘲笑它。你可以忽略它。你可以像烟一样扇走它,这些都很容易。难的事情是保护它,思考它,让它升华,探索它,对其进行使用和尝试。正确的想法可能会以错误的想法开始。 因此,下次您听到某人或某人谈论一个想法,提出一个想法或提出一个想法时,请给自己五分钟思考。 在说它太难或者太多和反驳之前先考虑一下,事实可能就是如此,但其中也可能有另一个真理:这样做是值得的。 本文作者:Jason Fried,TED演讲视频,36Kr采访
原始类型值(Primitive Values)
原始值是数字和字符串等,打开浏览器的控制台,并使用console.log
打印这些原始值:
console.log(2);
console.log("hello");
console.log(undefined);
所有原始值都有一些共同点——我们的代码无法影响他们。这听起来有点模糊,所以我们将在下一节中具体探讨其含义。现在,我要说的是原始值就像星星一样,冰冷而遥远,但是在我需要它们的时候总是存在。
这是值的第一种类型。
对象和函数(Objects and Functions)
对象和函数也是值,但它们不是原始值,这使它们非常特别,继续并将下面的代码输入到浏览器控制台:
console.log({});
console.log([]);
console.log(x => x * 2);
请注意,浏览器控制台显示它们的方式与原始值不同。某些浏览器可能在它们之前显示一个箭头,或者在点击它们时做一些特殊的事情。如果您安装了几种不同的浏览器(例如Chrome和Firefox),请比较它们如何显示对象和函数。
对象和函数是特殊的,因为我可以从代码中操纵它们。例如,我可以将它们连接到其他值。这听起来也相当模糊的——因此我们将在以后的章节中逐步完善这种想法。现在,我们可以说,如果原始值像遥远的恒星,那么对象和函数就像是悬浮在我代码附近的岩石。它们足够靠近,我们可以操纵它们。
这是值的第二种类型。 你可能有疑问,这非常好,如果你提出问题,JavaScript 世界可能会找到答案!当然,前提是你知道如何问。
表达式(Expressions)
有很多问题在JavaScript世界无法找到答案,你是想向自己最好的朋友去询问答案,还是一直等到变成骷髅?JavaScript也没有多大帮助。
但是有些问题JavaScript很愿意回答,这些问题有一个特殊的名称-它们称为表达式(expressions)。
如果我们“问”表达式2 + 2
,JavaScript将“回答”值4
console.log(2 + 2); // 4
表达式是JavaScript可以回答的方式。 JavaScript用来表达式来回答的唯一方式就是它知道怎么使用值。
如果“表达”一词使你感到困惑,请将其视为表达价值的一段代码。你可能会听到人们说2 + 2
“结果是”或“等于”4,这只是表达同一件事的不同方式。
我们询问JavaScript2 + 2
,它回答是4,表达式始终都会返回一个值。现在我们对表达式的了解已经足够深入了!
之前我们曾说过,JavaScript值有很多类型:数字,字符串,对象等。我们怎么知道任何特定值的类型?
类型检查(Checking a Type)
最初,JavaScript世界中的所有值可能看起来都相同——天空中的亮点。但是,如果仔细观察,你会发现只有不到十种不同类型的值,并且相同类型的值的行为类似。
如果要检查值的类型,可以使用typeof运算符询问。 JavaScript将使用预定的字符串值之一来回答我们的问题,例如number
,string
或object
。
以下是你可以在浏览器控制台中尝试的一些示例:
console.log(typeof(2)); // "number"
console.log(typeof("hello")); // "string"
console.log(typeof(undefined)); // "undefined"
在这里,typeof(2)
是一个表达式—并返回 “number”的值。
严格地说,typeof不需要使用圆括号,例如,typeof 2与typeof(2)效果一样。但是,有时需要圆括号以避免歧义。如果我们在typeof之后省略了圆括号,则以下情况之一将抛错。尝试猜测是哪一个:
nsole.log(typeof({})); // "object"
console.log(typeof([])); // "object"
console.log(typeof(x => x * 2)); // "function"
你可以在浏览器控制台中验证您的猜测。
现在再看一下最后三个示例-这次要密切注意它们的结果。你发现这些结果令人惊讶吗?为什么?
值的类型(Types of Values)
作为一名有理想有抱负的天文学家,你可能想了解JavaScript天空中可以观察到的每种类型的值。在研究JavaScript将近25年之后,天文学家仅发现了9种此类类型:
Primitive Values:
- Undefined (
undefined
),表示未定义的值 - Null (
null
), 表示为空的值 - Booleans (
true
andfalse
), 用于逻辑运算 - Numbers (
-100
,3.14
, and others),用于数学计算. - Strings (
"hello"
,"abracadabra"
, and others),表示文本 - Symbols (uncommon), 用来引出表达细节
BigInts (uncommon and new), 用于大数的数学运算,表示超过2的53次方减一的数
Objects and Functions
Objects (
{}
and others),用于对相关数据和代码进行分组- Functions (
x => x * 2
and others), 用于引用代码No Other Types
你能会问:“但是我使用过的其他类型(例如数组)呢?”
在JavaScript中,除了我们刚刚列举的基本值类型外,没有其他基本值类型。其余都是对象!例如,甚至数组,日期和正则表达式从根本上来说都是JavaScript中的对象:
你可能会回答:“我明白了,这是因为一切皆对象!”这是一个广为流传的说法,但事实并非如此。尽管像console.log(typeof([])); // "object"
console.log(typeof(new Date())); // "object"
console.log(typeof(/(hello|goodbye)/)); // "object"
'hi'.toUpperCase()
这样的代码使“ hi”看起来像一个对象,但这仅是一种幻觉。执行此操作时,JavaScript会创建包装对象,然后立即将其丢弃。
如果此模式你还没完全理解,现在,你只需要记住原始值(例如数字和字符串)不是对象。总结
让我们回顾一下到目前为止我们所知道的:
- JavaScript世界有值。我们可以将值视为在JavaScript世界中“挂”在天上的星星。它们在我们的代码中不存在,但是我们可以从我们的代码中引用它们。
- JavaScript世界中的值有两类:有原始值类型,然后有对象和函数类型。总共有九种单独的类型。每种类型都有特定的用途,但有些很少使用。
- 有些值是唯一的。例如,
null
是null
类型的唯一值,undefined
是undefined
类型的唯一值。正如我们将在后面学到的,这两个唯一值类型是制造麻烦的人! - 我们可以通过表达式提问。JavaScript将用值回答我们。例如,表达式
2 + 2
用4回答。 - 我们可以使用typeof表达式中来检查其类型。例如,
typeof(4)
是字符串值“ number”。练习
现在该把我们学到的东西付诸实践了。
即使你已经有相当不错的JavaScript经验,也不要跳过练习题!我(Dan)几年前才深入了解其中一些东西。
单击此处回答这些问题,并提供有关此章节的反馈。完成练习后,我将立即发送下一个章节。
接下来,我们将更详细地探讨原始值。我们看一下数字和Null等这些不同的原始类型的共同点,并了解关于JavaScript相等性的件事。
我们还将继续完善我们的思维模式。该章节提供了一个粗略的草图-近似值。我们将专注于图片的不同部分,并为它们填充更多细节,例如progressive JPEG图像。
这些步骤看起来很浅显,但这为以后的所有奠定了基础,我们正在一起构建JavaScript世界。