什么是typeof foo和typeof(foo)/ delete bar和delete(bar)之间的区别,为什么我们需要两者?

时间:2018-02-09 22:58:27

标签: javascript

据我所知,typeof foo和typeof(foo)表现相同,后者更直观,因为我可以把它看作一个函数。

对于delete()也一样。

那么,有区别吗?如果没有,为什么我们需要两种形式?

3 个答案:

答案 0 :(得分:4)

括号是可选的。 typeof是一个运算符,而不是一个函数。这就像问为什么5 + 3而不是5 + (3)

答案 1 :(得分:1)

在大多数情况下,它不会产生任何影响,但是当您使用typeof来评估表达式的类型时,它会变得很有用。

typeof(1 + ' some text'); 

返回

string

然而

typeof 1 + ' some text';

返回

"number some text"

答案 2 :(得分:0)

typeofdelete都是一元运算符,但两者之间有很大差异: typeof计算其操作数,delete不计算。运算符优先级(MDN reference)对于讨论非常有用。

delete UnaryExpression

删除操作符不会评估其操作数并忽略分组操作符'('和')'围绕它,因为它们的优先级高于delete。因此,delete永远不能使用相同的语法编写为函数调用,因为函数调用将评估函数参数。删除可以使用属性快捷方式或查找语法:

delete objectIdentifier.property name;  // is equivalent to
delete objectIdentifier["propertyName"]

在严格模式下,如果您尝试对不包含属性名称和对象的对象属性的引用使用delete,则会生成语法错误。

typeof UnaryExpession

typeof运算符计算其操作数。如果操作数表达式括在括号中,则在将typeof应用于结果之前,将评估括号之间的整个表达式。使用可以使用运算符优先级规则识别的运算符周围的括号是多余的。

<强>摘要

delete的操作数周围使用括号并没有帮助,最好避免使用。

typeof操作数周围使用括号来获取表达式结果的类型。

如果运算符优先级或自动类型转换未按预期工作,则在typeof及其操作数周围放置括号(如(typeof operand))可用于调试复杂表达式。

deletetypeof的操作数周围使用括号不会为运算符创建两种语法 - 括号遵循解析表达式的常规规则。