我刚注意到,当我想将字符串作为"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')
这样的东西。这个不起作用,请指出我将在函数内部工作的正确语句。
答案 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
关键字引用对象:
- 否则,如果Type( thisArg )不是Object,请将
醇>ThisBinding
设置为ToObject(thisArg)
。
使用Object.prototype.toString
的一种解决方法:
Object.prototype.toString.call( this ) === '[object String]'
答案 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/