如果索引是非数字,则Array定义length = 0.
我遇到了这种获取长度的实现,但我仍然担心在数组循环中使用.循环的大多数地方被指示为"不良做法". 看这里
可以这样实现吗?
有人可以提供替代解决方案(不进行循环)吗?
for循环的任何例子?
我用过hasOwnProperty(..)方法来避免属性Array.prototype.
Array.prototype.global = 1;
var arr = [];
arr['first'] = 1;
arr['second'] = 2;
console.log(arr.length); //0
var length = 0;
for(index in arr){
if(arr.hasOwnProperty(index)) {length++;}
}
console.log(length); //3
Run Code Online (Sandbox Code Playgroud)
您的示例中不再使用数组作为数组.JS中的数组(严格来说)只是这样的一堆东西:
['a', 'b', 'c']
你所做的是开始使用空数组作为对象.. [] simple通过字符串/变量访问属性...所以
var obj = {test: 'blah'}
obj['test'] //is 'blah'
obj.test //is also blah
Run Code Online (Sandbox Code Playgroud)
通常,当您要通过变量访问属性或方法或者属性或方法不是"安全"时,使用[]表示法,例如'int'.
因此,将您拥有的内容更改为对象,然后使用"for in"循环逐步执行键.是的,你仍然需要检查每一个是否有onOwnProperty(或者使用jquery/underscore'each'),但至少你会使用正确的工具来完成工作:)或者如果你只是想要键的数量,underscore.js有一个很好的小_.keys方法..所以_.keys(obj).length会给你键的数量.很确定它只是本地键,而不是原型键.
编辑:作为一个重新阅读,希望更好的答案,JS中没有任何属性,我知道你可以简单地计算密钥的位置.如果它只是你正在使用的特殊事物而不是'所有对象',你可以做类似的事情......
var specialObject = function () {this.keys = 0;};
specialObject.prototype.set = function (key, val) {
if(!this[key]) {
this.keys++;
}
this[key] = val;
};
var so = new specialObject();
so.set('test', 'blah');
so.keys //would be 1
so.test //would be 'blah'
Run Code Online (Sandbox Code Playgroud)
然后只使用'set'.你也想做一个'unset',也可能是'get'方法.
希望这一切都有道理......它有点乱窜.
| 归档时间: |
|
| 查看次数: |
3134 次 |
| 最近记录: |