问题应该是个特别基础的,但是我没有搞懂,希望有谁耐心解释下
var s1 = "2 + 2"; // Creates a string literal value
var s2 = new String("2 + 2"); // Creates a String object
eval(s1); // Returns the number 4
eval(s2); // Returns the string "2 + 2"
就是S1返回4的具体的机制是怎么回事?
问题应该是个特别基础的,但是我没有搞懂,希望有谁耐心解释下
var s1 = "2 + 2"; // Creates a string literal value
var s2 = new String("2 + 2"); // Creates a String object
eval(s1); // Returns the number 4
eval(s2); // Returns the string "2 + 2"
就是S1返回4的具体的机制是怎么回事?
eval函数的作用是把传入的字符串基本类型字面量当作javascript代码做动态解析并执行,解析后的代码就是数字2加上数字2,所以结果返回数字4。
而变量s2不是字符串字面量,而是字符串包装类型对象,所以传进去什么返回的还是什么。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval
MDN已经介绍的非常详细了,建议题主仔细看看。
s2
是个基本包装类型,基本包装类型的值在打印时会输出他的原始值,也就是默认调用了toString()
?
控制台里是这么显示s2
的:
// [[PrimitiveValue]] 这就是原始值。
String {0: "2", 1: " ", 2: "+", 3: " ", 4: "2", length: 5, [[PrimitiveValue]]: "2 + 2"}
规范中说的非常清楚了:
eval
只对字符串类型的参数起作用,其他类型不做任何处理,直接返回传入的参数。
https://es5.github.io/#x15.1.2.1
注意new String
不是字符串类型,是对象类型!
至于字符串,eval是把它的内容当成JavaScript源代码执行的,所以2+2做完源代码就是一个加法表达式,结果当然是4。
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
eval 函数执行代码返回结果,所以运行 2 + 2 就是 4 啦。
不过其参数要为 string 型的,传入 String 对象型就只是返回 String 的内容而已。