带有奇怪输出的单行 - 字符串作为“这个”是怎么回事
One-liner with Strange Output -- What's going on with strings as 'this'?
当我使用 apply
将this
设置为字符串然后console.log
它时,我发现了有趣的输出。怎么了?
在Chrome的Javascript控制台中,
(function(){ return this }).apply("hello");
输出到:
String {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}
为什么不像我想象的那样"hello"
?
有趣的是,使用 typeof
检查此输出:
typeof (function(){ return this }).apply("hello");
给了我"object"
,而不是"string"
.
我猜那是一些我不懂的apply
魔法?
当 this
的参数在非严格模式下传递时,它会转换为对象,因此它返回一个字符串对象,该对象不同于字符串值。字符串对象中的每个索引按顺序对应于字符串值的字符。 要将其转换回"普通"字符串,只需在其上调用toString()
- 这使它成为您习惯的字符串值。
这在 ES5 严格模式下不会发生(当您在程序或函数的开头插入'use strict'
时),因为在该模式下,参数不是强制给对象的,而是直接给出的。
// if you're not passing any arguments, it doesn't matter whether you use apply or call
(function () { return this; }).call("see"); // { 0: "s", 1: "e", 2: "e" }, plus some other special properties
(function () { return this.toString(); }).call("see"); // "see"
(function () { 'use strict'; return this; }).call("see"); // "see", where strict mode is supported
引用:http://www.ecma-international.org/ecma-262/5.1/#sec-10.4.3(请注意,ThisBinding
是指函数内 this
关键字的值)。
引自 MDN 关于 Function.prototype.apply 的文章:
它的价值为乐趣提供了呼唤。请注意,这可能不是 是方法看到的实际值:如果该方法是 非严格模式代码,null 和未定义将替换为 全局对象和基元值将被装箱。
这意味着字符串原语被装箱到 String 对象中。要提供原始字符串,您必须强制实施严格模式:
(function(){ "use strict"; return this }).apply("hello"); // "hello"
相关文章:
- Javascript袖珍参考,第121页:这是怎么回事;猴子补丁”;方法应该有效
- 基本的HTML Javascript程序.这是怎么回事
- 每次运行此代码时,我都会得到不同的结果,这是怎么回事
- jQuery extend 函数是怎么回事
- “Bada” - 这个JavaScript片段是怎么回事
- 如何使文本字段为空?这是怎么回事
- 自定义SVG签名在CODEPEN上有效,但在本地机器上无效-这是怎么回事
- 事件侦听器不会在IE中被调用 - 这是怎么回事
- HTML 中的空脚本标签是怎么回事
- 这个JavaScript片段是怎么回事
- 调用堆栈超出,甚至没有任何递归.这是怎么回事
- 带有奇怪输出的单行 - 字符串作为“这个”是怎么回事
- 这个速记运算符是怎么回事
- 网站似乎在没有向服务器发送密码的情况下登录用户;这是怎么回事
- 将多个值分配给一个变量.这是怎么回事
- 图片库的图片预装器?这是怎么回事
- 这个CSS渲染阻塞是怎么回事
- Javascript中的回调真的是方法调用吗?如果是的话,他们是怎么回事'级联'
- 有人能解释一下这个for循环是怎么回事吗?
- 这个JS语法是什么意思? 'length'是怎么回事?