两个点(..)
先上官方解释:
级联运算符 (..) 可以实现对同一个对象进行一系列的操作。 除了调用函数, 还可以访问同一对象上的字段属性。 这通常可以节省创建临时变量的步骤, 同时编写出更流畅的代码。
官方Demo:
querySelector('#confirm') // 获取对象。
..text = 'Confirm' // 调用成员变量。
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
等价于以下代码:
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
通过对比,很自然就容易看出..的核心,省去了临时变量,但是初次接触者,会感觉代码可读性较差一点。
另外:
级联运算符可以嵌套,例如:
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
在返回对象的函数中谨慎使用级联操作符。 例如,下面的代码是错误的:
var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Error: 'void' 没哟定义 'write' 函数。
sb.write() 函数调用返回 void, 不能在 void 对象上创建级联操作。
三个点(...)
官方文档我没有找到定义
个人理解和JS中的扩展符是一个作用,都是对对象和数组做解构
例如:
main() {
var test1 = {"a": 1, "b": 2, "c": 3};
var test2 = {"d": 4, "f": 5};
var test3 = {...test1, ...test2};
print("test3====" + test3.toString());
var test4 = [1, 2, 3];
var test5 = [...test4, 4, 5, 6];
print("test5===" + test5.toString());
}