在ECMAScript 6中添加的rest参数的用途是什么?
例如,在ECMAScript 5中,您可以执行以下操作以从第二个元素开始获取参数数组:
// ES 5
store('Joe', 'money');
store('Jane', 'letters', 'certificates');
function store(name) {
var items = [].slice.call(arguments, 1); //['money'] in first case
items.forEach(function (item) {
vault.customer[name].push(item);
});
}
Run Code Online (Sandbox Code Playgroud)
这将等同于ECMAScript 6中的以下代码:
// ES 6
store('Joe', 'money');
store('Jane', 'letters', 'certificates');
function store(name, ...items) {
items.forEach(function (item) {
vault.customer[name].push(items)
});
}
Run Code Online (Sandbox Code Playgroud)
它们之间的区别仅仅是语法还是存在性能问题?
也适用于传播运营商(...)
//in ecmascript5
var max = Math.max.apply(null, [14, 3, 77]);
//but in ecmascript6
var max = Math.max(...[14, 3, 77]);
Run Code Online (Sandbox Code Playgroud)
这只是语法更改还是性能问题?
如何将objects/dict(?)属性传播到新的object/dict中?
简单的Javascript:
const obj = {x: '2', y: '1'}
const thing = {...obj, x: '1'}
// thing = {x: '1', y: 1}
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
regions = []
for doc in locations_addresses['documents']:
regions.append(
{
**doc, # this will not work
'lat': '1234',
'lng': '1234',
}
)
return json.dumps({'regions': regions, 'offices': []})
Run Code Online (Sandbox Code Playgroud) TS 抛出奇怪的错误:
错误:(125, 18) TS2569:类型“字符串”不是数组类型或字符串类型。使用编译器选项“--downlevelIteration”来允许迭代器迭代。
为什么字符串不是字符串?
我想看看 TS 将如何为字符串编译扩展运算符。
我在浏览器控制台中的代码。一个字符串被分解成字符:
> s = 'abcdef';
> r = [...s];
< (6) ["a", "b", "c", "d", "e", "f"]
Run Code Online (Sandbox Code Playgroud)
我在 TS 中的代码:
const s: string = 'abcdef';
const res = [...s]; // <= Error: Type 'string' is not an array type or a string type
console.log(res);
Run Code Online (Sandbox Code Playgroud)
为什么?
TS版本:
"dependencies": {
"typescript": "^3.5.3"
}
Run Code Online (Sandbox Code Playgroud)
更新:
更新:
我的 tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"downlevelIteration": false,
"allowJs": …Run Code Online (Sandbox Code Playgroud) 每当你想使用来自Vuex的mapGetter助手的计算getter时,你会像这样使用它:
...mapGetters([
'getter1',
'getter2',
'etc'
])
Run Code Online (Sandbox Code Playgroud)
我已经看到之前使用的扩展运算符扩展数组以用作函数参数,但不是在我们在这里看到的mapGetters示例方法之前.
在查看mozilla文档时,我无法找到这种语法的示例:
https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Operators/Spread_operator
什么都没有.这种语法究竟是如何起作用的?这种情况可能会有人提供一些关于此的文档吗?
我试图了解以下方法中扩展语法与切片方法之间的区别.
假设我想制作一个数组的实际副本,我可以使用扩展语法轻松地做到这一点
var fruits = ["Banana", "Chips" , "Orange", "Lemon", "Apple", "Mango"]
var newCitrus = [...fruits]
Run Code Online (Sandbox Code Playgroud)
如果我console.log这个
["Banana", "Chips", "Orange", "Lemon", "Apple", "Mango"]
Run Code Online (Sandbox Code Playgroud)
但我也可以使用切片方法创建一个数组的副本.考虑到上面的相同数组,如果我做这样的事情......
var citrus = fruits.slice(0);
Run Code Online (Sandbox Code Playgroud)
然后控制台记录它,它将给我完全相同的数组,我将通过传播语法
["Banana", "Chips", "Orange", "Lemon", "Apple", "Mango"]
Run Code Online (Sandbox Code Playgroud)
由于它们都需要大约相同的时间来编码/写入,这有什么区别?我通常应该选择哪种方法?
ES6引入了一系列方便的"语法糖".其中包括JavaScript函数的默认参数功能以及rest参数.每当试图在rest参数上设置默认参数值时,我发现我的控制台(或devTools)会抱怨(即抛出错误).我发现在其他地方很少引用这个特定的问题,我想知道是否1.)它可以这样做2.)为什么不(假设它不可能).
作为一个例子,我设计了一个微不足道的(但希望仍然有目的)的例子.在函数的第一次迭代中,我构造了函数,使其可以工作(也就是说,不给rest参数一个默认值).
const describePerson = (name, ...traits) => `Hi, ${name}! You are ${traits.join(', ')}`;
describePerson('John Doe', 'the prototypical placeholder person');
// => "Hi, John Doe! You are the prototypical placeholder person"
Run Code Online (Sandbox Code Playgroud)
但是,现在使用默认值:
const describePerson = (name, ...traits = ['a nondescript individual']) => `Hi, ${name}! You are ${traits.join(', ')}`;
describePerson('John Doe');
// => Uncaught SyntaxError: Unexpected token =
Run Code Online (Sandbox Code Playgroud)
任何帮助是极大的赞赏.
我正在尝试转换这样的数据结构:
data = {
0:{A:a},
1:{B:b},
2:{C:c},
}
Run Code Online (Sandbox Code Playgroud)
进入这样的结构:
[
{0:{A:a}},
{1:{B:b}},
{2:{C:c}},
]
Run Code Online (Sandbox Code Playgroud)
像这样使用spread运算符:[...data]返回任何空数组.
我也试过了 [{...data}]
有没有办法使用扩展运算符来获得所需的结果?另外,为什么这种方法不起作用?
我发现自己有很多这种模式.我有一个从api返回的对象数组,我需要操作所有对象中的一个属性.
有没有办法使用ES6/Babel或Typescript来使该模式更具说明性?
寻找一些整齐的解构技巧或类似的东西.
const data = [{ foo: 1, bar: 2},
{ foo: 2, bar: 3},
{ foo: 3, bar: 4}];
const increment = a => a + 1;
// Here is my typical pattern
const result = data.map(o => {
o.foo = increment(o.foo);
return o;
})
console.log(result);Run Code Online (Sandbox Code Playgroud)
我需要从作为ReactComponent 状态的数组中删除一个元素.这意味着它是一个不可变的对象.
使用扩展语法很容易添加元素.
return {
...state,
locations: [...state.locations, {}]
};
Run Code Online (Sandbox Code Playgroud)
删除有点棘手.我需要使用一个中间对象.
var l = [...state.locations]
l.splice(index, 1)
return {
...state,
locations: l
}
Run Code Online (Sandbox Code Playgroud)
它使代码更加污垢和难以理解.
创建一个从中删除元素的新数组是否更容易或更简单?
spread-syntax ×10
javascript ×9
ecmascript-6 ×6
object ×3
arrays ×2
ecmascript-5 ×1
immutability ×1
python ×1
reactjs ×1
slice ×1
typescript ×1
vue.js ×1
vuex ×1