gpt4 book ai didi

javascript - 具有单个字符串的数组被自动且不期望地转换为仅一个字符串

转载 作者:行者123 更新时间:2023-11-28 06:38:41 26 4
gpt4 key购买 nike

在我的 CasperJS 脚本中,当我通过评估函数将数组传递给我的函数时,它可能有 1 个或多个字符串。当有多个字符串时它按预期工作,但是当数组只有 1 个字符串时它的行为非常奇怪。如果我传递一个内部包含单个字符串的数组,它就变成了字符串。我哪里出错了?

我的 CasperJS 脚本:

function myFunction(input) {
console.log(JSON.stringify(input));
}

//allow console logs through for debugging
casper.on('remote.message', function(message) {
this.echo(message);
});

//get my page
casper.start(...);

//attempt to call myFunction with an array as input
casper.then(function() {
var input = ['#someId'];
this.evaluate(myFunction, input);
});

期望的输出:

["#someId"]

实际输出:

"#someId"

如果 var input = ['#firstId', '#secondId'] 则输出

["#firstId", "#secondId"]

最佳答案

这正是 CasperJS 在只有两个参数时添加的内容:函数和函数参数。如果您传递的一个参数是数组或对象,它将根据 this 尝试“解压”您传递的一个参数。 :

Casper.prototype.evaluate = function evaluate(fn, context) {
...
// function context
if (arguments.length === 1) {
return utils.clone(this.page.evaluate(fn));
} else <strong>if (arguments.length === 2) {
// check for closure signature if it matches context
if (utils.isObject(context) && eval(fn).length === Object.keys(context).length) {
context = utils.objectValues(context);
} else {
context = [context];
}
}</strong> else {
// phantomjs-style signature
context = [].slice.call(arguments, 1);
}
return utils.clone(this.page.evaluate.apply(this.page, [fn].concat(context)));
};

这会导致有趣的行为,如以下完整脚本所示:

var casper = require('casper').create();

casper.on("remote.message", function(msg) {
this.echo("Console: " + msg);
});

casper.start('http://example.com/').then(function(){
var arr = ['#someId'];
var arrm = ['#someId', '#someOtherId'];
var obj = {a:'#someId'};
var objm = {a:'#someId', b:'#someOtherId'};

this.echo("1");
this.evaluate(function(arr) {
console.log(JSON.stringify(arr));
}, arr);

this.echo("2");
this.evaluate(function(arr) {
console.log(JSON.stringify(arr));
}, arrm);

this.echo("3");
this.evaluate(function(obj) {
console.log(JSON.stringify(obj));
}, obj);

this.echo("4");
this.evaluate(function(obj) {
console.log(JSON.stringify(obj));
}, objm);

this.echo("5");
this.evaluate(function(arr, obj) {
console.log(JSON.stringify(arr));
console.log(JSON.stringify(obj));
}, arr, obj);

this.echo("6");
this.evaluate(function(a) {
console.log(JSON.stringify(a));
}, obj);

this.echo("7");
this.evaluate(function(b) {
console.log(JSON.stringify(b));
}, objm);

this.echo("8");
this.evaluate(function(a, b) {
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
}, objm);

this.echo("9");
this.evaluate(function(b, a) {
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
}, objm);
}).run();

输出:

1Console: "#someId"2Console: ["#someId","#someOtherId"]3Console: "#someId"4Console: {"a":"#someId","b":"#someOtherId"}5Console: ["#someId"]Console: {"a":"#someId"}6Console: "#someId"7Console: {"a":"#someId","b":"#someOtherId"}8Console: "#someId"Console: "#someOtherId"9Console: "#someOtherId"Console: "#someId"

请注意,如果对象的键匹配,则对象将按名称解压缩到 evaluate() 回调参数(请参阅测试 8 和 9)。

PhantomJS 本身不进行任何类型的解包。这就是 CasperJS。

关于javascript - 具有单个字符串的数组被自动且不期望地转换为仅一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34038981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com