将字符串转化为变量名的几种方法

参考:https://segmentfault.com/a/1190000017114522

头条面试题:实现一个get函数,使得下面的调用可以输出正确的结果
const obj = { selector: { to: { toutiao: "FE Coder"} }, target: [1, 2, { name: 'byted'}]};

get(obj, 'selector.to.toutiao', 'target[0]', 'target[2].name');
// [ 'FE Coder', 1, 'byted']
简而言之,这就是一个将字符串转化为变量名的题目

因为obj.selector.to.toutiao ,obj.target[0] ,obj.target[2].name能输出为'FE Coder', 1, 'byted'
那么obj.'selector.to.toutiao' ,obj.'target[0]' ,obj.'target[2].name' 能输出吗?显然不能

所以当我们把'selector.to.toutiao'转化为obj.selector.to.toutiao不就完美的解决啦

将字符串转化为变量名的方法:

  • 方法一:使用eval()函数

1.定义 : eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。(w3c解释:http://www.w3school.com.cn/jsref/jsref_eval.asp)
2.用法 :eval("2+2") ,返回4。
ps:注意,只接受原始字符串作为参数,也就是说

var xy=4;
console.log(eval(x+"y"));

会报错,而不是等于eval("xy")


image.png

3.使用eval()的解题办法

const obj = { selector: { to: { toutiao: "FE Coder"} }, target: [1, 2, { name: 'byted'}]};
  // [ 'FE Coder', 1, 'byted']
  //get(obj, 'selector.to.toutiao', 'target[0]', 'target[2].name');
  function get(obj,x,y,z){
    //把字符串变为变量
    x=(eval("obj."+x));
    y=(eval("obj."+y));
    z=(eval("obj."+z));
    console.log(x,y,z);
  }
  get(obj,'selector.to.toutiao','target[0]','target[2].name')
  • 方法二:使用模板字符串 ``

1.说明 : (参考http://es6.ruanyifeng.com/?search=new+function&x=9&y=10#docs/string
模板字符串中嵌入变量,需要将变量名写在${ }之中

2.使用模板字符串的解题办法

function get(data, ...args) {
    const res = JSON.stringify(data);
    return args.map((item) => (new Function(`try {return ${res}.${item} } catch(e) {}`))());
  }

  const obj = { selector: { to: { toutiao: "FE Coder"} }, target: [1, 2, { name: 'byted'}]};
  console.log(get(obj, 'selector.to.toutiao', 'target[0]', 'target[2].name', 'asd'));

其他说明:
(1)get(...args) : ...args为剩余参数语法,允许我们将一个不定数量的参数表示为一个数组。
(2)JSON.stringify : JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。
(3)Array map() :方法按照原始数组元素顺序依次处理元素后返回一个新数组
参考(http://www.runoob.com/jsref/jsref-map.html
(4)new Function():
注意:(a) new function(arg1, arg2, ..., argN, function_body)的参数一定要是字符串
(b).new Function()返回值为对象 ,而function(){ }返回的是函数的值(有new返回的一定是对象,无new返回函数的值(原始始类型或对象))

最最最重要的总结

既有变量名又有字符串,且都要变成变量名时 ,要先都转化为字符串

小白不知道总结的对不对 , 只能凭我现在的经验总结 , 以后随时更新....

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容