String.prototype的“this”不返回字符串?

时间:2011-02-28 19:26:16

标签: javascript

这里发生了什么?就在我认为我内外都知道JS的时候,这个宝石出现了。

String.prototype.doNothing = function() {
  return this;
};

alert(typeof 'foo'.doNothing()) // object
alert(typeof 'foo')             // string

http://jsfiddle.net/dJBmf/

这打破了一些期望字符串的东西,例如jQuery的.text(str)方法。

9 个答案:

答案 0 :(得分:33)

要确保您总是收到字符串,请尝试使用此代码:

String.prototype.doNothing = function() {
    return this.toString();
};

alert(typeof 'foo'.doNothing())
alert(typeof 'foo')

在原始代码中,this作为字符串对象而不是实际字符串返回。

答案 1 :(得分:23)

this关键字的

Here's a thorough overview。基本上,JavaScript将其转换为对象(如果不是一个对象)。

  

执行以下步骤时   控制进入执行上下文   用于包含的功能代码   函数对象F,提供的调用者   thisValue和调用者提供   argumentsList:

     
      
  1. 如果功能代码是严格代码,请将ThisBinding设置为   thisValue。
  2.   
  3. 否则,如果thisValue为null或未定义,则将ThisBinding设置为   全球对象。
  4.   
  5. 否则如果Type(thisValue)不是Object,则将ThisBinding设置为   ToObject(thisValue)。
  6.   
  7. 否则将ThisBinding设置为thisValue
  8.   

同样的事情发生在Numbers和Booleans身上。类似的DoNothing函数将返回一种对象。

答案 2 :(得分:5)

strict模式运行代码以获得预期结果!

答案 3 :(得分:1)

我相信这又是字符串文字和字符串之间的区别吗?我曾经在SO:Property value of a String object in JavaScript

中回答了一个问题

答案 4 :(得分:1)

你也可以使用constructor属性:

'foo'.constructor === String; //=>true
'foo'.doNothing().constructor === String; //=>true

另请参阅this SO question和此jsFiddle

如果String.prototype.doNothing()打破期望字符串值的内容,我会使用return String(this)this.toString()this.valueOf()也可以在这里工作)。

答案 5 :(得分:0)

为了更好地了解正在使用的控制台日志,请尝试使用控制台日志:

String.prototype.doNothing = function() {
    console.log(this);
    return this;
};

console.log(typeof 'foo'.doNothing());
console.log(typeof 'foo');

这些是我在Firefox中得到的结果:

foo { 0="f", 1="o", more...}
object
string

因此,在原型中,字符串表示为对象/字符数组(确实有意义。)

在我看来,你是否应该使用toString(由McHerbie建议)或者作为类型String(由mellamokb建议)进行转换,取决于你打算如何处理这个值。我个人倾向于把它作为一个字符串。

答案 6 :(得分:0)

尝试以下方法:

return this + '';

答案 7 :(得分:0)

function print() {
  let str = this;
  console.log(str);
}

String.prototype.print = print;

let a = "hello";
 a.print();//output:"hello"

答案 8 :(得分:-1)

尝试使用return String(this);代替return this;