据我所知,typeof foo和typeof(foo)表现相同,后者更直观,因为我可以把它看作一个函数。
对于delete()也一样。
那么,有区别吗?如果没有,为什么我们需要两种形式?
答案 0 :(得分:4)
括号是可选的。 typeof
是一个运算符,而不是一个函数。这就像问为什么5 + 3
而不是5 + (3)
。
答案 1 :(得分:1)
在大多数情况下,它不会产生任何影响,但是当您使用typeof来评估表达式的类型时,它会变得很有用。
typeof(1 + ' some text');
返回
string
然而
typeof 1 + ' some text';
返回
"number some text"
答案 2 :(得分:0)
typeof
和delete
都是一元运算符,但两者之间有很大差异: 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)
)可用于调试复杂表达式。
在delete
和typeof
的操作数周围使用括号不会为运算符创建两种语法 - 括号遵循解析表达式的常规规则。