3 回答
TA贡献1811条经验 获得超6个赞
这非常简单。您可以eval如下剖析:
if (typeof argument === "string") return <evaluation of string>;
else return argument; // eval just returns what it gets
所以你的例子:
eval(new String('2 + 2'));
您可以将其分为两个语句:
let arg = new String('2 + 2');
console.log(typeof arg); // object
console.log(eval(arg) === arg); // true, because typeof arg is not "string"
另外两个示例将类型字符串传递给eval:
let arg = "new String(2+2)";
console.log(typeof arg); // string
// Now we get evaluation of 2+2 and String constructor is called:
console.log(eval(arg)); // a String object (that's what the constructor produces)
'2 + 2'
在第三个示例中,计算字符串,即字符串“2 + 2”。其余与第二个例子相同。
请注意,String 对象不是“ string”类型,而是“object”类型。
TA贡献1817条经验 获得超14个赞
你的例子就可以正常工作。
eval(new String('2 + 2')); // So eval doesn't do anything here and return argument without any operation.
第二个 eval( 的参数是一个纯字符串。无论里面是什么,eval 都会直接作为 JavaScript 代码执行。
eval("new String(2+2)") // This will first calculate 2 + 2 and create a new string object with argument 4.
最后一个,它是一个字符串,因此 eval 将直接将其作为 JavaScript 代码执行,如第二个示例所示。不同之处在于,String 对象现在接受字符串 '2 + 2'
eval("new String('2 + 2')"); // returns a string object with a string argument.
希望这个解释有帮助。
TA贡献1911条经验 获得超7个赞
返回的类型new String('2 + 2')
是"object"
。
console.log( typeof new String('2 + 2') ) console.log( typeof new String('2 + 2').toString() )
由于这是一个对象,
如果 eval() 的参数不是字符串,则 eval() 返回该参数不变。
如果您使用 专门将 String 对象强制转换为字符串基元.toString(),则它会按您的预期运行。
console.log(eval('2 + 2'));
console.log(eval(new String('2 + 2')));
console.log(eval(new String('2 + 2').toString()));
添加回答
举报