编程语言|跨过编程入门门槛,从写一首“代码诗”开始( 二 )


如果你能看懂这首诗 , 你实际上是理解了一段JavaScript代码 , 也许你还会拿来与英语进行比较 。
现在你可能会问自己:我理解这一点 , 但它为什么这么写呢?这种语言背后的规则(语法)是什么呢?“me”在技术层面是什么意思?为什么这段代码看起来很像英语?
编程语言|跨过编程入门门槛,从写一首“代码诗”开始文章插图
规则、词汇和变量学习编程语言时 , 最重要的事情之一就是理解变量的概念 。
每一种人类语言都有其规则(语法)和大量词汇(意思均已知) 。 显然 , 只有先学习这两点才会说这种语言 。
与许多其它编程语言一样 , JavaScript也有一套规则(例如 , 单词之间要加“.”或如何编写“if”语句)和词汇(if、document、window、Event等) 。 这些关键字由JavaScript(和浏览器)所有(或“预先定义”) , 并且每个关键字都有其特定用途 。
就像之前提到的那样 , 似乎没有机会去和英语中的单词和句子做比较 , 因为JavaScript中根本没有对应的词和句子 。
这就是引入变量这个概念的原因 , 开发人员可以(甚至必须)定义变量 , 以便让机器和开发人员理解某些东西代表什么 。 变量可以采用多种形式(因此得名):它们可以是一串单词和字母(字符串)、数字、操作(函数)、甚至集合(数组) , 不胜枚举 。
在所有人类语言中 , 可能都有一个关于“love”的词 , 你大概明白它是什么意思 , 但不太肯定 , 因为它太主观了 。 但无论怎样 , 还是有一个词可以形容它 。
但在JavaScript中 , 如果不定义“love” , 就没有与之对应的表达 , 至于形式 , 则完全取决于你 。
var love = { color: ‘red’, duration: 365, loveTarget: ‘cats’,};// a simple variable expression,// where love is an object “{ … }”, a thing// with some properties (color, duration, loveTarget).const love2 = { color: ‘purple’, duration: ‘forever’, loveTarget: ‘dogs’,};// also a variable expression, where love2 (aconstant),// cannot be redefined / overwritten completely:// love2 = undefined; // => will not work// (“undefined” is a pre-defined javascriptkeyword,// basically saying “has no value”)区分JavaScript中预定义的内容(JavaScript规则和词汇表)与开发人员实际自定义的内容(也称为“应用程序逻辑”或“业务逻辑”)十分重要 。
回到上面写的诗:
// Love at first sightif (me.getDistanceTo(you.position) < 200) { me.setFeelings({ inLove: true, });}这些表达式来自以下JavaScript词汇表规则集:
if (…) { … }// if statement: when … is met, do things in { … }{ inLove: true,}// an “object” with some info, some thing in the world.// can contain other info, and “skills” (functions).// “inLove” is a custom property,// “true” is pre-defined in javascript, (meaning: “yes”)// and the value of “inLove”..// needed to access an objects property “my name: me.name”getDistanceTo()// an expression to “call” a function (a “skill”).// getDistanceTo is custom (not JavaScript), and a function,// so it can be executed / called upon with the “()” after.// sometimes you can pass arguments in those brackets (like “position”)// to change the outcome of a function.这些是变量 , 可以自定义它们的名称和行为 。
me // an object, some thing in the worldyou // an object, some thing in the worldposition // an info about “you”, accessed by the “.”getDistanceTo // a skill of me, accessed by the “.”getDistanceTo() // the skill, with javascript grammar telling: do it.getDistanceTo(position) // same, but do it with “position”.setFeelings // another skill of me, accessed by the “.”setFeelings({ inLove: true }); // the skill, with some instructions (anobject).假设这是一首人类读得懂的诗 , 你可能已经理解了其中的信息 , 也可能看到了需要遵循的JavaScript语言规则与需要提出的内容(变量)之间有何区别 。
但机器又会怎么做呢?
如果是机器(浏览器)读取这首诗 , 那就会识别为错误 。 机器需要一个“me”和“you”的定义 , 因为它试图访问其属性(通过在me.getDistanceTo()中的“.”来访问) 。 有了上面提到的区分能力 , 实际上你可以设计“me”和“you”,让计算机能够执行或读取诗 , 如下所示:
// This is how the definition of a being (me/you)could look likevar me = { position: {x: 0, y: 0} // some coordinates, maybe getDistanceTo: function(position) { // calculate the distance, relative to own position }, setFeelings: function(feelings) { // handle those feelings… }}var you = { position: {x: 0, y: 0} // some coordinates, maybe}// the poem itselfif (me.getDistanceTo(you.position)