小编leo*_*fed的帖子

函数参数中的数组解构

我在这里有一些与数组解构相关的东西我还不完全理解.

在以下示例中:

function foo( [a, b, c] ) {
    console.log(a, b, c)
}

foo( 1, 2, 3 );
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我收到以下错误:

Uncaught TypeError: undefined is not a function
Run Code Online (Sandbox Code Playgroud)

现在,我并没有质疑这个事实并没有1, 2, 3像人们预期的那样输出,因为只有第一个值1实际上是destructured(a = 1[0], b = 1[1], c = 1[2]).

但事情就是这样:

我可以写得很完美,1[0], 1[1], 1[2]而且undefined每个人都能得到.

那么为什么foo我上面写的函数抛出一个异常而不是undefined像我期望的那样简单地返回3次.

事实上,如果我写bar下面的话,我会得到3 undefined应该发生的事情.

function bar() {
    console.log( 1[0], 1[1], 1[2] )
}

bar();
// undefined undefined undefined
Run Code Online (Sandbox Code Playgroud)

有人能告诉我JS在第一次做什么foo(),为什么输出不是undefined undefined …

javascript arrays function

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

回调、高阶函数、回调队列有什么区别

在这一点上,我有一个问题,什么是回调,什么使它与高阶函数不同,它与回调队列的概念有什么关系?

来自 MDN:回调函数

回调函数是作为参数传递给另一个函数的函数,然后在外部函数内部调用该函数以完成某种例程或动作。

看起来与高阶函数的定义有重叠。一个被传递(然后被调用)到另一个函数的函数。

这是回调的 MDN 示例:

function greeting(name) {
  alert('Hello ' + name);
}

function processUserInput(callback) {
  var name = prompt('Please enter your name.');
  callback(name);
}

processUserInput(greeting);
Run Code Online (Sandbox Code Playgroud)

毫无疑问,到目前为止。

然后我遇到了Event LoopCallback queue的想法。

 console.log("me first");

  setTimeout(function asyncLog() {
       console.log("i am the last")
  }, 2000);

  console.log("me second")
Run Code Online (Sandbox Code Playgroud)

原来这个seTimeout函数实际上是一个 JavaScript 包装器,它在底层与 Web 浏览器 API(计时器)交互。setTimeout 将函数 (asyncLog) 和计时器 (2000ms) 传递给计时器 API。

当计时器功能(在网页浏览器)已完成其工作,将发送功能asyncLogcallback queue准备调用堆栈尽快被调用的JS调用堆栈是:(1)空(2)已经处理一切都在全局执行上下文。

所以在处理完最后一行之后,console.log("me second") …

javascript functional-programming callback

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

for 循环中的函数生成器

我试图更好地理解生成器在 javascript 中的工作原理。

来自 MDN:

function* 声明(function 关键字后跟星号)定义一个生成器函数,该函数返回一个 Generator 对象。

function *range(from, to) {
    var counter = from;
    while(to >= counter) {
        yield counter
        counter++
    }        
}

for (var r of range(5, 10)) {
    console.log( r );
}

// print: 5, 6, 7, 8, 9, 10
Run Code Online (Sandbox Code Playgroud)

我不确定我如何准确理解上面代码片段中发生的事情。

生成器不是应该被调用、存储为(生成器)对象然后由next()方法调用吗?(如下所示)

function *foo () {
      yield 'woo';
 }
 var G = foo();
 console.log( G.next() );
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,在第 4 行,var G = foo();没有调用函数并创建新的执行上下文,这应该只返回一个生成器对象(并将其存储在标签下G)。

foo当我在第 5 行调用该方法时,我将调用实际的函数 …

javascript for-loop generator

4
推荐指数
1
解决办法
2026
查看次数

数组解构和扩展运算符

我不是 100% 清楚这段代码是如何工作的:

var a = [1, 2, 3];

[x, y, ...a ] = [0, ...a, 4];

// OUTPUT:  [0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我正在a使用...运算符解构数组。

我期待在第二行会进行一系列任务。

x将被分配为0,y将被分配给...a(其传递数组中的元素a作为单独的值)。

但是,我不清楚如何将...aget 分配给 4。实际上,JS 在执行以下操作时会抛出异常:

...a = 4;
// Uncaught SyntaxError: Rest parameter may not have a default initializer
Run Code Online (Sandbox Code Playgroud)

为什么这段代码以 end 输出修改后的数组4,而不是抛出异常?这是如何工作的?

javascript arrays destructuring

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

三个数组之间的联合

我需要找到传递给函数的三个数组的并集union

我花了大约 50 行代码来获得预期的结果。显然,以下代码有效,但现在我想知道完成相同工作的最佳方法是什么(以功能性和非功能性方式)。

function union(...arrays) {
    var array1 = arguments[0];
    var array2 = arguments[1];
    var array3 = arguments[2];      

    var unique = [];
    var intersaction = [];

    // find the unique values

    for(let i = 0; i < array1.length; i++) {
        if( (array2.includes(array1[i]) == false) && (array3.includes(array1[i])) == false ) {
            unique.push(array1[i]); 
        }
    }

    for(let i = 0; i < array2.length; i++) {
        if( (array1.includes(array2[i]) == false) && (array3.includes(array2[i])) == false ) {
            unique.push(array2[i]); 
        }
    }

    for(let i …
Run Code Online (Sandbox Code Playgroud)

javascript arrays function

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