javascript - JavaScript 应用()
问题描述
当我分别将数组和对象传递给 function.apply() 时,我得到 NaN 的 o/p,但是当我执行对象和数组时,我得到一个数字。为什么会这样?
由于数组也被视为对象,为什么我不能用它来表示来自同一上下文的数组/
我试过改变变量调用的位置,但我知道顺序只有在它是参数时才重要。
function add() {
return arr[0] + arr[1] + this.a + this.b;
}
let obj = {
a: 1,
b: 2
};
let arr = [1, 2];
console.log(add.apply(arr, obj));
console.log(add.apply(obj, arr));
输出/输出
NaN
6
解决方案
也许图表可以提供帮助。您的函数不使用任何参数,因此您在第二个参数中提供的apply
内容(应该是一个值数组)并不重要。只有第一个参数(this
在函数体中)很重要。
当您调用 with 时arr
,然后this
指向arr
参数中提供的对象,但arr
也指向同一个对象,因为它是全局的并且不会在任何地方被覆盖:
function add() {
// 1 + 1 + undefined + undefined //=> NaN
return arr[0] + arr[1] + this.a + this.b;
} // | | | |
// +------+--------+---------+-----------+
// |
// V
let arr = [1, 2]; let obj = {a: 1, b: 2};
// ^
// `-----Nothing points to this
add.apply(arr) // equivalent to `add.apply(arr, obj)`, since `add` ignores parameters
当您调用 with 时obj
,然后this
指向obj
参数中提供的,并arr
再次指向全局arr
对象:
function add() {
// 1 + 2 + 1 + 2 //=> 6
return arr[0] + arr[1] + this.a + this.b;
} // | | | |
// +------+--------+ +-----------+
// | |
// V V
let arr = [1, 2]; let obj = {a: 1, b: 2};
add.apply(obj) // equivalent to `add.apply(obj, arr)`, since `add` ignores parameters
推荐阅读
- azure-devops - Azure DevOps 用户管理
- docker - 无法从 MacOS 中的主机访问 tezos 节点(在 Docker 中)
- java - 用列表转换对象
到不可变列表 - python - 关于自动化无聊的东西的问题:第 4 章
- python - Scipy: signal.detrend (type='constant' ) 究竟做了什么时间序列数据集,我可以在 python 中反转 signal.detrend 吗?
- elasticsearch - 如何将我的输入语句转换为 json 以将其作为输出参数传递?
- hl7-fhir - 将批量数据发送到 Azure FHIR 服务器
- c# - Microsoft 如何从 DLL 的元数据中隐藏 C# 内部类?
- regex - 正则表达式在拆分所有大写字母时仅找到 1 个匹配项
- python - 是否有一个 Python 函数可以在两个相等长度的字符串之间进行所有可能的替换?