Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 一个输出奇怪的线性电路——什么';现在用字符串作为';这个';?_Javascript - Fatal编程技术网

Javascript 一个输出奇怪的线性电路——什么';现在用字符串作为';这个';?

Javascript 一个输出奇怪的线性电路——什么';现在用字符串作为';这个';?,javascript,Javascript,当我使用apply将this设置为一个字符串,然后使用console.log对其进行记录时,我发现了有趣的输出。怎么了 在Chrome的Javascript控制台中 (function(){ return this }).apply("hello"); 输出至: String {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"} 为什么不像我预期的那样“你好” 有趣的是,使用typeof检查此输出: typeof (function(){ return this

当我使用
apply
this
设置为一个字符串,然后使用
console.log
对其进行记录时,我发现了有趣的输出。怎么了

在Chrome的Javascript控制台中

(function(){ return this }).apply("hello");
输出至:

String {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}
为什么不像我预期的那样“你好”

有趣的是,使用
typeof
检查此输出:

typeof (function(){ return this }).apply("hello");
给我
“对象”
,而不是
“字符串”


我猜这是我不理解的
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
参考:(请注意,
ThisBinding
是指函数中的
this
关键字的值)。

引用MDN文章:

这项服务的价值在于为《寻欢作乐》提供服务。请注意,这可能不会 是该方法看到的实际值:如果该方法是 非严格模式代码,null和undefined将替换为 全局对象和基本值将被装箱

这意味着字符串原语被装箱到字符串对象中。要像这样提供原始字符串,您必须强制执行严格模式:

(function(){ "use strict"; return this }).apply("hello"); // "hello"

附带问题:考虑到寂寞的
Javascript
标记,我的问题标题是否是“Javascript:”冗余、无用、烦人?我开始对这件事感到不安了,没必要了除了产生一个
“object”
typeof
之外,像使用字符串原语一样使用字符串对象还有其他后果吗?@ChaseMoskal:有一些小的影响(与它是一个对象而不是它自己的字符串有关),但总的来说几乎是一样的。