小编Pat*_*rts的帖子

在这种情况下,扩展原型链如何提高性能?

我有一个长期的假设,即深prototype链会导致物业访问者的性能下降.我试图解释一下隐藏吸气器或添加原型对象时,快速基准测试结果导致了与我期望的相反的结果.

这里发生了什么?我是否遗漏了一些明显的东西,或者这是否彻底证明了我(和其他人)关于prototype链条上属性访问者性能的假设是错误的?

建立

const object1 = {
  foo: 'Hello, World!',
  get bar () { return this.foo }
};

const object2 = Object.assign(Object.create({
  get bar () { return this.foo }
}), {
  foo: 'Hello, World!'
});

let result;
Run Code Online (Sandbox Code Playgroud)

测试1

(控制,没有prototype)

result = object1.bar;
Run Code Online (Sandbox Code Playgroud)

测试2

(实验,用prototype)

result = object2.bar;
Run Code Online (Sandbox Code Playgroud)

结果

测试1比测试2慢了92.85%,这意味着放置get bar () {}prototype链中而不是在对象自己的属性中导致属性访问器的速度增加14倍.请参阅Object.create()了解对象的布局是如何不同的.

测试1

79,323,722 ops/s±0.34%

测试2

1,108,762,737 ops/s±0.15%

使用谷歌浏览器63.0.3239.132(官方版本)(64位)在Windows …

javascript getter optimization performance prototype

9
推荐指数
1
解决办法
204
查看次数

如何在节点 REPL 中重新定义 const?

我需要在 Node REPL 中重新定义 const,因为我想重新运行历史记录中的一些函数。我收到此错误:

Uncaught SyntaxError: Identifier '_tareas' has already been declared
Run Code Online (Sandbox Code Playgroud)

有没有办法重新定义这个常量,而不必关闭 REPL 并再次打开它?

javascript node.js read-eval-print-loop

9
推荐指数
0
解决办法
1177
查看次数

符号:隐式字符串转换如何在JavaScript中工作?

阅读SymbolJavaScript中的文档,并在几个环境(Chrome,Firefox,Node.js)中进行测试,我意识到我对隐式字符串转换的理解是有缺陷的.

我总是认为toString()在尝试转换为字符串时调用了对象的方法,并且如果该函数没有返回基元,那么它调用了对象的toPrimitive()方法,如果这不起作用,则会输入错误.但是,这个解释无法涵盖TypeError那个Symbol:

var sym = Symbol("test");

try {
  console.log(sym + "ing");
} catch (error) {
  console.error(error);
}
Run Code Online (Sandbox Code Playgroud)

TypeError: Cannot convert a Symbol value to a string
Run Code Online (Sandbox Code Playgroud)

但很明显,Symbols有一个有效的toString()方法.那为什么不叫呢?

javascript type-conversion ecmascript-6

8
推荐指数
1
解决办法
347
查看次数

Array(n)和[... Array(n)]之间的区别

为什么下面的代码中map()输出有区别?

var y = [1,2,2,1];

var t = y.map(ind => [...Array(ind)].map((_,i) => ind+""+i));
// This makes [ [ '10' ], [ '20', '21' ], [ '20', '21' ], [ '10' ] ]

var t1 = y.map(ind => Array(ind).map((_,i) => ind+""+i));
//[ [ <1 empty item> ], [ <2 empty items> ], [ <2 empty items> ], [ <1 empty item> ] ]
Run Code Online (Sandbox Code Playgroud)

javascript arrays spread-syntax map-function

8
推荐指数
1
解决办法
94
查看次数

如何添加polyfill以支持Edge中的finally()?

我正在使用axios库并使用then(),catch()和finally().在Chrome中完美运行.但是finally()方法在MS Edge中不起作用.我研究过使用polyfills或垫片,我迷路了.我没有使用webpack或转换,也不打算添加它们.我需要保持这个简单.如何添加polyfill以确保finally()在Edge中有效?谢谢!

javascript finally promise polyfills

8
推荐指数
1
解决办法
1805
查看次数

如何在 Typescript 中编写单元测试?

我是软件测试的新手,我想知道如何在 Typescript 中编写单元测试。

我知道一些关于测试的知识,你有类似的方法Asser或者assertEquals但是如何在 Typescript 中做到这一点,我是否需要注意静态类型的类?

我想对这个功能进行单元测试

function calculateAverage(...numbers: number[]): number {
     let sum = 0
     for (var n in numbers) {
         sum += n
     }
     return sum/numbers.length
}
Run Code Online (Sandbox Code Playgroud)

那么我应该使用什么框架来生成一些看起来像这样的测试:

assertEquals(calculateAverage(1,2,3), 2) // 实际和预期结果

任何人都有关于使用什么单元测试框架的建议?

frameworks unit-testing typescript

8
推荐指数
1
解决办法
2万
查看次数

如何提交html5 canvas作为表单帖子的一部分?

我正在寻找将图像数据从canvas标签流式传输到node.js服务器.我自己可以处理服务器端代码,但是如何从画布提交数据呢?我希望有一个涉及多部分表单数据的建议,因为我想要流式传输数据,因为我期待大约50 MB左右的图像.如果我尝试一次性发布数据,则会导致客户端的浏览器崩溃.

javascript html5 canvas stream node.js

7
推荐指数
1
解决办法
5672
查看次数

生成升序2 ^ p*3 ^ q

我有兴趣实现一个我读过的特定的Shellsort方法,它具有与bitonic排序相同的时间复杂度.然而,对于任何整数p和q,它要求间隙序列是满足表达式2 ^ p*3 ^ q的数字序列[1,N-1].在外行人的术语中,该范围内的所有数字只能被2和3整除一次.是否有相对有效的方法来生成此序列?

sorting algorithm math

7
推荐指数
2
解决办法
3414
查看次数

Javascript如何使用destructuring将promise.spread语法迁移到async/await

我正在清理一些sequelize代码,findOrCreate函数返回一个需要传播以获取实际结果对象的promise.

我想改写我的代码来await代替使用,并且,鉴于ES6支持数组解构,我认为不是

User.findOrCreate({ where: { mcId }, defaults }).spread((user, created) => {
  // do stuff
})
Run Code Online (Sandbox Code Playgroud)

我能做到的

const [user, created] = await User.findOrCreate({ where: { mcId }, defaults })
Run Code Online (Sandbox Code Playgroud)

但唉,事实并非如此.

我收到了错误 (intermediate value) is not iterable

这样做有什么特别的伎俩,或者我想做的事情是不可能的?

javascript promise async-await spread-syntax

7
推荐指数
1
解决办法
2063
查看次数

在生成器上使用扩展语法时为什么不检索返回值

我期望 4 成为序列数组的一部分,为什么它被跳过了?

function* generate() {
  yield 1;
  yield 2;
  yield 3;
  return 4
}
let sequence = [...generate()];
console.log(sequence); // 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

javascript functional-programming generator ecmascript-6 spread-syntax

7
推荐指数
1
解决办法
110
查看次数