起因

对于数组传入到数据库中,会以字符串的形式返回,那样前端组件在利用值的时候会匹配不上,需要将其转回数组。

例如: let a = "['a', b, c, 1, 2]"

转换: eval('(' + a + ')') 则可将a转换成数组

eval到底做了什么?

eval

eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。

返回字符串中代码的返回值。如果返回值为空,则返回 undefined。

永远不要使用 eval!

eval() 是一个危险的函数, 它使用与调用者相同的权限执行代码。
如果你用 eval() 运行的字符串代码被恶意方(不怀好意的人)修改,您最终可能会在您的网页/扩展程序的权限下,在用户计算机上运行恶意代码。
更重要的是,第三方代码可以看到某一个 eval() 被调用时的作用域,这也有可能导致一些不同方式的攻击。

eval替代方法

  1. 使用eval的糟糕代码:

    1
    2
    3
    4
    5
    6
    function looseJsonParse(obj){
    return eval("(" + obj + ")");
    }
    console.log(looseJsonParse(
    "{a:(4-1), b:function(){}, c:new Date()}"
    ))
  2. 不用eval的更好的代码:

    1
    2
    3
    4
    5
    6
    function looseJsonParse(obj){
    return Function('"use strict";return (' + obj + ')')();
    }
    console.log(looseJsonParse(
    "{a:(4-1), b:function(){}, c:new Date()}"
    ))

只需使用 window.Function

Function

Function 构造函数创建一个新的 Function 对象。
直接调用此构造函数可用动态创建函数,但会遇到和 eval 类似的的安全问题和(相对较小的)性能问题。
然而,与 eval 不同的是,Function 创建的函数只能在全局作用域中运行。

语法

new Function ([arg1[, arg2[, ...argN]],] functionBody)

参数

  • arg1, arg2, … argN
    被函数使用的参数的名称必须是合法命名的。参数名称是一个有效的JavaScript标识符的字符串,或者一个用逗号分隔的有效字符串的列表;例如“×”,“theValue”,或“a,b”。
  • functionBody
    一个含有包括函数定义的 JavaScript 语句的字符串。
    例子:
    1
    2
    3
    4
    const sum = new Function('a', 'b', 'return a + b');

    console.log(sum(2, 6));
    // expected output: 8

找到了eval更好的替代方法!