2

我刚刚注意到,当我想将字符串作为 传递时"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

4 回答 4

6

原始值在用作上下文时作为对象嵌入。

MDN 上调用函数

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

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

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

这是MDN 推荐的对象类型检测解决方案。

于 2013-02-22T15:43:09.857 回答
5

ES 规范强制this关键字引用一个对象:

  1. 否则,如果 Type( thisArg ) 不是 Object,则将其设置ThisBindingToObject(thisArg)

一种解决方法Object.prototype.toString

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

小提琴

于 2013-02-22T15:41:44.773 回答
0

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

试试这个:

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

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

查看本教程,了解有关函数和参数的基础知识。

于 2013-02-22T15:47:03.003 回答
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/

于 2013-02-22T15:49:56.457 回答