答案 0 :(得分:1)
不,没有区别,除非有人对JavaScript环境做了些蠢事。
"andrei"
是一个字符串基元,因此typeof "andrei"
是"string"
。如果你执行"andrei".valueOf()
,你就是将一个字符串原语强制转换为一个String
对象(理论上*),因为你正在访问它上面的一个属性(valueOf
),然后问这个对象的原始值 - 这是一个原始字符串,因此typeof "andrei".valueOf()
是"string"
。
当然,你可以通过返回一个数字或对象来替换String.prototype.valueOf
以外的其他东西,而不是违反了String.prototype.valueOf
合同。但那是在奇异的土地上。
*“理论上” - JavaScript引擎可以自由地优化操作,前提是优化不会使事情的行为不符合规范。因此,JavaScript引擎可以优化远离字符串原语.valueOf()
,String.prototype.valueOf
仍然与其默认值(引擎很容易注意到)相同,因为结果与原始的。我不知道他们是否做,但他们可以。
重新评论这个问题:
if((typeof name !="undefined") && (typeof name.valueOf()=="string") && (name.length>0))
在这一个
deleted valueOf()
中,结果是一样的,我很喜欢这个。
啊!这是另一回事,有两个原因:
name
可能不是字符串。很多东西都有length
属性 - 字符串,函数,基本数组,类型化数组,DOM集合,任意数量的脚本定义对象......
name
可能是String
对象(尽管不太可能,除非为{编写扩展方法,否则人们通常不会使用String
个对象{1}},在这种情况下String.prototype
引用this
对象。
因此删除String
部分会改变条件。重新typeof name.valueOf()=="string"
部分:该代码的作者有点偏执或者有理由期望.valueOf()
可能是name
对象(因此其类型将是{{1} },而不是String
)。使用"object"
可确保他/她正在检查原语。
令人惊讶的是,他们不够偏执(至少没有上下文),因为"string"
会导致该代码中出现异常。
每个条件周围的valueOf
也完全没必要。
处理null
也是这样的:
()
答案 1 :(得分:0)
JavaScript中"string".valueOf()
返回值和"string"
之间没有实际差异,因为String.prototype.valueOf()
方法返回字符串 - 原始对象本身(和String.prototype.toString()
一样)。< / p>
typeof "string" === typeof "string".valueOf() //true
使用(String).valueOf()
和(String)
(例如,由于比较)之间的唯一性能差异是调用简单(String)
更快(当然,说{{1} } - 是(String)
类的原型未修改的对象实例。