扫码关注官方订阅号
一个没有定义的foo变量
typeof foo => undefinedwindow.foo => undefined
foo => foo is not define
为什么呢?直接使用foo就会提示没定义
小伙看你根骨奇佳,潜力无限,来学PHP伐。
typeof foo
11.4.3 The typeof Operator
Let val be the result of evaluatingUnaryExpression. If Type(val) is Reference, then If IsUnresolvableReference(val) is true, return"undefined". Let val be GetValue(val). Return a String determined by Type(val) according to Table 20.
Let val be the result of evaluatingUnaryExpression.
If Type(val) is Reference, then
If IsUnresolvableReference(val) is true, return"undefined".
Let val be GetValue(val).
Return a String determined by Type(val) according to Table 20.
关键看2.a步骤,如果typeof的操作数是一个不可解析的引用,那么会返回"undefined",而不会抛异常。
typeof
"undefined"
window.foo
这是一个属性访问表达式。
11.2.1 Property Accessors
可以看出,它是被等价为为window['a']来计算的,即a被作为字符串"a",而不是一个标识符。在此过程中不会抛异常。
window['a']
a
"a"
foo
这是一个标识符。
10.3.1 Identifier Resolution
标识符解析过程稍显复杂,但最终结果是一个内部类型Reference类型。由于这个a没有定义,所以Reference的base value是undefined,表示这是一个不可解析的Reference。到这里还不会抛异常,但是对它进行求值时候,例如在控制台打印它(即执行console.log(a))时,就会抛异常了。见:8.7.1 GetValue第3步。
undefined
console.log(a)
多说一点:为什么a未定义时,对它进行赋值
a = 123;
不会出错(非严格模式下)呢?
因为,首先赋值时a作为左值使用,不对它进行求值。然后,在非严格模式下,因为a是一个不可解析的引用,它会被绑定到global对象(即window)上,成为一个全局变量。见:8.7.2 PutValue第3.b步。
这里有三个概念:
对未定义的变量执行typeof会返回undefined;因此始终建议定义变量时就为变量赋值,null也行——不然你typeof返回undefined你无法判断这个变量是未定义还是定义了未初始化赋值。
null
访问对象上不存在的属性会返回undefined,和window变量没啥关系
直接访问未定义的变量会出错。
就这样。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
1.
typeof foo11.4.3 The typeof Operator
关键看2.a步骤,如果
typeof的操作数是一个不可解析的引用,那么会返回"undefined",而不会抛异常。2.
window.foo这是一个属性访问表达式。
11.2.1 Property Accessors
可以看出,它是被等价为为
window['a']来计算的,即a被作为字符串"a",而不是一个标识符。在此过程中不会抛异常。3.
foo这是一个标识符。
10.3.1 Identifier Resolution
标识符解析过程稍显复杂,但最终结果是一个内部类型Reference类型。由于这个
a没有定义,所以Reference的base value是undefined,表示这是一个不可解析的Reference。到这里还不会抛异常,但是对它进行求值时候,例如在控制台打印它(即执行console.log(a))时,就会抛异常了。见:8.7.1 GetValue第3步。多说一点:为什么
a未定义时,对它进行赋值不会出错(非严格模式下)呢?
因为,首先赋值时
a作为左值使用,不对它进行求值。然后,在非严格模式下,因为a是一个不可解析的引用,它会被绑定到global对象(即window)上,成为一个全局变量。见:8.7.2 PutValue第3.b步。这里有三个概念:
对未定义的变量执行typeof会返回
undefined;因此始终建议定义变量时就为变量赋值,null也行——不然你typeof返回undefined你无法判断这个变量是未定义还是定义了未初始化赋值。访问对象上不存在的属性会返回
undefined,和window变量没啥关系直接访问未定义的变量会出错。
就这样。