Hack Javascript定义为;“未定义”;物体

Hack Javascript定义为;“未定义”;物体,javascript,prototype,definitions,Javascript,Prototype,Definitions,所以我不完全确定这是可能的,但我很好奇是否有可能破解“未定义”对象的定义。主要目的是防止在未定义的对象上执行.replace时启动错误。是否有可能进入“后端”(甚至有这样的事情吗??)并向未定义的对象添加一个方法(如果一开始就定义了方法的话??)。基本上是类似于 undefined.prototype.replace = function(v,r){ return false }; 显然,这适用于字符串或对象,但未定义,似乎本质上没有定义。但感觉您仍然应该能够处理它,因为javascript将

所以我不完全确定这是可能的,但我很好奇是否有可能破解“未定义”对象的定义。主要目的是防止在未定义的对象上执行.replace时启动错误。是否有可能进入“后端”(甚至有这样的事情吗??)并向未定义的对象添加一个方法(如果一开始就定义了方法的话??)。基本上是类似于

undefined.prototype.replace = function(v,r){ return false };
显然,这适用于字符串或对象,但未定义,似乎本质上没有定义。但感觉您仍然应该能够处理它,因为javascript将它作为可用的最终结果

谢谢你的时间!我真的很好奇这里会出现什么


编辑:主要的问题是,我正在与其他8名具有版本控制的开发人员共同开发,而一些新加入的开发人员并不熟悉javascript(或者不熟悉错误处理),因此我想为微小错误创建一个全局处理程序,必要时可以接收默认返回。看来这个主意行不通。可能是全局尝试捕获场景?

未定义类似于null;它不是一个原型被覆盖的对象。我不认为你可以用js代码做到这一点——你必须改变特定js解释器处理未定义代码的方式。这样做基本上就是改变javascript

对于在未定义上调用方法时不出错的特定示例;你为什么要这么做?即使可能,您只是在掩盖代码中的错误,以后可能会发生更糟糕的事情

你总能做到

var obj = getObj()

if (obj && obj.replace) obj.replace()...
为了防止未定义的错误


是否有任何语言允许您在未定义的值上调用方法而不出错?

这在某些浏览器中可能现在可以使用,但我不会这样做。早期的ECMAScript规范对
未定义
的确切性质有点模糊,但ECMAScript 5明确将
未定义
描述为只读。更好的方法是测试值是否未定义:

if (x !== undefined) {
    // OK
} else {
    // do nothing/set default value/skip
}
// alternate approach:
if (typeof x != "undefined") {
    // OK
} else {
    // do nothing/set default value/skip
}
请注意,在第一种情况下,必须使用
==
==
,因为像
undefined==null这样的奇数情况返回true

4.3.2原始值

未定义类型之一的成员, 空值、布尔值、数字或字符串作为 定义见第8条

注意一个原语 值是表示的基准 直接在系统的最低级别 语言实现

4.3.10未定义类型

唯一值为未定义值的类型 价值观


如您所见,
未定义的
是一个基本值,因此您无法为其定义属性。因为它不是一个对象。最好的方法是像
null
。唯一的区别是
null
表示有意清空,而
undefined
是尚未定义的变量的默认值和类型

在处理它之前检查它是否未定义。未定义就是未定义。这就像是问如何重新定义null。这是当前的做法。主要的问题是,我正在与其他8名具有版本控制的开发人员共同开发,而一些新加入的开发人员并不熟悉javascript(或者不熟悉良好的错误处理),因此我想为微小错误创建一个全局处理程序,必要时可以接收默认返回。哈哈,本质上,我确实想重新定义null。但我忘了它或多或少依赖于浏览器,doh!这很有道理。我有点忘记了javascript解释器依赖于浏览器,哇哇,失败了。我知道你可以用javascript做很多事情,因为它是一种非常不稳定的语言,但是这一个有点牵强。掩盖错误正是我想要的,因为我们处理的是不一致的webservice返回(我希望我能控制这一部分,但它不在我们的管理范围内),我想在尝试调用未定义变量的方法时执行一个几乎全局的try-catch场景。@tronhammer,为什么不测试返回对象的类型,如果存在,则调用replace。编辑我的演示答案这是我的经验法则,但是团队中的其他开发人员对javascript不太熟悉,我没有足够的资源来查找所有需要进行健全性检查的情况:(@tronhammer,那么您需要一些其他团队成员。)或者你需要培训他们什么是可以接受的,什么是不可以接受的,并进行代码审查。至于在你的团队中保持代码质量,请务必检查:哈哈,实际上,我们已经研究过了,但只能使用MIT许可证。但我把这件事告诉了我的老板,作为发布前清理工作的一个发展选择,Aucracy是一个令人讨厌的东西……:)@你只能使用拥有MIT许可证的工具?!?您不必交付或部署JSLint;这是一个针对源代码运行的脚本。在发布之前只运行一次,不如频繁运行它有用——jslint的目的是提高代码质量,从而使进一步的开发更容易。请看,我想使用这是所有对象的原型,这样,如果所讨论的变量确实未定义,就可以防止出现错误。对不起,我不太清楚:从本质上来说,这不一定是个错误。您还可以设置默认值或完全跳过它。跳过if/else块(如果您知道所讨论的值永远不会正确地计算为null/false/0/空字符串)的一种黑客方法是执行类似于
x=x |{foo:bar}