gpt4 book ai didi

javascript - 为什么 Node js会这样?

转载 作者:搜寻专家 更新时间:2023-11-01 00:27:45 24 4
gpt4 key购买 nike

考虑以下代码

function getCleanObject() {
var obj = {};
for (var _i = 0, _a = Object.getOwnPropertyNames(obj.__proto__); _i < _a.length; _i++) {
var prop = _a[_i];
obj[prop] = undefined;
}
obj.__proto__ = undefined;
return obj;
}
var a = 1;
console.log(getCleanObject(a).__proto__);
//'undefined' in browser
//'{}' in nodejs

一个返回对象的简单函数,所有内容都被剥离或设置为 undefined。当这在浏览器控制台中执行时,我们得到 undefined 这是预期的,因为 __proto__ 被设置为 undefined,但是当我们执行相同的代码时在 Node 中,我们得到 {},我很困惑为什么会这样。

这是 picoCTF lambdash 3 CTF 比赛的一部分

最佳答案

getCleanObject 没有多大意义,因为它分配属性然后尝试取消设置对象原型(prototype),这将导致对象具有大量垃圾键。

__proto__non-compliant property在某些实现中可能存在,但不应依赖。访问对象原型(prototype)的正确方法是 Object.getPrototypeOfObject.setPrototypeOf

__proto__ 将在 V8(Node.js、Chrome)中工作,因为它们支持它。它是 Object.prototype 上的描述符:

({}).hasOwnProperty('__proto__') === false
(Object.prototype).hasOwnProperty('__proto__') === true

它不允许给它赋任意值,只有null和objects:

The proto property of Object.prototype is an accessor property (a getter function and a setter function) that exposes the internal [[Prototype]] (either an object or null) of the object through which it is accessed.

obj.__proto__ = undefined 是不正确的,不应预期会起作用。它可能在 Node 中作为 obj.__proto__ = null 工作。正确的方法是 Object.setPrototypeOf(obj, null)

如果不存在应修改的现有对象(不鼓励修改原型(prototype),因为这会破坏优化),如 getCleanObject 中那样,那么它可能是:

const obj = Object.create(null);

关于javascript - 为什么 Node js会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52822969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com