Con*_*one 1 typescript ecmascript-6 angular
我总是不喜欢hasOwnProperty()在javascript中检查循环对象时的需要:
for ( var key in object ) {
if ( !object.hasOwnProperty( key ) ) {
continue;
}
// Now I can do whatever I needed to do
}
Run Code Online (Sandbox Code Playgroud)
它似乎总是浪费垂直空间来遍历对象中的键,然后必须明确检查以确保这些键不是来自其他地方.我显然很熟悉为什么这在javascript中是必要的,特别是由于旧的库有时会将东西注入原型链(咳嗽原型咳嗽).
但是,据我所知,棱角分明没有这样的东西.打字稿肯定没有理由.我无法想象任何现代的JavaScript框架会.因此,在现代Angular应用程序(或任何现代JavaScript应用程序)中跳过此类检查的可能缺点是什么.我只是冒着自己的团队意外修改原型(或意外导入修改原型的库)而导致问题的风险,还是有更多我不知道的麻烦空间?如果我尝试这样做,原型链会以什么其他方式咬我?
for ( let key in object ) {
}
Run Code Online (Sandbox Code Playgroud)
我自己的测试没有发现任何问题,但我可能会遗漏一些明显的东西.是的,我Object.keys( object )在mondern js/ts中知道.它完成了工作,但我不认为它像a一样干净for ... in,如果我能让它hasOwnProperty()死,我宁愿使用它.
在枚举普通对象和其他您知道没有可枚举继承属性的对象时,绝对没有理由包含此检查.你是对的,没有合理的现代框架这样做Object.prototype.
在死亡hasOwnProperty检查 2012年以来:-)已宣布
我是否只有自己的团队意外修改原型(或意外导入修改原型的库)导致问题的风险?
是.虽然解决此类问题的方法不是修改原型(或使属性不可枚举),但不要在hasOwnProperty任何地方添加检查.
还是我有更多的麻烦空间,我不知道?
没有.
实际上,省略if (!object.hasOwnProperty(key))检查甚至可以解决一些问题并避免麻烦.并非所有您想要枚举的对象都保证有一个hasOwnProperty方法,或者一个符合您期望的方法.检查的正确方法 - 在必要的情况下 - 始终与call:
if (!Object.prototype.hasOwnProperty.call(object, key))
Run Code Online (Sandbox Code Playgroud)
(虽然当然还有边缘情况,但它们不依赖于object)
| 归档时间: |
|
| 查看次数: |
1592 次 |
| 最近记录: |