使用Chrome控制台,这是我的输入和输出:
[0].map(Array);
[[0, 0, [0]]]; // output
这里发生了什么?
修改
这让我好奇的原因是因为像
这样的东西[0].map(String);
将返回
["0"];
而不是
["0", "0", "String"]
答案 0 :(得分:123)
.map()
function使用三个参数调用Array()
函数,数组元素的值为0
,该元素的索引也是0
,以及对整个数组的引用。
所以这样做:
var a = [0];
var index = 0
Array(a[index], index, a); // create array with three elements
Array()
返回的数组然后成为.map()
创建的数组的第一个元素,因此[[0, 0, [0]]]
结果中的嵌套级别更高。
关于您的修改的编辑:当您说[0].map(String);
导致使用相同的三个参数(例如String()
)调用String(a[index], index, a)
时,String()
函数会忽略除Array()
以外的所有参数第一个参数,而createRegularPolygon
使用所有提供的参数。
答案 1 :(得分:39)
首先,map
可用作创建数组的函数:
[0].map(Array);

其次,[Array(0, 0, [0])]; // the element 0 in the original array will be mapped into Array(0, 0, [0])
将三个参数传递给它的回调:元素,它来自数组的索引和数组本身。
所以,因为你的数组包含一个元素,行:
NTSTATUS CreateKey(PHANDLE KeyHandle, ACCESS_MASK DesiredAccess, PWCHAR RegSidPath, PWCHAR KeyToCreate, PULONG Disposition)
{
UNICODE_STRING ObjectName;
RtlInitUnicodeString(&ObjectName, RegSidPath);
OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, &ObjectName ,OBJ_CASE_INSENSITIVE };
NTSTATUS status = ZwOpenKey(&oa.RootDirectory, KEY_CREATE_SUB_KEY, &oa);
if (0 <= status)
{
ObjectName.Buffer = KeyToCreate;
do
{
ACCESS_MASK Access;
if (KeyToCreate = wcschr(++ObjectName.Buffer, '\\'))
{
ObjectName.Length = (USHORT)RtlPointerToOffset(ObjectName.Buffer, KeyToCreate);
Access = KEY_CREATE_SUB_KEY;
}
else
{
ObjectName.Length = (USHORT)wcslen(ObjectName.Buffer) * sizeof(WCHAR);
Access = DesiredAccess;
}
ObjectName.MaximumLength = ObjectName.Length;
status = ZwCreateKey(KeyHandle, Access, &oa, 0, 0, 0, Disposition);
NtClose(oa.RootDirectory);
oa.RootDirectory = *KeyHandle;
} while (0 <= status && (ObjectName.Buffer = KeyToCreate));
}
return status;
}
相当于:
HANDLE hKey;
NTSTATUS status = CreateKey(&hKey, KEY_ALL_ACCESS,
L"\\REGISTRY\\USER\\S-***",
L"\\Software\\MyCompany\\MySoftware\\MySubKey", 0);
答案 2 :(得分:6)
更新问题后。其他答案为您提供有关map
的信息要回答数组和字符串不同的原因,请查看构造函数
字符串构造函数接受1个参数String(thing)而数组new Array(element0, element1[, ...[, elementN]])
答案 3 :(得分:4)
此次电话
[0].map(Array);
给出了与写下这样的内容相同的结果:
[0].map(function (value, index, array) {
return Array(value, index, array);
})
Map函数使用三个参数调用Array函数:元素的值,元素的索引和整个数组。对Array
的调用会返回包含3个元素的数组:value(number 0
),index(number 0
),整数组([0]
)。
这个新数组包含在原始数组中,因为你将原始元素(数字0
)加到新元素(3个元素的数组)
注意:您可能习惯于仅使用第一个参数,如
array.map(function (a) { return a * a; });
或仅使用两个来获得索引
array.map(function (item, index) { return "index=" + index + ", value=" + item; });
但你需要记住,map
仍然提供3个参数,你只需在回调函数中忽略它们。这也是代码如下的原因:
[0].map(String);
返回
["0"]
这是因为String功能只关心第一个参数并忽略其他传递的参数。 如果你打电话
String(11, "Some", "other", "ignored", "parameters")
你仍然会得到
"11"