Javascript悟道github

1+53+11 === 64

现实里没有 0 和 -0,但是 JS 使用的 IEEE754 标准里有的,JS 里做了一些手脚😎使得直接比较两者是相同的。

-0 === 0 // true

但是,最好 0 不要用来做除数,也不要使用 Object.is()

(1 / 0) === (1 / -0) // false Object.is(0, -0); // false

Number

JS 内置很多不可变的 number 对象,每个数值字面量实质是对这些不可变 number 对象的引用。字面量值与 number 对象值很接近或者完全吻合。
Number 挂载了一些有用的常量。
Number.EPSILON 保存的是最小的正数。当两数之差小于此数,JS 可以认为两数相等。
比如这个经典场景:

0.1 + 0.2 - 0.3 // 5.551115123125783e-17 0.1 + 0.2 - 0.3 < Number.EPSILON // true

Number.MAX_SAFE_INTEGER 约 9000 万亿,就是 2 ** 53 - 1 打印的结果。
同理,Number.MIN_SAFE_INTEGER 是 - (2 ** 53 - 1)。
** 在一个期望为整数的运算中,只有所有参与运算的因子,运算结果,中间结果都是在安全整数范围内时,才可以进行精确的整数运算。**Number.isSafeInteger 可以判断是否是安全的整数。

Number.MAX_VALUE 是 JS 的 Number 类型中最大的值,等于 Number.MAX_SAFE_INTEGER * 2 ** 971,其精度损失很大。
Number.MIN_VALUE 是 JS 中无限逼近 0 的数,值是 2 ** -1074,其精度损失很大。

运算符

取余运算 % 取决于被除数,取模运算(JS 不支持)取决于除数。

位运算符

JS 做位运算时,有个坑:参与位运算的 number 类型会被转换为 32 位有符号整型(Java 的 int)进行计算,在得到计算结果后,再转换为 JS 的数值类型。虽然 JS 有 54 位安全整数,但是参与位运算时最高的 22 个位会被丢掉,没有任何警告信息。
所以,当你想用左移和右移代替乘除时,要注意这个坑。
当对负数进行右移时,使用带符号的右移 >> 而不是 >>>

-2 >> 1 // -1 -2 >>> 1 // 2147483647

解析 Number 的函数

