我必须创建一个程序,用户将使用prompt()
输入对象的名称,之后将列出该对象的所有属性。
我课程中的很多学生都在使用eval()
,但我读过使用这种方法并不是一个好主意。
所以我尝试编写更好的代码,但我无法完成它。我最大的问题是当用户写this.object
时和写object.object.object
时,必须显示第三个对象的属性。
var x = prompt("Object?");
x = x.toLowerCase();
if (x === "window") {
x = window;
load_table();
} else if (window[x]) {
x = window[x];
load_table();
} else if (x[0] === "t" && x[1] === "h" && x[2] === "i" && x[3] === "s" && x[4] === ".") {
x = x.split('.');
x = x[1];
load_table();
} else {
document.write("Error Message.");
}
任何提示?
答案 0 :(得分:4)
尝试这样的事情:
var x = prompt("Object?");
// x = x.toLowerCase(); // not including, what if the object has a capital in its name?
x = x.split('.');
if (x[0] == 'this') {
x.shift(); // remove this, as it refers to window anyways
}
var theObj = window; // start with the global object
for (var i = 0; i < x.length; i++) {
theObj = theObj[x[i]];
if (theObj == undefined) break;
}
变量theObj
将包含您的最终值。
答案 1 :(得分:1)
您可能需要带有类型检查器的递归函数。然后,您可能还想编写一个函数来检查窗口对象中是否有一个名为value的对象。
function check(val){
if(!val) return "No value";
else if(typeof val === "string"){
return val;
} else if(typeof val === "object"){
var returner = "{";
for(var i in val){
returner += i + ": ";
returner += check(val[i]);
returner += ",";
}
return returner + "}"
} else {
return "Not object or string";
}
}
function tellMe(string){
if(string.split(".").length >= 2){
var check = window;
var split = string.split(".");
for(var i = 0; i < split.length; i++){
if(typeof check[string[i]] != "undefined"){
check = window[string[i]];
}
}
return "The closest value is " + check;
} else if(typeof window[string] != "undefined"){
return check(window[string]);
} else {
return "Value cannot be found in window object";
}
}
var string = "A string";
var object = {"key1":"value1","key2":"value2"};
console.log(tellMe("string"));
console.log(check(string));
console.log(tellMe("object"));
console.log(check(object));