北京网站制作费用品牌推广方案范文
spider
Spider是尝试通过提供更高的可靠性来改进我们的代码的新语言之一。 有些人当然可以将其描述为具有JavaScript语法的CoffeeScript,但这种描述将无法强调Spider的真正优势。
与大多数诸如CoffeeScript之类的替代方案相比,Spider包含了更多独特而有趣的概念。 虽然后者肯定比Spider更成熟,但通过选择以八足节肢动物命名的语言,我们可以得到一些不错的选择。 如果我们只想尝试另一种语言,或者寻找一种值得信赖JavaScript替代方案,或者尝试减少编写代码并做更多事情,那么Spider似乎是一个不错的选择。
基本概念
Spider是根据其口号设计的, 它只是JavaScript,但更好。
这意味着我们不会获得任何类型的编译类型系统或类型检查器。 我们也不会错过我们钟爱的C样式语法,其中大括号用于块,圆括号用于函数调用,方括号用于数组。 最后,我们也没有在JavaScript或其他任何东西之上看到自定义VM,以破坏与现有JavaScript代码的兼容性。 是的,这确实是JavaScript。
Spider的创造者意识到辩论静态语言和动态语言毫无意义。 每个人都有其优点和缺点。 使用Spider选择完全动态方面的原因很简单:JavaScript已经是动态的,并且当语言包含动态类型系统时,与动态代码的交互变得更加简单。
这里还有两件事要提到:
- Spider已编译为JavaScript(即已编译)
- 某些功能的灵感来自于Go,C#和CoffeeScript等语言
这些文件不会移植到旧版本JavaScript中,而是移植到最新的标准ECMAScript 6中。为了保证大多数浏览器的支持,Spider使用Google的Traceur生成ECMAScript 5兼容文件。 这意味着Spider已经在利用未来的改进,而当前的输出向后兼容。
句法
Spider包含::
运算符以访问全局范围。 这样可以防止我们在没有意识到的情况下做一些愚蠢的事情。 但是,这还意味着我们需要编写更多内容来访问,例如, console
对象。 下面的语句显示了一个使用::
运算符的示例:
::console.log("Hello world!");
解决此问题的一种可能方法是使用use
语句。 它使我们可以引用本地未声明的符号。
use console;
console.log("Hello world!");
Spider提供了某些宏,这些宏可以解锁一些众所周知的全局对象。 根据您正在开发的应用程序类型,这些宏或多或少会有用。 下面是一个示例:
use :browser;
console.log(document.title, window.screen);
:browser
宏使我们可以直接使用诸如document
, console
, window
, location
等对象。 对于DOM密集型应用程序非常有用的功能。
不是保留所有以前的逻辑运算符,而是替换了一些逻辑运算符。 例如,相等和不相等运算符( ==
和!=
)现在扮演严格相等和严格不相等(JavaScript中的===
和!==
)的角色。 “和”( &&
)和“或”( ||
)运算符也可以转换值,并分别重命名为and
和or
。 这是一个例子:
// x == true;
x = false or 5;
// x == true;
x = 5 and 4;
// x == false;
x = 1 == "1";
现在,有些人会尖叫,停止阅读本文,并关闭页面。 但是,等等……别那么快就离开!
逻辑和和逻辑或运算符还被滥用来控制流和放置默认值。 尽管前者并不那么有趣,但后者可以节省大量时间。 该语言使用null运算符??
从C#覆盖默认值:
x = options.name ?? 'default name';
此时,我们准备看一下功能。 函数使JavaScript如此有趣。 蜘蛛不会带走任何东西,除了几个字符:
var square = fn (x) {
return x * x;
};
除了编写function
,我们还可以在Spider中编写fn
。 这样可以避免在保持相同结构的情况下键入几次击键。 像在JavaScript中一样,我们可以在函数语句或函数表达式中使用函数。 就像JavaScript中一样,函数语句仅限于命名函数。
另外,我们可以在Java lambda表达式中使用箭头功能->
(类似于JavaScript中的箭头功能)。 前面的示例可以表示如下:
var square = (x) -> x * x;
如果不编写块,该函数将立即返回提供的表达式。 相反,如果您有语句块,则需要使用return
语句来返回值。
但是简单的功能箭头是不够的。 与TypeScript语言(以及ECMAScript 6)一样,我们也有胖箭头=>
运算符。 这是一个上下文保存功能箭头。 如果您想了解有关JavaScript中箭头功能的更多信息,建议您阅读文章准备ECMAScript 6:新功能语法 。
以下是Spider中此运算符的示例:
fn Animal(name) {
this.name = name;
this.printNameLater = () => {
::setTimeout(() => {
::console.log(this.name);
}, 1000);
};
}

