【问题标题】:JavaScript function call/apply with stringJavaScript 函数调用/应用字符串
【发布时间】:2013-02-08 06:46:39
【问题描述】:

我刚刚注意到,当我想将字符串作为"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') 这样的东西。这一个不起作用,请指出将在函数内部起作用的正确语句。

【问题讨论】:

  • 结局是什么?
  • 我想知道,如果“this”是字符串。我在实际代码中没有参数,只有“this”,所以别无选择。
  • 您到底想达到什么目的? this 是其中的 window 对象。或者更好的是,为什么你需要检查this 是否是一个字符串?它永远不会是一个字符串。
  • 我想知道调用者是否打算传递字符串(即使现在看起来像里面有字符的对象)。
  • 为什么要知道this是一个字符串?

标签: javascript function call this apply


【解决方案1】:

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

来自the MDN on the call function

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

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

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

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

【讨论】:

  • 明白,谢谢。解决方法?想知道调用者打算传递字符串。
  • 这行得通。您的回答将被接受。谢谢! :-) 第一个关注细节的人。
  • @dystroy 我在哪里可以找到关于window.toString 的文档? MDN 似乎缺少 disambiguation page 上的那个。
  • 哦,显然window 派生自 Object。不过,这显然不能在旧 IE 中很好地工作。 stackoverflow.com/questions/1669079/…
  • 我正在使用 Object.prototype.toString,我想这将永远有效。这个答案给了我一个正确的提示。
【解决方案2】:

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

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

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

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

Fiddle

【讨论】:

  • 解决方法?只是想知道至少尝试了该字符串。
  • 我不是说修改,我是说查询,或者区分。
  • 你的意思是测试typeof是否是一个对象字符串?让我看看我能做什么。
  • 感谢这有效,但您是第二个给出正确答案的人。 +1。
  • 好的,谢谢,花了一点时间试图找到正确的对象原型方法。不知道window有window.toString方法,每天都在学习新东西。
【解决方案3】:

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

试试这个:

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

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

查看this tutorial 了解有关函数和参数的基础知识。

【讨论】:

  • 这是示例。我想测试“这个”。但我已经得到了一个可以接受的答案。谢谢!
【解决方案4】:

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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多