JavaScript with&eval妙用——根据表达式获取对象中对应的属性值
var getValue = (propExp,obj) => {
var result;
try {
var safeWindow = {
alert: noop,confirm: noop,prompt: noop
};
with (obj) {
result = eval.call(safeWindow,propExp);
}
} catch (error) {
}
return result;
}
var user = {
name: {
first: 'Jan',last: 'Toim'
},age: 20,address: [
{
address: '美国加州',phone: '333'
},{
address: '美国纽约',phone: '444'
}
]
};
getValue('age',user);//20
getValue('name',user);//{first: 'Jan',last: 'Toim'}
getValue('name',user)===user.name;//true
getValue('address[0].phone',user);//333
getValue('address[5].phone',user);//undefined
getValue('alert(22)',user);//undefined(不弹出alert)
{
var fun = new Function('obj','var noop = function () { };var result;try{var safeWindow={alert:noop,confirm:noop,prompt:noop};with(obj){result=' + propExp + '}}catch(error){};return result;');
return fun(obj);
};