我在这里有一些与数组解构相关的东西我还不完全理解.
在以下示例中:
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 …
在这一点上,我有一个问题,什么是回调,什么使它与高阶函数不同,它与回调队列的概念有什么关系?
来自 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 Loop和Callback 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。
当计时器功能(在网页浏览器)已完成其工作,将发送功能asyncLog在callback queue准备调用堆栈尽快被调用的JS调用堆栈是:(1)空(2)已经处理一切都在全局执行上下文。
所以在处理完最后一行之后,console.log("me second") …
我试图更好地理解生成器在 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 行调用该方法时,我将调用实际的函数 …
我不是 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,而不是抛出异常?这是如何工作的?
我需要找到传递给函数的三个数组的并集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)