我可以放心地假设,在任何JavaScript的实现中。
1.)对于任何对象产生的 var obj = { ... };
构建。obj[s]
是 undefined
对于任何字符串 s
除非 obj[s]
已由我自己的代码明确设置?
2.) 如果 typeof obj === 'object'
(和 obj
不源于全局命名空间中的某个全局、预先定义的变量或函数)。) Object.hasOwnProperty(obj, s)
是 false
对于任何字符串 s
除非我设置了属性 s
之前或当 Array.isArray(obj)
是 true
?
简而言之:我是否可以假设用户生成的既不是数组也不是函数类型的对象没有预定义的自身属性?
背景:我需要为一个非常小的JavaScript子集写一个解释器。我需要为一个非常小的JavaScript子集写一个解释器,它应该安全地执行用户代码。我想利用JavaScript引擎的优化能力。因此,我计划(1.)解析用户的代码,(2.)重写AST,使(a)不能访问全局名,(b)属性访问受制于类似于 ((typeof obj === 'object') && Object.hasOwnProperty(obj, s)) ? obj[s] : undefined
, (3.) eval
重新编写的代码。要做到这一点,就必须让 object
解释器不能有预定义的属性,例如,......,否则用户可以让我的解释器执行任意的代码或者扰乱我环境中的全局对象。(function () {}).caller
等预定义的属性,否则用户可以让我的解释器执行任意代码,或者对环境中的全局对象进行破坏。
也许,有人知道有哪个包已经做了这样的事情?我的要求并不高:我需要执行用户代码,用户需要处理数字、字符串、数组、对象和函数,我需要和用户代码交换这些东西。
编辑:第一个假设是错误的,请看答案。
你不能假设#1。obj[s]
会访问继承的属性,而不仅仅是自己的属性。
var obj = {a: 1, b: 2}
console.log(obj["__proto__"] === undefined);
console.log(obj["toString"] === undefined);
我认为#2是一个安全的假设。的整个要点是 hasOwnProperty()
是为了区分继承的属性和对象中显式分配的属性。