我发现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
答案 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
...
*/
*/