Introduction of ECMAScript 2017 Language Specification

原文 https://www.ecma-international.org/ecma-262/8.0/index.html 中英对照 This Ecma Standard defines the ECMAScript 2017 Language. It is the eighth edition of the ECMAScript Language Specification. Since publication of the first edition in 1997, ECMAScript has grown to be one of the world's most widely used general-purpose…

React缓冲池的性能抖动

上上周在进行团队分享时,有人提出了对React缓冲池性能的质疑。 起初我坚持认为,空间换时间,缓冲池对性能肯定是有提升效果的,但通过几组对照实验,发现缓冲池在一定情况下,的确有一定的性能提升,但当数据规模增大时,不但不会提升性能,反而会更加慢。 细想一下,还是能想明白,缓冲池本身的适用情景,频繁需要使用某种对象,但是是循环利用的情况。比如运行阶段一共需要用到10000次某种类的实例,缓冲池大小满足峰值需要,假设峰值为100,同时尽可能的串行请求该对象,避免新的内存申请。这种情况下,由于极大的复用了现有的内存对象,理论上讲肯定是有性能提升的。但实际项目中这样的情况或许并不多,所以不见得能体现出缓冲池的提升效果。 而更有甚者,某些情况下,还可能导致缓冲池性能抖动,我总结了一下,大概有以下几种: 缓冲池poolSize设置过小,而同一时刻需要用到的实例数很多。比如缓冲池大小只有10,而同时需要的实例数量为10000,这时缓冲池形同虚设 js虚拟机在内存管理时做了一定的优化,导致大量创建实例的开销下降,反而优于使用缓冲池的情况。一般来说,对象创建之后随机销毁,这样的测试例子达到一定规模时,时间开销就会小于使用了缓冲池的情况 缓冲池对象的Pooler过程开销较大,甚至超过了new的开销 不能迷信过去的知识,时代在变化,js的执行引擎越来越牛逼了。…

Promise应用题

题目 今天遇到一道很有趣的题目,考察对于Promise的使用。题目是这样的,现在有一个函数requestData,接受id数组,并返回一个Promise对象(注:假设该函数会自动去除数组中的重复id)。这个函数有可能会被若干个模块在短时间内调用,如果几次调用的时间间隔不超过100毫秒的情况下,就将这几个调用合并成一个请求发送给服务器。现在要求实现这个函数getData(id),它返回一个Promise对象,可以实现以下调用结果 getData(1).then(function (data){console.log(data)}); setTimeout(function (){ getData(2).then(function (data){console.log(data)}); }, 70); setTimeout(function (){ getData(3).then(function (data){console.log(data)}); }, 90); setTimeout(function (){ getData(4)…

typeof和Object.prototype.toString

typeof是javascript中的运算符,不是函数,typeof会给出某个对象的类型字符串。下表给出了不同类型的typeof结果 参见数据类型的typeof结果 typeof 结果 true/false "boolean" 12.00/NaN "number" hello world "string" {a:10}"object" [ ]"object" /.*/"object" null "object" undefined "undefined" function(){} "function" 从上表可以发现一个问题,typeof对于null会返回object,而通常程序中对null都会有不同的处理,无法将null和object区分开。数组也不能从object中区分开。 为了更灵活的处理不同的数据类型,很多第三方库都会寻找typeof的替代方案,就是使用Object.prototype.toString方法,它会返回"[object xxxx]"形式的字符串,其中xxxx会包含更加详细的类型信息,以jquery为例,$.type的定义如下 // map用途 class2type = {}; // 生成map的键值对…

+variable、!!variable、~~variable等写法

javascript中有很多灵活的代码写法,比较常见的有+variable、!!variable、~~variable +variable 最早是在jQuery的源代码中看到的, !( +owner.nodeType ),思来想去,这种写法应该是尝试尽可能的将变量转化成数值,近乎相当于执行了0+variable(variable为字符串时,0+str将执行拼接,+str并不会这样)。下表给出了各种类型的变量执行+variable之后的结果情况。 不同类型变量variable执行+variable之后的结果 +variable结果 +null0 +undefinedNaN +new Date()variable.getTime() +true1 +false0 +/\w/iNaN +"some val"==NaN== +{ }NaN +function(){}NaN +[ ]0 +[undefined]0 +[undefined,undefined]==NaN== +[0,0]==NaN== +[ [ ] ]==0== +[[100]]==100=…

use strict开启严格模式

ECMAScript 5的严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个子集:它在语义上与正常代码有着明显的差异。[1] 启用方式 想启用严格模式,只需要执行如下代码即可 "use strict"; // ...更多代码 严格模式可以应用到一个script标签内或者单独的函数中,它必须位于所有其他代码之前,否则将不能启用严格模式,因此如果前端js代码进行过多文件合并,如果直接将js文件互相合并,有可能导致'use strict';不在第一行了,从而失去了作用。因此,最好的做法是尽量在一个函数内部(第一行)执行'use strict',这样既可以避免影响其他不需要在严格模式下执行的代码,也不会导致文件合并后,'use strict'没有在首行执行。 启用效果 保留关键字不可作为变量名,包括implements, interface, let, package, private, protected, public, static和yield。 函数声明只能在函数中或者脚本中,其他地方无法再进行函数声明。不过,下面的代码在Chrome中并不会报错,但仍然不建议这样使用。 var test = function(){ 'use strict'; function…