function deconstruct(number) { // 数值 = 符号位 * 系数 * (2 ** 指数) let sign = 1; // 符号位 let coefficient = number; // 系数 let exponent = 0; // 2 ** 指数 if (coefficient < 0) { coefficient = -coefficient; sign = -1; } if (Number.isFinite(number) && number !== 0) { exponent = -1128; let reduction = coefficient; // 系数不断除 2, 直到趋近于 0 为止, 将除 2 次数与 - 1128 相加, 结果即变量 exp 的值 while (reduction !== 0) { exponent += 1; reduction /= 2; } reduction = exponent; // 当指数为 0 时, 可以认为这个值是整数了. while (reduction > 0) { coefficient /= 2; reduction -= 1; } while (reduction < 0) { coefficient *= 2; reduction += 1; } return { sign, coefficient, exponent, number } } }

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论。

道格拉斯新作《JavaScript悟道》上市以来,深受读者喜爱。译者死月(朱凯迪)在翻译道格拉斯这本书的过程中,加入了很多自己的思考,让这本书的内容更加传神、丰满,也展现出了 JavaScript 的“道”。

本文选自该书的译者序,记录了死月老师翻译这本书时的一些思考,希望能给大家带去有关 JavaScript 的新的理解。【文末福利】

少小摘得即为通,而立手作毋自明。

夏虫度伏难度九,阡陌知雨不知春。

道爷虽道是语精,听者但听须首灵。

泱泱巧匠阅此序,清人自清迷人迷。

这是我的编程之路启蒙读物。

我从 2002 年开始接触 JavaScript。那个时候我尚在读小学,接触的途径是流传在商店里的各种名为《网页特效大宝库》之类的光盘。当时,我只会在 FrontPage 中写 HTML,并不懂 JavaScript,代码都是从“大宝库”中复制粘贴的。从此,这些炫酷的鼠标跟随特效、下雪特效就在我心中种下了一颗不知名的种子。

之后 5 年,我在捣鼓 ASP。这段时间里的 JavaScript 也还在“缝缝补补”。我真正开始使用 JavaScript 写代码是在 2007 年,在 jQuery 发布一段时间之后。也正是因为 jQuery,我至今对于原生的 Web API 并不那么熟悉,接触并知道 ECMAScript 规范也是在 2013 年前后,所以说我是一个“野路子 JavaScripter”一点儿也不错。

JavaScript 从 1995 年面世以来持续高速发展,尤其在近几年爆炸式地发展。道格拉斯在 2008 年写了第 1 版的《JavaScript 语言精粹》,经过赵泽欣(小马)和鄢学鹍(三七)前辈们的翻译,几乎成了现如今 JavaScript 从业者的必读之物之一。

作为一个后端工程师,我很高兴 Node.js 的出现让 JavaScript 的发展之路与我有了交集。JavaScript 以它独特的魅力成了一门随处可见的语言,甚至早在 2008 年就有工程师杰夫·阿特伍德提出了阿特伍德定律:

任何可以使用 JavaScript 来编写的应用,最终都会由 JavaScript 编写。

虽然可以把阿特伍德定律看成一段调侃,但它也体现了 JavaScript 的便捷、易用与流行。

诚然,JavaScript 并不完美,《JavaScript 语言精粹》的厚度也远不及《JavaScript 高级程序设计》的厚度,但这些问题仍无法阻止 JavaScript 成为现如今的热门语言之一。道格拉斯深知这一点,所以他痛恨并深爱着 JavaScript 这门语言,用渊博的知识与幽默的文笔“骂骂咧咧”地写完了本书。

刚接到本书的翻译工作时,我是惴惴不安的,生怕翻译不出它的神韵。好在最后我还是勉强完成了,虽不完美,但尽了我最大的努力去保持本书的原汁原味。而且在翻译的过程中,我得到了很多提升,也知道了挺多奇闻轶事。例如,JSON 是在奇普·莫宁斯达家后方的一间棚子中被发现的;又如,爱迪生发明的留声机原型在唱针每转一圈时就会发出一声怪音;再如,曼哈顿大街上的洛克希剧院最开始是以接待员统一的裤子为噱头的;还有,最初的罗马历一年只有 10 个月,剩下的日子全叫“冬季”。

道格拉斯自身也非常有特色,对于认定的理儿非常执着,特立独行。他坚持认为 one 应该按照发音写作 wun,并且在整本书中都是这样做的。受其感染,我也尽可能地为一些单词想出了特立独行的翻译,即使它们可能已经有约定俗成的中文翻译了。例如,我会将 truthy 翻译为“幻真”,falsy 翻译成“幻假”,是不是很梦幻呢?

除了奇闻轶事、特立独行,书中还有挺多值得品味的 JavaScript 干货和吐槽。道格拉斯帮我们复习了 JavaScript 中数值的一些原理(IEEE 754),并引申出了高精度数值的思想;介绍了各种 JavaScript 类型背后的思想,如几种基本类型、对象、函数等;还讲了 JSON 等背后的小故事。道格拉斯写本书的用心不止于此,他还介绍了 JavaScript 语言层面之外的一些内容,涉及计算机科学和软件工程中的各个领域,如测试、优化和编程语言等。最后,他还不忘再次回归点题,调侃 JavaScript 一番。

至于吐槽,的确充满了道格拉斯的个人主观色彩。如果对于一些观点有强烈认同感,大家一定会产生共鸣;而如果一些观点与你的不一致,大可一笑置之。甚至在本书翻译的时候,贺师俊(Hax)前辈还开玩笑地说:

孔子作春秋,大义微言,所以需要注释来阐发。道格拉斯过于言简意赅,以至于大家不清楚他到底站在哪边。你尽量不要加注,保持原汁原味,然后单独出个评注版。你自己、我,然后再找一个人,可以凑成三家注了。

如果真的可以,我其实很乐意做这么一件事,颇有“易中天品三国”的味道。

总之,本书非常有意思,我自己在翻译的时候就有这种感觉。更多的信息还是等大家自己来发现吧,相信你们不会失望的。

最后,我非常感谢 JavaScript 这门神奇的语言,感谢 Node.js 这个运行时让我有机会深入接触 JavaScript。感谢给本书中文版写推荐语的同行们,感谢在计算机之路上给我启蒙的王震老师。感谢我的妻子,她的支持是对我最大的鼓励,如果不是她,本书的问世也许会更晚。感谢我的父母在我的背后默默支持我的事业。从我小时候起,他们就一直支持我的梦想,这才让我能在编程领域一路走下来。最后,感谢图灵公司的岳新欣女士约我翻译本书,感谢本书的编辑谢婷婷和杨琳在翻译中的帮助。

《JavaScript悟道》

道格拉斯·克罗克福德  著

死月(朱凯迪)译

本书结合当前JavaScript语言现状,深入剖析了JavaScript语言的运行原理、应该如何演进、怎样才能将其发挥至极致。这些深邃、极具前瞻性的论述不仅适用于JavaScript,也适合其他语言。学习、理解、实践大师的思想,能让开发者站在巨人的肩上,看得更全面。

文末福利

正在读或者已经读过这本书的小伙伴,欢迎来给大家分享一下你读完这本书的感受。还没读过的伙伴们,可以说说书中的哪些内容让你感兴趣。

我们将在精选留言中选出 5 位,获得死月老师限量签名版图书一本。截至 2021.8.10。

Toplist

最新的帖子

標籤