当字符串成为“this”时,为什么字符串会被删除?

时间:2011-11-30 18:45:03

标签: javascript

我发现JavaScript的特性(或者我的浏览器的想法):

var s = "Hello, world";

function foo(arg)
{
    console.log(arg);
    console.log(this);
}

foo.call(s, s);

在启用Firebug控制台的情况下运行上述内容,我得到:

Hello, world
String { 0="H", 1="e", more...}

为什么在成为传递给this的{​​{1}}之前,字符串会自动转换为奇怪的对象?

我称之为奇怪对象的原因是因为jQuery对它进行了扼流。例如:

foo

3 个答案:

答案 0 :(得分:4)

this被强制转换为一个对象,即内部调用Object("test")

(function() {
    return this;
}).call("test");

// returns same as `new String("test")` or `Object("test")`
  

if the method is a function in non-strict mode ... primitive values will be boxed*.

请注意,使用严格模式确实会返回原始值:

(function() {
    "use strict";
    return this;
}).call("test") === "test"; // true

  

* Boxing a value of a value allocates an object instance and copies the value into the new object.

答案 1 :(得分:1)

因为this只是一个对象(我知道字符串是对象,但它们也是字符串):

var s = "Hello, world";

function foo(arg)
{
    console.log(typeof arg); // string
    console.log(typeof this); // object
}

foo.call(s, s);

答案 2 :(得分:1)

使用foo.call(s1, s2)时,您正在调用函数foo,并将this关键字设置为s1。由于this必须是一个对象(因此,不是原始值),因此它被转换为String对象。

字符串的各个字符(通过s = "..."s = String("...")创建)可以通过索引访问,因此

String { 0="H", 1="e", more...}

function foo(arg)
{
    console.log(arg);   // passed as "Hello, world"
    console.log(this);  // passed as String("Hello, world")
    console.log(this instanceof String); //True
}

<小时/> 用于演示索引的代码:

var i=0, s = "Hello, world";
for(; i<s.length; i++){
    console.log(i, s[i]);
}
/* Prints:
   0 H
   1 e
    ...
  */
 */