0

チャットボットを構築しています。スクリプトの一部は次のとおりです

var convpatterns = new Array (
new Array (".*hi.*", "Hello there! ","Greetings!"),
new Array (".*ask me*.", Smoking),
new Array (".*no*.", "Why not?"),

ユーザーが「こんにちは」と入力した場合にわかるように、チャットボットは Hello there または Greetings! のいずれかで応答します。ユーザーが「質問してください」と入力すると、Smoking() 関数にリンクします。

function Smoking(){
window.iSpeech.speak(speakPluginResultHandler,nativePluginErrorHandler,"Do you smoke?");
return field
SmokingAnswer()

}

function SmokingAnswer(){
var userinput=document.getElementById("messages").value;
if (userinput="yes"){
window.iSpeech.speak(speakPluginResultHandler,nativePluginErrorHandler,"Oh no! Smoking is not good for your health!");
}else if(userinput="no"){
window.iSpeech.speak(speakPluginResultHandler,nativePluginErrorHandler,"Good to hear that you are not smoking!");
}
return field
}

したがって、Smoking() 関数内で、チャットボットは口頭でユーザーに「喫煙しますか?」と尋ね、ユーザーが「はい」または「いいえ」と入力できる次の関数 SmokingAnswer() にリンクする必要があります。その後、ユーザーからの応答に基づいて応答します。しかし、今は「質問してください」と入力すると、チャットボットが「タバコを吸いますか?」と尋ねますが、「いいえ」と入力すると、「タバコを吸っていないと聞いてよかったです!」ではなく、チャットボットが「なぜですか?」と言います。新しい配列に基づいています。

更新(提案に基づいて変更されましたが、まだ機能していません):

function initialCap(field) {
field = field.substr(0, 1).toUpperCase() + field.substr(1);
return field
}
function Smoking(){
window.iSpeech.speak(speakPluginResultHandler,nativePluginErrorHandler,"Do you smoke?");
SmokingAnswer()

}

function SmokingAnswer(){
var userinput=document.getElementById("messages").value;
if (userinput=="yes"){
window.iSpeech.speak(speakPluginResultHandler,nativePluginErrorHandler,"Oh no! Smoking is not good for your health!");
}else if(userinput=="no"){
window.iSpeech.speak(speakPluginResultHandler,nativePluginErrorHandler,"Good to hear that you are not smoking!");
}
return field
}
4

1 に答える 1

2

JavaScript での等値比較では==or===演算子を使用します。=は常に割り当て。だからここに:

if (userinput="yes"){

... に代入 "yes"してからuserinput、 if の本体に入ります (これは最終的にif ("yes")であり"yes"、真であるため、ブランチに従います)。そのはず:

if (userinput == "yes"){

また

if (userinput === "yes"){

==との違い===は、==(「緩い」等値演算子) は、必要に応じて (驚くべき方法で) 型強制を行い、オペランドを等しくしようとするが、そうし===ない (異なる型のオペランドは常に等しくない) ことです。

別々に:

function Smoking(){
window.iSpeech.speak(speakPluginResultHandler,nativePluginErrorHandler,"Do you smoke?");
return field
SmokingAnswer()
}

.のにあるSmokingAnswerため、関数がそこで呼び出されることはありません。したがって、関数が呼び出される前に戻るか、未定義であるためエラーがスローされます (コードのどこにも表示されません)。いずれにせよ、呼び出されることはありません。return fieldSmokingSmokingAnswerfieldSmokingAnswer


補足: 初期配列は、配列初期化子を使用してより簡潔に記述できます。

var convpatterns = [
    [".*hi.*", "Hello there! ","Greetings!"],
    [".*ask me*.", Smoking],
    [".*no*.", "Why not?"],
    // ...
];

正規表現リテラルを使用した 2 層のエスケープについて心配する必要がないため、文字列ではなく (/.*hi.*/の代わりに)正規表現リテラルを調べることもできます。".*hi.*"

于 2016-02-24T05:15:02.283 に答える