我有以下代码来管理图书集。
var Book = function(title,pages,priority){
this.title = title;
this.pages = pages;
this.priority = priority;
this.GetMaxmimumDays=function(){
var effortCalculator = new EffortCalculator(this.pages);
return effortCalculator.CalculateDays();
}
};
var BooksCollection = (function(){
var books=[];
return {
Add:function(book){
books.push(book);
},
Remove:function(title){
for(var i=0;i<books.length;i++){
if(books[i]["title"]==title){
books[i]["title"]=null;
}
}
},
Print:function(){
for(var i=0;i<books.length;i++){
var itemText="";
for(item in books[i]){
itemText=itemText+""+item+":"+books[i][item];
}
alert("item"+itemText); /** itemText prints the string includes the function definition. **/
}
},
Count:books.length,
SortByPriority:function(){
}
};
})();
在上面的代码中BooksCollection.Print()打印集合中的everyItem和everyProperty。但是书籍实例有功能成员。同样是在警告中打印出来。
我将Print()包裹起来,如下所示,隐藏输出中正在打印的功能。
Print:function(){
for(var i=0;i<books.length;i++){
var itemText="";
for(item in books[i]){
if(!(item instanceof Function)){
itemText=itemText+""+item+":"+books[i][item];
}
}
alert("item"+itemText);
}
}
但事情仍然是消极的。我试过(typeof(item)===&#34; Function&#34;)但是typeof(item)仍然读取&#34; String&#34;。
我想知道typeof和instanceOf关键字的可疑行为。
你可以在这里找到一个小提琴。 http://jsfiddle.net/saravanakumarrc/rDEnt/40/
请帮我找出解决方案。
答案 0 :(得分:2)
在您的情况下,typeof item
始终为string
- 它是枚举Book
属性的关键。
您要测试的是该项目的值,因此您需要typeof books[i][item]
:
for(item in books[i]){
if(typeof books[i][item] != 'function'){
itemText=itemText+""+item+":"+books[i][item]+ '\r\n';
}
}