質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

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

Q&A

解決済

5回答

2344閲覧

変数の範囲を設けたい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

1クリップ

投稿2020/06/22 10:04

変数nに1以上6以下の数字を入れたいです。
どうすればよいのでしょうか。

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

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

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

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

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

Lhankor_Mhy

2020/06/22 10:06

もう少し詳しくお願いします。 n=1; とすれば、「1以上6以下の数字」が入ったことになると思いますが、そういうことではないですよね? 乱数とかそういう話ですか?
y_waiwai

2020/06/22 10:15

あまりに説明不足すぎです そもそもなにをしたくてそれをするんでしょうか
退会済みユーザー

退会済みユーザー

2020/06/22 10:16

僕もわからないです。 すみません
yambejp

2020/06/22 10:31

質問者が命題の意味を理解していないものは、正しい回答をしてもそれが 正解かどうか検証できないので、質問自体が無意味です
takasima20

2020/06/22 10:43

ひょっとしてバリデーション機能を実装しる、みたいな課題かな?
miyabi_takatsuk

2020/06/22 12:29 編集

変数にその範囲でしか、となれば、typescript使わないと無理では。 乱数ならできるかと思いますが。
think49

2020/06/22 23:40

@ytjty さん 課題を出した人に、詳細を確認して下さい。 質問を「編集」して、情報を追記して下さい。
guest

回答5

0

むりくりやってみました。
一応エラー吐きます。

ただし、ブラウザ環境限定かと。
ブラウザでなくてもいけるようにしました。

javascript

1{ 2let _n = 1; 3Object.defineProperty( 4 this, 5 'n', 6 { 7 get(){return _n;}, 8 set(newVal){ 9 newVal = Number(newVal); 10 if (isNaN(newVal) || newVal < 1 || newVal > 6) throw new RangeError('The value to asign must be number between 1 and 6.'); 11 12 _n = newVal; 13 }, 14 configurable: true, 15 enumerable: true 16 } 17); 18} 19 20n = 2; 21n = 7; // エラー 22 23console.log(n);

think49さん >
度々のご指摘、大変にありがとうございます。
自分自身、大変に勉強になりました。
もっと自身も精進します 苦笑

投稿2020/06/22 18:23

編集2020/06/23 04:35
miyabi_takatsuk

総合スコア9555

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

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

think49

2020/06/22 23:28 編集

@miyabi_takatsuk さん ネタに完成度を求めるのが間違いかもしれませんが…。 > ただし、ブラウザ環境限定かと。 window を Function('return this')() に変更すれば、非ブラウザ環境でも動作すると思います。 > if (newVal < 1 || newVal > 6) { NaN値とNumber型以外の型、が考慮されていないようです。 // 修正案 newVal = Number(newVal); if (isNaN(newVal) || newVal < 1 || newVal > 6) { > throw new Error('Number size error !'); RangeError が妥当だと思います。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RangeError エラーメッセージは (1).toString(1000) が参考になるかもしれません。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toString > _n = newVal; 余所のコードがグローバル変数 _n を書き換える事を許しています。 変数 _n をブロックスコープか関数スコープに閉じ込めると、余所からの改変を禁止出来ます。
miyabi_takatsuk

2020/06/23 00:35

ご指摘とご提案ありがとうございます! 自分の試料のためにも改良やってみます。
think49

2020/06/23 04:16

@miyabi_takatsuk さん 最後の指摘以外は反映されていることを確認しました。 「ブロックスコープに閉じ込める」はこういう事です。 --- // ここはグローバルコードとする {  let _n;  Object.defineProperty(this, 'n',{// thisはグローバルオブジェクト   get(){return _n;},   set(newVal){    newVal = Number(newVal);    if (isNaN(newVal) || newVal < 1 || newVal > 6) throw new RangeError('The value to asign must be number between 1 and 6.');    _n = newVal; // ブロックスコープの変数 _n を書き換える(throw new RangeErrorで強制終了する為、elseは省略可)   }  }, configurable: true, enumerable: true}); }
miyabi_takatsuk

2020/06/23 04:29 編集

すみません、ありがとうございます・・・! いろいろと試行錯誤していたところでした。 そうか、その時点でのthisはグローバルのものを刺せるから、 ブロックスコープからも参照できるわけですね 汗。 頭固かった・・・。 修正させていただきます!
guest

0

変数は厳しいですがクラスのメンバ変数ならゲッタ/セッタで設定はできますが・・・

投稿2020/06/22 10:41

yambejp

総合スコア116724

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

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

yambejp

2020/06/22 10:42

class myclass{ set n(x){ this._n=(typeof x=="number" && parseInt(x)==x && x>=0 && x<=6)?x:null; } get n(){ return this._n; } } var c=new myclass; c.n=5; console.log(c.n);//5が返る c.n="5"; console.log(c.n);//文字列なのでnullが返る c.n=2.5 console.log(c.n);//整数ではないのでnullが返る c.n=7 console.log(c.n);//範囲外なのでnullが返る
guest

0

nにそれ以外のものを代入しようとしたら、エラーになって欲しいという意味なら、無理です。

投稿2020/06/22 10:19

otn

総合スコア85901

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

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

0

ベストアンサー

paizaの講習見たらできました!

投稿2020/06/26 04:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kei344

2020/06/26 04:38

【質問をした後に自己解決してしまった --- ヘルプ|teratail(テラテイル)】 https://teratail.com/help#resolve-myself > 後から読む人のためにも、具体的な解決手順を記載してください。
退会済みユーザー

退会済みユーザー

2020/06/26 04:39

すみません
kei344

2020/06/26 09:50

回答は修正できるので、修正しましょう。
退会済みユーザー

退会済みユーザー

2020/06/26 09:53

了解です。 すみません。
m.ts10806

2020/06/27 01:02 編集

1文字ずつ離して書けば日本語が理解できますか? 回 答 は 編 集 で き ま す 。 後 か ら 読 ん だ 人 が 何 の 参 考 に も な ら な い ゴ ミ 投 稿 な の で 具 体 的 な 解 決 手 順 を 記 載 し て く だ さ い 。 どこにも「謝れ」ってありません。 謝る行動は誤りです(誰も求めてないから)通報しときますね。
退会済みユーザー

退会済みユーザー

2020/06/27 02:13

誤る行動は誤りですか。 駄洒落うまいですね。 面白くて笑っちゃいましたすみません
guest

0

乱数がほしいのですか?
Math.random()

投稿2020/06/22 10:15

SHOMI

総合スコア4079

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問