typeof“andrei”和typeof“andrei”.valueOf()之间的区别

时间:2017-06-24 12:41:46

标签: javascript string

  1. 我记录了两个并且他们返回了相同的结果,但必须有一个 微不足道。

2 个答案:

答案 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()中,结果是一样的,我很喜欢这个。

啊!这是另一回事,有两个原因:

  1. name可能不是字符串。很多东西都有length属性 - 字符串,函数,基本数组,类型化数组,DOM集合,任意数量的脚本定义对象......

  2. name可能是String 对象(尽管不太可能,除非为{编写扩展方法,否则人们通常不会使用String个对象{1}},在这种情况下String.prototype引用this对象。

  3. 因此删除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)类的原型未修改的对象实例。