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

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

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

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

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

Q&A

3回答

3562閲覧

分割代入の代用となる手法について(ES5)

maisumakun

総合スコア145121

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

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

1グッド

2クリップ

投稿2017/07/01 13:46

ES6では、変数宣言時に分割代入ができるようになっています。

javascript

1// ES%での書き方 2var foo = obj.foo, bar = obj.bar, baz = obj.baz; 3 4// ES6の分割代入 5const { foo, bar, baz } = obj;

ふつうにES5で書こうとすればfooなどは2回書く必要がありますが、これを一度で済ませる方法はないでしょうか(あまり速度は気にしなくて構いません)。

なお、グローバルスコープであればwindow経由で変数アクセスもできるのですが、ローカルスコープではそうもいきません。さらには、strictモードだとevalで宣言した変数も外側のスコープに出てこないので、これも役に立ちません。

yohhoy👍を押しています

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

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

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

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

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

guest

回答3

0

私が知る限りでは、ES5 でローカル変数を作る方法は、VariableStatementeval() だけなので不可能だと思います。

(あまり速度は気にしなくて構いません)。

速度を気にしなくて良いのなら、「分割代入せずに obj.foo のまま参照する」という手法がとれるはずなので、私も「何を目的としているのか」は気になりました。
あるいは、「Babel でトランスコンパイルしてみては?」という回答も出てきそうですが、maisumakun さんが Babel をご存じないとも思えないので、分割代入する先にある目的を明らかにすると良い気がします。

Re: maisumakun さん

投稿2017/07/03 15:39

think49

総合スコア18156

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

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

0

さすがにこれは、ダメ、ですよね……?

javascript

1var obj = {baz:0, bar:1}; 2 3(function(f) { 4 var args = f.toSource().match(/function.*\((.+?)\)/)[1].split(',').map(function(e){return e.trim()}); 5 return function(obj){ 6 return f.apply(this, args.map(function(e){ 7 return obj[e]; 8 })); 9 } 10})( 11 12 //ここでローカルスコープを作る。 13 function(foo, bar, baz){ 14 //ここになんか書く。 15 return {foo:foo, bar:bar, baz:baz}; 16 } 17 18)( 19 20 //ここにオブジェクトを置く。 21 obj 22 23) 24 25//{foo:(void 0), bar:1, baz:0}

投稿2017/07/04 02:26

Lhankor_Mhy

総合スコア35865

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

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

0

どういった状況でどういった回答を期待されているかわからないのですが、変数名をソートしてしまうとか。

JavaScript

1var obj = {foo:1,bar:2,baz:3}; 2var i = 0 3 // 変数名をソート順に登録する 4 , bar = obj[Object.keys(obj).sort()[i++]] 5 , baz = obj[Object.keys(obj).sort()[i++]] 6 , foo = obj[Object.keys(obj).sort()[i++]] 7 ; 8console.log(foo,bar,baz); // 1 2 3 9```**動くサンプル:**[https://jsfiddle.net/d1pj1oyn/](https://jsfiddle.net/d1pj1oyn/) 10 11--- 12 13この手もあった。(私なら使わないけど) 14 15```JavaScript 16var obj = {foo:1,bar:2,baz:3}; 17with( obj ) { 18 console.log(foo,bar,baz); // 1 2 3 19} 20```**動くサンプル:**[https://jsfiddle.net/d1pj1oyn/1/](https://jsfiddle.net/d1pj1oyn/1/)

投稿2017/07/03 15:23

編集2017/07/03 17:26
kei344

総合スコア69364

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問