【发布时间】:2021-08-26 13:05:16
【问题描述】:
我知道 primitive 数据类型 通过引用传递 在 javascript 中不起作用,因此解决方法是将它们包装在对象中。但是考虑一个场景,变量的初始状态是null,然后变量被重新分配为Object。现在,如果将该变量作为参数传递给外部函数,它将作为引用传递还是最终在函数内部成为undefined。
参考这个用例:
在 Login 端点的 mocha 测试中
方法一
describe('Login Endpoint Test', function(){
let response = null;
before('test pre-requisites', async function(){
this.timeout(15000);
response = await endpointCall(); //returns response Object
});
it('simple endpoint test', function(){
//response is availble here.
response.should.have.status(200);
});
/*Importing an external testfile.*/
require('./externalTest.spec.js')(response);
})
在 externalTest.spec.js 中
module.exports = (response) => {
it('external test', function(){
console.log(response); // null;
})
}
如果我将响应包装在 Object 中,它会起作用。为什么会这样?
方法二
如果我将响应包装在 Object 中,它会起作用。为什么会这样?
describe('Login Endpoint Test', function(){
let data = {response: null};
before('test pre-requisites', async function(){
this.timeout(15000);
data.response = await endpointCall(); //returns response Object
});
it('simple endpoint test', function(){
//response is availble here.
data.response.should.have.status(200);
});
/*Importing an external testfile.*/
require('./externalTest.spec.js')(data);
})
在 externalTest.spec.js 中
module.exports = (data) => {
it('external test', function(){
console.log(data.response); // response object;
})
}
注意:如果您发现有不清楚的地方,请告诉我。提前致谢。
【问题讨论】:
-
@ScottMarcus 你能解释一下为什么第一种方法不起作用,而后一种方法成功了吗?
-
Javascript 从不通过引用传递,总是值。关于对象的事情是变量/常量的值本身就是一个引用。因此,对象可用于“模拟”传递引用功能,但前提是代码的不同部分保持相同的对象引用。在您的“非工作”示例中,您正在覆盖该值,即删除引用。在您的工作示例中,您只是更改了被引用对象的属性,并且引用本身被维护。
-
Additional post that further explains 为什么看起来 JavaScript 有传递引用,但实际上没有。
-
@DevDesignerSid 一个空对象应该可以工作。可以这样想:一旦你在回调中执行
response = ...,你的方法就会中断。response.property = ...有效。将response声明为const而不是let以帮助您记住;)
标签: javascript node.js mocha.js javascript-objects chai