在雄辩的javascript书中,在第6章中有以下示例:
class Matrix {
constructor(width, height, element = (x, y) => undefined) {
this.width = width;
this.height = height;
this.content = [];
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
this.content[y * width + x] = element(x, y);
}
}
}
//...
}
您可以看到构造函数的第三参数不仅是回调参数,而且实际上是回调的实现。
起初我认为,也许已实现的回调函数的主体被忽略了,但至少将检查构造函数中使用的未来回调以具有相同的签名。但是,我发现签名无关紧要,因为以下代码将起作用:
const test = new Matrix(2, 4, () => console.log('hello'));
那么,实现回调的意义是什么,它是函数的参数?只是让读者推断将传递多少个参数?
如果未指定第三个参数, element的默认值将是 (x, y) => undefined
。
请参阅此MDN链接。它将提供一些见识。希望这会有所帮助。
示例用element
做的是设置默认值。在这种情况下,默认值无济于事。
请注意,您还可以将()=>{}
用作元素的默认值,它将在JavaScript中起作用,因为该语言在调用函数时不会验证参数的数量(但它可能会给您带来打字条中的类型检查错误(。
这是一个常见的模式:您不使用undefined
或null
,而是放置了一个无用的默认参数,因此在代码中,您无需在调用该函数之前检查element
是否定义。请参阅:https://en.wikipedia.org/wiki/null_object_pattern
诸如lodash
之类的一些库还包括定义为EN空函数的noop
等常数,因此您可以将代码写为:
const noop = ()=>{}
class Matrix {
constructor(width, height, element = noop) {
//...
}
}
其他信息:
Matrix
构造函数似乎正在初始化单个维度Array
来存储矩阵。您可以用Array.from
替换该嵌套的for
环路。类似:
this.contents = Array.from(
{length: height * width},
n => element(n % width, Math.floor(n/height))
);
我没有检查数学,因此示例可能有索引错误。请参阅:https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/array/aray/from
我理解的方式,它只是可选的初始化器。如果您使用诸如() = > 0
之类的东西调用它,它将用0
而不是undefined
初始化矩阵。(x,y) => x === y ? 1 : 0
将产生一个身份矩阵。等....
(阅读本章后更新(这本书中的句子是
中的句子所证实的。构造函数函数具有宽度,高度和可选元素函数,用于填充初始值。
此类具有3个参数,适用于"强制"。
第三个是名为"元素"的回调函数是可选的,并且具有"(x,y(=>未定义"的默认值。因此,如果您在构建"矩阵"类的新实例时没有通过第三个参数,则将是默认的。
如果您在此处传递特定功能(例如(
let myMatrix = new Matrix(100,100,(x,y) => x * y);
在此阶段
this.content[y * width + x] = element(x, y);
它将将相应的值返回到新"矩阵"实例的" this.content"属性的各个数组插槽。
因此,您的矩阵将具有这样的"内容"属性(例如(:
myMatrix.content[0] = 0;
myMatrix.content[1] = 0;
...
myMatrix.content[101] = 1;
myMatrix.content[102] = 2;
// and so on
否则,如果创建新实例时未传递任何函数,则将分配所有生成的" this.content"属性的数组插槽,因为
的默认属性值(x,y(=>不确定