JavaScript的条件检查中的行为不一致

Buu*_*yen 7 javascript

我想obj1用属性构建一个对象obj2,这是另一个对象.为了避免重新声明obj1obj2,我使用下面的代码:

if (!obj1) obj1 = {};
if (!obj1.obj2) obj1.obj2 = {};
// code to use obj1
Run Code Online (Sandbox Code Playgroud)

假设,obj1并且obj1.obj2尚未定义,代码使浏览器报告错误"obj1未定义".

如果我将代码更改为:

if (typeof obj1==='undefined') obj1 = {};
if (!obj1.obj2) obj1.obj2 = {};
// code to use obj1
Run Code Online (Sandbox Code Playgroud)

然后没有错误,而我认为它应该报告"obj2未定义".我很困惑为什么JavaScript会对参考和属性的短手错误检查进行不同的处理.任何人都可以对此有所了解吗?

Mat*_*att 6

如果你愿意:

if (!window.obj1) window.obj1 = {};
if (!obj1.obj2) obj1.obj2 = {};
Run Code Online (Sandbox Code Playgroud)

您会发现代码按预期工作.

obj1当你检查它是否存在时,它甚至不是一个参考; 没什么.它不存在,因为你没有声明它(你没有初始化它).

var obj1;

if (!obj1) obj1 = {};
if (!obj1.obj2) obj1.obj2 = {};
Run Code Online (Sandbox Code Playgroud)

这也有效,因为你已经宣布存在obj1; 你还没有初始化它.

未设置的对象的所有属性都保存该值undefined; 这就是为什么它会响应你的空手!obj1.obj2

var obj1 = {};
obj1.a === undefined // true;
Run Code Online (Sandbox Code Playgroud)

但是,必须先定义变量,然后才能访问它们.