为什么让[] .map用大括号改变它的工作方式?

时间:2017-01-19 13:26:02

标签: javascript

所以,基本上我有这个:

Array.prototype.toString = function() {
    return ("[" + this.map(thing => thing = '"' + thing + '"').join(', ') + "]")
}

我打电话的时候:

['foo', 'bar'].toString()

返回

  

“[”foo“,”bar“]”

现在,这将完美地运作。这个(带有花括号)似乎不像我想要的那样工作:

Array.prototype.toString = function() {
    return ("[" + this.map(thing => {thing = '"' + thing + '"'}).join(', ') + "]")
}

然后它返回:

  

[,]

有人可以告诉我区别吗?我不知道为什么[] .map的工作原理如下。

4 个答案:

答案 0 :(得分:2)

您不会在arrow function

的阻止声明中返回任何内容
() => {
    // code
    return 42; // return is required in block statment
}


() => 42 // return is implicit



Array.prototype.toString = function() {
    return ("[" + this.map(thing => { return thing = '"' + thing + '"'}).join(', ') + "]")
};

console.log(['foo', 'bar'].toString())




更短,未分配到thing



Array.prototype.toString = function() {
    return ("[" + this.map(thing => '"' + thing + '"').join(', ') + "]")
};

console.log(['foo', 'bar'].toString())




答案 1 :(得分:2)

这与数组或map方法无关。它完全取决于箭头功能的工作原理。

当您在右侧给出单个语句时,将对该语句进行评估并在函数内返回。

foo => bar

相当于:

function (foo) { return bar; }

当您在右侧放置一个块时,该块只是因为函数体。

foo => { bar }

相当于:

function (foo) { bar; }

在第二个版本中,您没有return语句,因此该函数返回undefined

如果使用块,则需要使return语句显式。

foo => { return bar; }

答案 2 :(得分:0)

没有花括号(或使用常规曲线括号),它会直接返回单个值,而花括号会执行多行代码。如果您希望此代码返回一个值,则必须在大括号内显式返回它。

答案 3 :(得分:0)

因为当您添加{}时,它会将它从纯函数式箭头函数转换为普通函数,只是它具有箭头语法。如果要从此返回值,则需要在结尾处明确写入return thing;

Array.prototype.toString = function() {
    return ("[" + this.map(thing => {thing = '"' + thing + '"'; return thing;}).join(', ') + "]")
}

纯箭头函数工作的原因是因为语句thing = '"' + thing + '"'实际返回结果,因此是函数的返回值。如果不重新分配thing

,您可以获得完全相同的结果
Array.prototype.toString = function() {
    return ("[" + this.map(thing => '"' + thing + '"').join(', ') + "]")
}