什么是.map()在这种情况下做什么?

时间:2017-09-15 00:49:25

标签: javascript

使用Chrome控制台,这是我的输入和输出:

[0].map(Array);

[[0, 0, [0]]]; // output

这里发生了什么?

修改

这让我好奇的原因是因为像

这样的东西
[0].map(String);

将返回

["0"];

而不是

["0", "0", "String"]

4 个答案:

答案 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"