var obj1={a:1,b:2};
console.log(obj1.c); //undefined
console.log(global.c); //undefined
console.log(c); //报错
javascript对于undefined的定义是已声明但未初始化的变量,那么为什么obj1.c不会报错而返回undefined?
1)对声明了变量但是未对其初始化-赋值时,这个变量的值就是undefined
2)对于尚未声明的变量,只能执行typeof操作,其它的操作就会报ReferenceError:未定义的错误
3)对一个undefined变量执行操作,会报TypeError:不能从一个undefined对象读取属性
4)对于一个函数中未定义的变量求值,会沿其闭包调用链接往上寻找其变量定义,如果一直到global(全局)context还未找到这个变量的定义,那么就会报变量未定义的错误;如果有定义但是未赋值,会返回undefined;如果有定义并赋值了,会返回这个变量定义的值
5)默认情况下(没有对一个对象的属性进行特殊的设置,例如配置不可变更,不可枚举等,不可读写等),对于一个对象的属性取值,首先沿着原型链检查其属性是否存在,如果存在,返回对应的value;如果不存在直接返回undefinedconsole.log(object1.c);
与console.log(global.c);
适合规则5console.log(c);
适用规则4
对于规则4的例子
(function(){
function a(){
console.log(b);//报错,b is not defined
}
a();
}());
(function(){
var b;
function a(){
console.log(b);//不报错,输出undefined
}
a();
}());
可以这样理解整个JS运行在一个闭包环境下,这个闭包的顶层为全局环境
回答可以很简单。
你这里的object1.c = object1[c]
没有找到这个键,当然返回的就是undefined了 。
c in object. 取不到,不报错
undefined字面意思就是未定义…当你指定了他存在的父类去找就会报undefined,你试试看obj.c.d就报错了,因为c开始就不存在了,如果你想外层的不报错而是undefined,你可以window.c,那也是输出undefined
你调用了obj.c,他就创建了obj.c这个变量,但是实际上你没有给他初始化值就调用了,所以undefined