Protobuf在TypeScript中的64位长整型精度问题

一直以来,在 JavaScript 中表示数值的只有 Number 这种以 64 位浮点形式存储的类型, 是不存在类似 Long 这种64位的长整形,这就会造成后端传输来的长整型数据到了前端出现精度丢失的情况: let n1 = 177777777777777777; console.log(n1) // 177777777777777800 遗憾的是在 TypeScript 中也没有 Long 这样的长整型,但是 Node.JS 中的,有许多十分优秀的 modules ,其中 long这个第三方 module 使用了一个 class ,封装了两个 32 bit 有符号 number … “Protobuf在TypeScript中的64位长整型精度问题”

Read More

用TypeScript实现对WebSocket的封装-Part-2

在驱动接口声明完成后,实现功能部分会比较繁复,需要考虑保活/断线重连/消息丢失重发/消息去重,等大部分弱网络下的问题,这是为了方便上层的调用,上层无需关心底层驱动的实现. 实现`chat-ws.ts`: “`typescript ///<reference path="./chat-ws.d.ts" /> import { IntervalTimer, ETimerEventType as ETETP } from './chat-timer'; @Injectable export class ChatWSProvider implements IChatWSProvider { construtor(){ //… } private logger: ILogger = null; private remoteAddr: string; private webSocket: … “用TypeScript实现对WebSocket的封装-Part-2”

Read More

用TypeScript实现对WebSocket的封装-Part-1

在 node.js 的第三方 module 中提供了许多优质的 WebSocket 驱动,比如 ws 和 Socket.IO,不过 TypeScript 内置库也已经实现了 WebSocket 驱动.因此可以无需添加第三方 WebSocket 库. 得益于 TypeScript 强大语法的支持,因此代码可以像编译型语言那样先对用到的类型进行声明,然后对接口实现定义. 先前项目前端使用 TypeScript,因此使用了 TypeScript 实现了WebSocket的聊天驱动.这些天来总结了项目关于聊天驱动底层的一些经验与问题,故记录下. 废话不说. 首先定义通知上层的事件回调接口,这些事件通常是收到 ws 数据或 ws 异常后触发的,因此可以按照功能分为: 登录事件回调 : type FnOnLoginCallback,来自登录成功后的事件回调声明 登出事件回调 : … “用TypeScript实现对WebSocket的封装-Part-1”

Read More

关于JS中的this

js中的this就是一个大坑,也是众所周知的一个坑. 由于this在js中晚绑定的特性,所以this可以是全局对象也可能当前对象,我擦,这简直就是一把双刃剑. 1.全局的this alert(this),这是全局的,但实际是undefined的. 2.局部函数的this function func(i){ this.i = i; } func(110); alert(i); //输出110 我了个大艹,什么时候i成了全局对象了呢?实际上应该是undefined. 3.作为对象方法的this var name = “Global”; var call = { name: “Caller”, message: function(msg){ console.log(this.name + “: ” + msg); } … “关于JS中的this”

Read More

粗看ECMAScript5新特性

哥自学JavaScript是在10年那会,记得当时看的一本叫做<<JavaScript学习指南(第2版)>>外国人写的书,中文翻译的不咋地,还有错别字,它是ECMAScript3的标准. 昨天才知道原来去年6月已经发布了最新的标准:ECMAScirpt5.一番浏览,做了小小的总结. Strict Mode 即严格模式.其新增变化如下: 未使用var创建的变量会报错 函数顶层的this不在指向window,而是undefined 强制为eval创建新作用域 禁止用delete删除变量 禁止使用arguments,callee,caller属性 禁止使用width语句 禁止函数参数重名 禁止对象属性重名 禁止使用八进制数字 不允许在非函数的代码块内声明函数 并且新增保留字: implements, interface, let, package, private, protected, public, static, yield. 哥觉得这应该是新标准中最出彩的了.这大大减少了对js代码的调试找错的时间,比如之前this指向window,但这对于v8渲染器来说是无效的,只对IE有效. Object新特性 Object.create() 创建一个具有指定原型且可选择性地包含指定属性的对象 Object.create(proto, [ propertiesObject ]) 示例: //Shape … “粗看ECMAScript5新特性”

Read More

JavaScript-使用defer属性加快页面载入

哥的博客远在美国,因此打开都要转圈转上半天,有时候页面元素都已经加载完毕,但浏览器的标签仍在转圈圈.这让哥很不爽啊.经过一番探查,发现问题所在.是百度一个JS页面统计脚本作祟啊,每打开一个页面它会给百度发送统计,但是这延迟很大啊,这已经不知道是我设置问题,还是百度的网络问题,通常去掉这个脚本也不影响页面,但是哥觉得还是有必要看看网站的统计数据的,因此发现了defer属性. defer属性可以在标签<script>中使用.作用是表示该脚本不会生成任何文档内容,因此浏览器可以优先处理页面的渲染部分,在页面结束后再来处理此脚本部分. 示例: <script type=”text/javascript” charset=”utf-8″ defer=”defer”> … </script> <script src=”/js/jquery.js” charset=”utf-8″ charset=”utf-8″ defer=”defer”>

Read More