套装似乎是一个很好的方式来创建保证唯一的元素数组,但它不公开任何好的办法来获取属性,除了发电机[设置] .values,被称为在一个尴尬的方式mySet.values.next()
.
如果您可以map
在集合上调用和类似的函数,那就没问题了.但你也不能这样做.
我试过了Array.from
,但似乎只是将类似数组(NodeList和TypedArrays?)的对象转换为Array.另一个尝试:Object.keys
对Sets不起作用,而Set.prototype没有类似的静态方法.
所以,问题是:是否有任何方便的内置方法来创建具有给定Set值的数组?(元素的顺序并不重要).
如果没有这样的选择,那么也许有一个很好的惯用的单行代码呢?喜欢,使用for...of
或类似?
这个问题针对的是那些在即将到来的ECMAScript 6(Harmony)背景下已经考虑过代码风格并且已经使用过该语言的人.
有了() => {}
和function () {}
我们有两种非常相似的方法来编写ES6中的函数.在其他语言中,lambda函数通常通过匿名来区分自己,但在ECMAScript中,任何函数都可以是匿名的.这两种类型中的每一种都具有唯一的使用域(即,当this
需要明确地绑定或明确地不绑定时).在这些域之间存在大量的情况,其中任何一种符号都可以.
ES6中的箭头功能至少有两个限制:
new
this
在初始化时限制范围抛开这两个限制,箭头函数理论上几乎可以在任何地方替换常规函数.在实践中使用它们的正确方法是什么?是否应使用箭头功能,例如:
this
变量不可知,我们不创建对象.我正在寻找的是在ECMAScript的未来版本中选择适当的函数符号的指南.该指南需要明确,以便可以向团队中的开发人员讲授,并保持一致,这样就不需要从一个函数符号到另一个函数符号进行不断的重构.
javascript lambda ecmascript-harmony ecmascript-6 arrow-functions
更新:最近一篇来自Mozilla的精彩文章出现了.如果你好奇,请阅读它.
您可能知道他们计划在ECMAScript 6中包含新的Symbol原语类型(更不用说其他一些疯狂的东西).我一直认为:symbol
Ruby 中的概念是不必要的; 我们可以轻松地使用纯字符串,就像我们在JavaScript中一样.现在他们决定用JS复杂化JS.
我不明白动机.有人可以向我解释我们是否真的需要JavaScript中的符号吗?
我有一个扁平的JS对象:
{a: 1, b: 2, c: 3, ..., z:26}
Run Code Online (Sandbox Code Playgroud)
我想克隆除一个元素之外的对象:
{a: 1, c: 3, ..., z:26}
Run Code Online (Sandbox Code Playgroud)
最简单的方法是什么(如果可能,最好使用es6/7)?
如何编写一个函数,在ES6中以最紧凑的方式只占用少量属性?
我已经提出了使用解构+简化对象文字的解决方案,但我不喜欢在代码中重复的字段列表.
有更薄的解决方案吗?
(v) => {
let { id, title } = v;
return { id, title };
}
Run Code Online (Sandbox Code Playgroud) javascript destructuring ecmascript-harmony ecmascript-6 ecmascript-next
新的ES 6(Harmony)引入了新的Set对象.Set使用的身份算法类似于===
运算符,因此不太适合比较对象:
var set = new Set();
set.add({a:1});
set.add({a:1});
console.log([...set.values()]); // Array [ Object, Object ]
Run Code Online (Sandbox Code Playgroud)
如何自定义Set对象的相等性以进行深层对象比较?有没有像Java这样的东西equals(Object)
?
x
在JavaScript中循环时间的典型方法是:
for (var i = 0; i < x; i++)
doStuff(i);
Run Code Online (Sandbox Code Playgroud)
但我不想使用++
运算符或根本没有任何可变变量.那么,在ES6中,有x
另一种方式循环时间吗?我喜欢Ruby的机制:
x.times do |i|
do_stuff(i)
end
Run Code Online (Sandbox Code Playgroud)
在JavaScript/ES6中有类似的东西吗?我可以作弊并制造自己的发电机:
function* times(x) {
for (var i = 0; i < x; i++)
yield i;
}
for (var i of times(5)) {
console.log(i);
}
Run Code Online (Sandbox Code Playgroud)
我当然还在用i++
.至少它看不见:),但我希望在ES6中有更好的机制.
如您所知,有一个.bind()
功能快捷方式的建议,所以您可以写:
::this.handleStuff
Run Code Online (Sandbox Code Playgroud)
它将在es5中像那样工作:
this.handleStuff.bind(this)
Run Code Online (Sandbox Code Playgroud)
我的问题是:这样可以传递参数吗?
我的意思是用上述快捷方式编写这个方法:
this.handleStuff.bind(this, 'stuff')
Run Code Online (Sandbox Code Playgroud)
这在React中是一个非常常见的模式,所以稍微缩短它会很好.
以更多功能方式执行以下操作的最佳方法是什么(使用ES6/ES7)
let cols = [];
for (let i =0; i <= 7; i++) {
cols.push(i * i);
}
return cols;
Run Code Online (Sandbox Code Playgroud)
我试过,
return [ ...7 ].map(i => {
return i * i;
});
Run Code Online (Sandbox Code Playgroud)
但那转化为
[].concat(7).map(function (n) {
return n * n;
});
Run Code Online (Sandbox Code Playgroud)
这不是我的预期.
@pavlo.的确,这是一个错误.我正在使用JSX,例如,我想要7个div,(未经测试)
let cols = [];
for (let i =0; i <= 7; i++) {
cols.push(<div id={i}> ... </div>)
}
return cols;
Run Code Online (Sandbox Code Playgroud)
所以这个想法确实是为了减少临时变量和程序感觉的数量.
javascript functional-programming ecmascript-harmony ecmascript-6
javascript ×10
ecmascript-6 ×7
arrays ×1
collections ×1
ecmascript-7 ×1
generator ×1
lambda ×1
set ×1
symbols ×1
syntax ×1
weakmap ×1