Я использую Qt 5.11.2, в моем приложении я использую QJSEngine, в моем примере у меня есть скрипт:
function connect() {
console.info("-----------");
if ( strFirstScan.localeCompare("true") == 0 ) {
console.info("First scan");
strFirstScan = "false";
a = eval(a);
b = eval(b);
c = eval(c);
}
console.info("strFirstScan: " + strFirstScan + ", typeof: " + typeof strFirstScan);
console.info("a: " + a + ", typeof: " + typeof a);
a++;
console.info("b: " + b + ", typeof: " + typeof b);
console.info("c: " + c + ", typeof: " + typeof c);
console.info("-----------");
}
Я подключил этот скрипт к кнопке в приложении, когда я нажимаю на кнопку, функция connect () вызывается скриптом. Я зарегистрировал некоторые глобальные переменные для использования со сценарием:
strFirstScan = "true"a = 123
b = "Hello"c = {"a":1,"b":"A","c":{"aa":1}}
Вывод из приложения-скрипта при нажатии кнопки:
2018-12-28 09:55:10.079663+0000 XMLMPAM[2470:247691] [js] -----------
2018-12-28 09:55:10.079718+0000 XMLMPAM[2470:247691] [js] strFirstScan: "true", typeof: string
2018-12-28 09:55:10.079742+0000 XMLMPAM[2470:247691] [js] a: 123, typeof: string
2018-12-28 09:55:10.079775+0000 XMLMPAM[2470:247691] [js] b: 'hello', typeof: string
2018-12-28 09:55:10.079804+0000 XMLMPAM[2470:247691] [js] c: {"a":1,"b":"A","c":{"aa":1}}, typeof: string
2018-12-28 09:55:10.079832+0000 XMLMPAM[2470:247691] [js] -----------
Я никогда не вижу «Первое сканирование», и типы переменных остаются строковыми, поскольку они не доходят до операторов eval.
Почему не работает сравнение? Я пробовал несколько альтернатив:
if ( strFirstScan == "true" ) {
а также
if ( strFirstScan.compare("true") == 0 ) {
Ничто из этого не лучше, почему сравнение не работает?
[Редактировать] Я изменил скрипт на: function connect() {
console.info("-----------");
if ( typeof strFirstScan == "string" ) {
console.info("First scan");
console.info("strFirstScan: " + strFirstScan + ", typeof: " + typeof strFirstScan);
strFirstScan = 0;
a = eval(a);
b = eval(b);
c = eval(c);
}
console.info("a: " + a + ", typeof: " + typeof a);
a++;
console.info("b: " + b + ", typeof: " + typeof b);
console.info("c: " + c + ", typeof: " + typeof c);
console.info("-----------");
}
С таким скриптом я получаю следующее:
2018-12-28 10:22:31.267553+0000 XMLMPAM[2993:335615] [js] -----------
2018-12-28 10:22:31.267595+0000 XMLMPAM[2993:335615] [js] First scan
2018-12-28 10:22:31.267629+0000 XMLMPAM[2993:335615] [js] strFirstScan: "true", typeof: string
2018-12-28 10:22:31.267804+0000 XMLMPAM[2993:335615] [js] a: 123, typeof: number
2018-12-28 10:22:31.267832+0000 XMLMPAM[2993:335615] [js] b: hello, typeof: string
2018-12-28 10:22:31.267877+0000 XMLMPAM[2993:335615] [js] c: [object Object], typeof: object
2018-12-28 10:22:31.267897+0000 XMLMPAM[2993:335615] [js] -----------
Однако, если я добавлю какое-либо сравнение к условию if, сравнивая строку с «true», if не переходит в первое условие сканирования.
[Edit2] Я изменил свой код, который создает глобальную переменную ‘strFirstScan’, чтобы: pobjScriptEng->globalObject().setProperty("strFirstScan", QJSValue("true"));
Это теперь решает проблему и мой скрипт:
if ( strFirstScan == "true" ) {
Работает.
Судя по выводу вашей программы, strFirstScan
не является true
, скорее "true"
,
Вы можете убедиться в этом, добавив кавычки вокруг его значения в выводе журнала. т.е .: console.info("strFirstScan: '" + strFirstScan + "', typeof: " + typeof strFirstScan);
Вот фрагмент, чтобы продемонстрировать вашу проблему:
var yourCase = '"true"';
console.info('value: ' + yourCase + ', type: ' + typeof yourCase + ', len: ' + yourCase.length);
console.info(yourCase === "true");
var youWant = 'true';
console.info('value: ' + youWant + ', type: ' + typeof youWant + ', len: ' + youWant.length);
console.info(youWant === "true");
Я изменил свой код, который создает глобальную переменную ‘strFirstScan’, чтобы:
pobjScriptEng->globalObject().setProperty("strFirstScan", QJSValue("true"));
Это теперь решает проблему и мой скрипт:
if ( strFirstScan == "true" ) {
Это решает проблему, и теперь она работает.