JavaScript函数调用/ apply with string

时间:2013-02-22 15:38:47

标签: javascript function call this apply

我刚注意到,当我想将字符串作为"this"传递时,无法在JavaScript函数中正确获取该类型。

以下是一个例子:

var str = 'string value';
if (typeof (str) == 'string') {
    alert('string outside');
}

var fn = function(s) {
    if (typeof (str) == 'string') {
        alert('string param');
    }

    if (typeof (this) == 'string') {
        alert('string this');
    }
    else {
        alert(typeof(this));
    }
};

fn.call(str, str);

我看到3条消息:"string outside""string param""object"

我的目标是编写一个"if"语句,其中"this"是字符串。像if (typeof(this) == 'string')这样的东西。这个不起作用,请指出我将在函数内部工作的正确语句。

4 个答案:

答案 0 :(得分:5)

当原始值用作上下文时,它们作为对象嵌入。

来自the MDN on the call function

  

请注意,这可能不是该方法看到的实际值:如果是   method是非严格模式代码中的函数,null和undefined将   被全局对象替换,原始值将被替换   装箱。

如果您想知道对象是否为String类型,请使用:

var isString = Object.prototype.toString.call(str) == '[object String]';

这是对象类型检测的解决方案the MDN recommends

答案 1 :(得分:4)

ES spec强制this关键字引用对象:

  
      
  1. 否则,如果Type( thisArg )不是Object,请将ThisBinding设置为ToObject(thisArg)
  2.   

使用Object.prototype.toString的一种解决方法:

Object.prototype.toString.call( this ) === '[object String]'

Fiddle

答案 2 :(得分:0)

要访问函数的参数,请不要使用this

请改为尝试:

var fn = function(s) {
    if (typeof (s) == 'string') { // "s" is your passed parameter there.
        alert('string param');
    }
};

(显然,您甚至已经为传递的参数指定了名称。)

有关功能和参数的基础知识,请查看this tutorial

答案 3 :(得分:0)

typeof this"object"的原因是this必须始终指向一个对象。这里JavaScript隐式地将字符串强制转换为对象。你想要的是对象的原始值。试试这个:

var str = "string value";

if (typeof str === "string") alert("string outside");

function fn(str) {
    var type = typeof this.valueOf();
    if (typeof str === "string") alert("string param");
    if (type === "string") alert("string this");
    else alert(type);
};

fn.call(str, str);

希望这会有所帮助。请参阅演示:http://jsfiddle.net/BuZuu/