免费学习PHP!
全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。
原价$ 11.95 您的完全免费
功能的另一项说明是能够指定默认参数并使用其余参数的能力,如ECMAScript 6中一样。前者会自动生成代码以检查并修复丢失(即undefined
)的参数。 后者类似于变量参数列表。 基本上,它将所有其他未命名参数分组为一个命名数组:
fn format(text, parameters...) {
for parameter, index in parameters
text = text.replace('{' + index + '}', parameter);
return text;
}
format("Hi {0}! My name is {1}.", "World", "Florian");
在前面的示例中,我们还看到了Spider编写循环的优雅方式之一。 我们使用了经典的foreach
循环和附加的迭代计数器。 Spider也包含更多此类功能,我们将在下一部分中看到。
特征
Spider通过引入更多的一致性为JavaScript带来了更多安全性。 在类型名称中可以找到更一致的方法的示例。
// "object"
typeof { a: 4 };
// "array"
typeof [1, 2, 3];
// "date"
typeof new Date;
// "number"
typeof new Number(4);
// "string"
typeof new String("abc");
// "boolean"
typeof new Boolean(true);
如您所见,数组和日期的类型与JavaScript不同,并且更接近您(或大多数人)的期望。 存在操作符可以找到另一个安全检查?
。 它将任何表达式转换为对null
或undefined
的检查。 这可能非常方便:
if game? {
play();
}
还有其他变体,即?.
(也称为Elvis运算符)用于调用属性,或?()
用于调用函数。 因此,以下内容可能有意义:
game?.play?();
在这里,我们仅在定义了game
情况下访问play
属性。 如果play
不是函数,则不会调用任何东西。
转译
我已经提到过Spider实际上会转换为ECMAScript6。作为积极的副作用,Spider很有前途,并使用了当今可访问JavaScript功能。 但是,以ES6为目标也有一个缺点:我们仍然需要另一个编译器将输出转换为ES5或更低版本,所有现代浏览器(包括旧版本的Internet Explorer)都可以解释该编译器。
对于编译,我们需要Spider编译器。 最好的解决方案是安装npm软件包spider-script :
npm install -g spider-script
这还将安装Traceur,PEG.js和其他一系列依赖项。 使用Traceur的主要缺点是附加的运行时依赖项。
在这一点上,我们有机会获得蜘蛛编译器,这就是所谓spider
。 默认情况下,编译器在不打磁盘的情况下以ES5模式编译和运行代码。 但是,有多个选项可以更改该行为,并使用可选的源映射来写入输出文件。
简短的演示
我不希望您停留在理论上,而是希望您通过创建一个小型演示应用程序来对Spider进行一些练习。 我们的目标是尽可能多地使用Spider的功能。 除此之外,该演示还应该很有趣,因此我们将创建一个简单的游戏。 通过创建此项目,您还可以浏览Spider惊人的继承功能。
基本概念
我们将创建一个简单的太空射击游戏,其中将我们的飞船描绘为三角形,而对手则表示为圆圈。 任何碰撞都将导致玩家的歼灭。 将使用带有2D绘图上下文HTML5画布来绘制游戏。
我们不会专注于图形,因为我们的注意力和兴趣应该集中在代码上。 我们将创建一个名为构造函数GameObject()
这也将是prototype
的构造函数的PlayerShip()
和Asteroid()
对象game
将聚合game
所有对象。
首先,您需要下载一些游戏资源。 我们需要一个漂亮的背景图片,并在发生碰撞时播放声音。 通过键盘上的箭头键控制游戏。
在Spider中实施
每个游戏都需要一种资源加载器。 如果通过网络加载资源,则需求会更高。 以下方法封装了从promise中从给定URL加载图像的过程:
fn loadImage(url) {
return new Promise(fn (fulfill, reject) {
var img = document.createElement('img');
img.src = url;
img.onload = () -> {
fulfill(img);
};
img.onerror = () -> {
reject(img);
};
});
}
有趣的是,我们可以在启动例程中简单地使用它,就像处理经典的顺序代码一样:
background.image = await loadImage('http://i.ytimg.com/vi/qbzFSfWwp-w/maxresdefault.jpg');
background
对象是一种特殊的虚拟游戏对象。 构造函数使用GameObject
作为其原型:
fn Background(game)
extends GameObject(game) {
this.draw = () => {
if this.image? {
var ctx = this.game.ctx;
var img = this.image;
var w = ctx.canvas.width;
var h = ctx.canvas.height;
ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, -0.5 * w, -0.5 * h, w, h);
}
};
}
我们不需要直接指定prototype
。 我们必须表达我们的基本意图,即用一种更加专门的功能扩展GameObject
构造函数。
游戏还包含其他伪对象。 例如,我们可能有一个小行星发生器。 内联循环和范围等功能在这里派上用场。 我们只想在随机时间和随机位置创建一个小行星。
可以在一行中获得三个随机数(此处称为a
, b
和c
):
fn AsteroidGenerator(game)
extends GameObject(game) {
this.move = () => {
if Math.random() > 0.95 {
var [a, b, c] = [Math.random() for i in [1..3]];
// ...
game.items <- new Asteroid(game, location, velocity, radius);
}
};
}
最后,我们还将聘请诸如简单的Point
构造函数之类的助手。 例如,我们总是可以为任何参数设置默认值。 这将减少仅检查undefined
并应用默认值的样板代码:
fn Point(x = 0, y = 0) {
this.x = x;
this.y = y;
// ...
this.dist = (that) => {
return Math.sqrt(Math.pow(this.x - that.x, 2) + Math.pow(this.y - that.y, 2));
};
}
可以在html5.florian-rappl.de/Spider/中查看完成的演示应用程序。 原始源代码可通过GitHub访问 。
关键观察
让我们回顾一下我们在操作中看到的功能:
-
async
并await
解决回调地狱 - 原型继承变得更简单
- 速记方法名称使代码更优雅
- 在许多情况下,范围都很棒
- 默认值很有用
- 整体代码更容易阅读
我认为,阅读Spider代码对您而言并不陌生或不陌生。 实际上,事实证明,这似乎是JavaScript的自然扩展,而不是新的语言。
结论
Spider附带了一些方便的新功能,也为表格带来了一定的一致性。 它包含JavaScript的动态性质,而不是与之抗争。 当其他语言尝试通过引入编译时功能来解决错误时,Spider建立在改进的语言规范的基础上。 许多错误肯定会永远消失。
在本文中,我们已经看到了Spider的一些独特卖点。 我们还构建了一个非常小的示例应用程序,它利用了Spider的新功能。 Spider所提供的功能比我在本文中介绍的要多得多。 因此,我建议您查看spiderlang.org上的官方文档。
您对Spider的看法如何? 它是否具有一些吸引人的功能,或者您对当前的工作流程完全满意?
翻译自: https://www.sitepoint.com/spider-exciting-alternative-javascript/
spider