Javascript 将字符串强制转换为对象?
我正在枚举一个对象的属性。直接设置对象时效果很好 我需要使用提示符(类赋值)来允许用户输入对象名。问题是obj以字符串形式返回 如何将值从提示转换为对象Javascript 将字符串强制转换为对象?,javascript,Javascript,我正在枚举一个对象的属性。直接设置对象时效果很好 我需要使用提示符(类赋值)来允许用户输入对象名。问题是obj以字符串形式返回 如何将值从提示转换为对象 function enumObject(){ var obj; var propertyName; obj = prompt("Please enter an object name","window.navigator"); obj = window.navigator; if (typeof
function enumObject(){
var obj;
var propertyName;
obj = prompt("Please enter an object name","window.navigator");
obj = window.navigator;
if (typeof obj == "object"){
for (propertyName in obj){
document.write(propertyName + " : " + obj[propertyName] + "<br>");
}
}
else {
alert('The object name is undefined.');
}
obj = null;
propertyName = null;
}
enumObject();
函数enumObject(){
var-obj;
var-propertyName;
obj=提示(“请输入对象名称”,“window.navigator”);
obj=window.navigator;
if(对象类型==“对象”){
for(对象中的propertyName){
document.write(propertyName+“:“+obj[propertyName]+”
”);
}
}
否则{
警报('对象名称未定义');
}
obj=null;
propertyName=null;
}
枚举对象();
我建议:
function enumObject(){
var obj;
var propertyName;
obj = prompt("Please enter an object name","window.navigator");
window[obj] = {};
if (typeof window[obj] == "object"){
for (propertyName in obj){
document.write(propertyName + " : " + obj[propertyName] + "<br>");
}
}
else {
alert('The object name is undefined.');
}
}
enumObject();
函数enumObject(){
var-obj;
var-propertyName;
obj=提示(“请输入对象名称”,“window.navigator”);
窗口[obj]={};
if(窗口类型[obj]=“对象”){
for(对象中的propertyName){
document.write(propertyName+“:“+obj[propertyName]+”
”);
}
}
否则{
警报('对象名称未定义');
}
}
枚举对象();
对象名称
是否希望用户通知引用对象的全局变量名?
如果是这样,您可以这样做:
var name = prompt("Enter a global variable name.");
var obj = window[name];
var objDef = prompt("Enter a string representing an object");
var obj = eval("(function(){return " + objDef + ";})()");
(function(){
var someObj = { b:123, c: 321 };
var name = prompt("Enter an object variable name in local scope.");//Here, your user could enter "someObj"
eval("console.log(" + name + ")");
})();
如果希望用户输入将转换为对象文字的字符串,可以执行以下操作:
var name = prompt("Enter a global variable name.");
var obj = window[name];
var objDef = prompt("Enter a string representing an object");
var obj = eval("(function(){return " + objDef + ";})()");
(function(){
var someObj = { b:123, c: 321 };
var name = prompt("Enter an object variable name in local scope.");//Here, your user could enter "someObj"
eval("console.log(" + name + ")");
})();
或者
如果要访问函数作用域中的对象变量而不使用,请尝试:
var name = prompt("Enter a global variable name.");
var obj = window[name];
var objDef = prompt("Enter a string representing an object");
var obj = eval("(function(){return " + objDef + ";})()");
(function(){
var someObj = { b:123, c: 321 };
var name = prompt("Enter an object variable name in local scope.");//Here, your user could enter "someObj"
eval("console.log(" + name + ")");
})();
我需要使用提示符(类赋值)来允许用户输入
对象名。问题是obj以字符串形式返回
如何将值从提示转换为对象
function enumObject(){
var obj;
var propertyName;
obj = prompt("Please enter an object name","window.navigator");
obj = window.navigator;
if (typeof obj == "object"){
for (propertyName in obj){
document.write(propertyName + " : " + obj[propertyName] + "<br>");
}
}
else {
alert('The object name is undefined.');
}
obj = null;
propertyName = null;
}
enumObject();
因为对象没有名称,所以不能。您可以有变量或对象属性,其值是对对象的引用,但:
var obj = {};
创建一个名为obj、值为对象引用的变量
如果要动态创建变量,可以使用eval,但不建议使用eval。我们强烈警告不要使用eval来执行用户输入的随机代码,因为他们完全不知道已经存在的变量,并且您不希望他们弄乱这些变量
由于几乎任何字符串值都可以用作属性名称,所以您可以创建一个专门用于向其添加属性的对象。所以你可以这样做:
function enumObject(){
// markup and div will be used later
var markup = '';
var div;
// Here's where the property names will be stored
var obj = {};
var propertyName = prompt("Please enter an object name", "window.navigator");
obj[propertyName] = {};
// This is redundant since an object was just assigned so it will
// always return true
if (typeof obj[propertyName] == "object") {
// Always perform a hasOwnProperty check so you don't get
// inherited properties, you only want the ones added by the user
// Also, don't re-used variables, create a new one
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// Don't use document.write after the page has finished loading
// as it will clear the entire document first before writing
markup += propertyName + " : " + obj[propertyName] + "<br>";
}
}
// This should never execute since the test should always be true
} else {
alert('The object name is undefined.');
}
// Write to the document without destroying it
div = document.createElement('div');
div.innerHTML = markup;
document.body.appendChild(div);
}
函数enumObject(){
//稍后将使用标记和div
var标记=“”;
var-div;
//这里是存储属性名称的位置
var obj={};
var propertyName=prompt(“请输入对象名”、“window.navigator”);
obj[propertyName]={};
//这是多余的,因为刚刚分配了一个对象,所以它将
//总是返回真值
if(对象的类型[propertyName]=“对象”){
//始终执行hasOwnProperty检查,以避免
//继承的属性,您只需要用户添加的属性
//另外,不要重复使用变量,创建一个新的变量
用于(obj中的var prop){
if(对象拥有自己的财产(财产)){
//页面加载完成后,不要使用document.write
//因为它将在编写之前首先清除整个文档
markup+=propertyName+“:“+obj[propertyName]+”
”;
}
}
//这不应该执行,因为测试应该始终为真
}否则{
警报('对象名称未定义');
}
//在不破坏文档的情况下写入文档
div=document.createElement('div');
div.innerHTML=标记;
文件.正文.附件(div);
}
编辑
也许您希望基于用户定义的字符串访问对象属性。在这种情况下,您可以执行以下操作。仅当属性访问器的根不是窗口且仅显示为有效标识符的字符串而不是随机代码时,它才使用eval:
// Assumes dot notation like window.navigator or foo.bar
function getObjectValueByString(s) {
var identifier, path = [];
// Very simple identifier re
var identifierRe = /^[_$a-z][a-z0-9_$]*$/i;
s = s.split('.');
// Loop over parts of s
for (var i=0, iLen=s.length; i<iLen; i++) {
identifier = s[i];
path.push(identifier);
if (identifierRe.test(identifier)) {
// Get root of accessor
if (i == 0) {
if (identifier == 'window') {
obj = window;
// Only use eval on what appear to be valid identifiers
// not arbitrary code
} else {
obj = eval(identifier);
}
// If not root, get property value
} else {
obj = obj[identifier];
}
// Stop if obj isn't an object
if (typeof obj != 'object') {
// Message if didn't get to end of accessor
if (i < iLen - 1) {
return 'Stopped at ' + path.join('.') + ' = ' + obj;
}
}
} else {
return identifier + ' is not a valid identifier';
}
}
return path.join('.') + ' = ' + obj;
}
//采用点表示法,如window.navigator或foo.bar
函数getObjectValueByString(s){
变量标识符,路径=[];
//非常简单的标识符re
var identifierRe=/^[$a-z][a-z0-9_$]*$/i;
s=s.split('.');
//环绕一部分
对于(var i=0,iLen=s.length;iYou只需传递键名在window
中查找,然后使用括号表示法,或者您必须使用eval
obj=eval(obj);
这毕竟是一个类赋值。感谢您的帮助。如果您编写window[obj]={}
,那么typeof window[obj]=“object”
永远是正确的。感谢您的帮助。不,不要这样做。有各种全局变量的值,您不希望用户随机修改,所以请创建一个单独的对象并使用它。嗯,是的,我应该提到这个示例代码,它不安全(即非常不安全)。不要为此使用窗口对象(见对尼克回答的评论)。此外,不要执行用户输入的随机代码。如果是对象文字,请使用JSON.parse,而不是eval或函数构造函数。当然,JSON.parse是安全的,因为它不依赖于计算代码来解析它。但是,如果输入的对象是有效的JSON,那么问题也不太清楚它的意图(JS对象可以有函数属性,这对于JSON对象来说不是事实)。关于使用窗口对象:我也知道,给用户在全局命名空间中污染和更改属性的权力是一种不好的做法。这个问题要求解决一些问题,我正试图解决它的问题,并给出一个合理、简单和易于理解的答案。@RobG:执行用户输入的随机代码没有错将执行该操作的用户?@Bergi不确定这是一个问题还是一句话。该操作的目的似乎是使用用户指定的名称创建对象属性。使用eval来创建对象属性意味着提供比命名属性多得多的功能,例如破坏作用域中任何变量的值、删除