🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

6回答

1974閲覧

javascript 致命的な欠陥を発見

xmg

総合スコア20

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

2グッド

2クリップ

投稿2020/12/21 04:04

<症状>
初歩的な計算が破壊的な異常動作をします。

具体例を下記に

<問題を再現するための簡易コード>

<!DOCTYPE html><html> <head><meta charset="UTF-8"> <script> function readInput(iD) { return ( document.getElementById( iD ).value ) ; } function writeElm(iD, x) { document.getElementById( iD ).innerHTML = x ; } function test01( ) { var A = readInput( "Read01" ) ; var B = readInput( "Read02" ) ; if ( A > B ) writeElm( "write01", "A > B" ) else if ( A < B ) writeElm( "write01", "A < B" ) } </script> </head> <body> <h1>test</h1> A: <input id= "Read01" type=text > ... B: <input id= "Read02" type=text > <p></p> . . . please enter 11 in A . . . . . . . . . please enter 4 in B . . . . <p></p> <button onclick= "test01()" >ENTER</button> <p></p> <div id="write01" class="" ></div> </body> </html>

<この問題を発見した経緯>
自作のスクリプトが想像不可能なほどの異常動作をしているため
問題の根源がどこにあるのかを探索するために半日もかかってしまいました。

ありとあらゆる異常原因を手当たり次第に確かめたところ
病巣が javascript 本体にあるように思われました。

<質問の理由>
このようなプログラムの正常動作を脅かす基本的構造上の欠陥が確認されたとすれば
どなたかが ECMA などに通報していただけますでしょうか。

本質的な問題解決にあたっては、
変数名定義を他の言語と同じように型別に宣言することが不可欠と思われます。

const や let のような小手先の処理をするのではなく
var 定義を全面的に廃止して
int, real, string などを変数名の定義に用いることが必要と思われます。

よろしくお願いします。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2020/12/21 04:22

既存言語の仕様が気に入らないならllvmとかで俺様仕様の言語作ったらいいんじゃないですかね
退会済みユーザー

退会済みユーザー

2020/12/21 05:09

言語のバグだということにできれば、実はバグを作ったのは自分なのに自分の責任を回避できると思ってます?
gentaro

2020/12/21 05:53

むしろ質問者の致命的なバグが発見されとるやん
guest

回答6

0

本質的な問題解決にあたっては、

変数名定義を他の言語と同じように型別に宣言することが不可欠と思われます。

なら、TypeScriptを使いましょう。

投稿2020/12/21 04:12

maisumakun

総合スコア145975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

仕様です。

文字列は Unicode 値を使用した標準的な辞書順に基づいて比較されます。

比較演算子 - JavaScript | MDN

数値として比較したいなら、型変換を行ってください。

投稿2020/12/21 04:12

Lhankor_Mhy

総合スコア36946

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

変数に型があっても、文字列同士の比較であれば、"11"<"4"なので解決しませんよ。

追記:
もしかすると、
数値型変数に文字列値を代入したら、代入時に自動的に数値型に変換して欲しいということですかね?
それば駄目な仕様でしょう。明示的に型変換を書かないといけない仕様にすべきでしょう。

投稿2020/12/21 04:37

編集2020/12/21 04:42
otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

初歩的な計算が破壊的な異常動作をします。

おそらく下記の箇所で11 < 4となってしまうことを指しているのだと思います。

js

1function test01( ) { 2 var A = readInput( "Read01" ) ; 3 var B = readInput( "Read02" ) ; 4 5 if ( A > B ) writeElm( "write01", "A > B" ) 6 else 7 if ( A < B ) writeElm( "write01", "A < B" ) 8}

Javascriptが動的型付けである以上、これは欠陥ではなく文字列として"11""4"を比較した結果なのでparseIntすればいいのかなと思います。
既にある回答の通り型を付けたいのならTypescriptを使えばよいです。

投稿2020/12/21 04:15

nekoniki

総合スコア2411

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

valueは文字列型です。

投稿2020/12/21 04:25

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

"11"と"4"を比較するんですよね
文字列の先頭から比較するわけですから
"1"<"4"ですか"11"<"4"です

投稿2020/12/21 04:14

yambejp

総合スコア116694

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問