JavaScript 中对象的属性

Properties of objects in JavaScript

我可以安全地假设在 JavaScript、

的任何实现中

1.) 对于由 var obj = { ... }; 构造生成的任何对象,obj[s] 对于任何字符串 s 都是 undefined 除非 obj[s]已经被我自己的代码明确设置了?

2.) if typeof obj === 'object'(并且 obj 不是源自全局命名空间中的某个全局预定义变量或函数), Object.hasOwnProperty(obj, s)false 对于任何字符串 s 除非我已经设置 属性 s 明确之前或者,也许,当 Array.isArray(obj)true

简而言之:我可以假设既不是数组也不是函数类型的用户生成的对象没有预定义的自己的属性吗?

背景:我需要为 JavaScript 的一个非常小的子集编写一个解释器,它应该安全地执行用户代码。我想利用 JavaScript 引擎的优化功能。因此,我计划 (1.) 解析用户代码,(2.) 重写 AST,以便 (a) 无法访问全局名称,(b) 属性 访问受结构限制((typeof obj === 'object') && Object.hasOwnProperty(obj, s)) ? obj[s] : undefined, (3.) eval 重写的代码。为此,objects 必须没有预定义的属性,例如 (function () {}).caller,否则用户可以让我的解释器执行任意代码或弄乱全局对象我的环境一般。

也许有人知道已经完成类似操作的软件包吗?我的要求不高:我需要执行用户代码,用户需要处理数字、字符串、数组、对象和函数,我需要与用户代码交换这些东西。

编辑:第一个假设是错误的,请参阅答案。

你不能假设#1。 obj[s] 将访问继承的属性,而不仅仅是自己的属性。

var obj = {a: 1, b: 2}
console.log(obj["__proto__"] === undefined);
console.log(obj["toString"] === undefined);

我认为#2 是一个安全的假设。 hasOwnProperty() 的重点是区分继承的属性和在对象中显式分配的属性。