标签: spread-syntax

在javascript中使用rest参数和spread运算符

在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)

这只是语法更改还是性能问题?

javascript ecmascript-5 ecmascript-6 spread-syntax

15
推荐指数
3
解决办法
8119
查看次数

如何在chrome dev工具中使用对象扩展语法

我开始使用对象扩展语法来安全地制作对象的副本,同时遵循不变性原则.

我想在chrome开发者控制台中使用它 - 如何做到这一点:

在此输入图像描述

javascript object ecmascript-6 spread-syntax

15
推荐指数
3
解决办法
4319
查看次数

在Javascript中是否有python 2.7x中的Object spread语法?

如何将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)

javascript python object spread-syntax

15
推荐指数
2
解决办法
4951
查看次数

TS 错误:类型“字符串”不是数组类型或字符串类型。字符串怎么不是字符串?

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)

更新:

@VtoCorleone 截图 在此处输入图片说明

更新:

我的 tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "downlevelIteration": false,
    "allowJs": …
Run Code Online (Sandbox Code Playgroud)

typescript spread-syntax

15
推荐指数
1
解决办法
1万
查看次数

mapGetters语法究竟如何工作?

每当你想使用来自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

什么都没有.这种语法究竟是如何起作用的?这种情况可能会有人提供一些关于此的文档吗?

javascript ecmascript-6 vue.js spread-syntax vuex

14
推荐指数
2
解决办法
7045
查看次数

扩展语法与切片方法

我试图了解以下方法中扩展语法与切片方法之间的区别.

假设我想制作一个数组的实际副本,我可以使用扩展语法轻松地做到这一点

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)

由于它们都需要大约相同的时间来编码/写入,这有什么区别?我通常应该选择哪种方法?

javascript slice spread-syntax

14
推荐指数
4
解决办法
3928
查看次数

是否可以在静止参数上设置默认参数值

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)

任何帮助是极大的赞赏.

javascript default-value ecmascript-6 spread-syntax

12
推荐指数
1
解决办法
1734
查看次数

传播操作符将对象转换为数组

我正在尝试转换这样的数据结构:

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}]

有没有办法使用扩展运算符来获得所需的结果?另外,为什么这种方法不起作用?

javascript arrays object ecmascript-6 spread-syntax

11
推荐指数
2
解决办法
6698
查看次数

迭代对象数组并更改每个对象中的一个属性

我发现自己有很多这种模式.我有一个从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)

javascript ecmascript-6 spread-syntax

10
推荐指数
2
解决办法
6434
查看次数

从JS中不可变数组中删除元素的最简洁方法是什么?

我需要从作为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)

它使代码更加污垢和难以理解.

创建一个从中删除元素的新数组是否更容易或更简单?

javascript arrays immutability reactjs spread-syntax

10
推荐指数
1
解决办法
5624
查看次数