jsオブジェクトobj is not iterable問題は、拡張演算子を使用してオブジェクト解決方法を展開できず、オブジェクトの反復器(面接問題)を定義します.

1203 ワード

に質問
オブジェクトに拡張演算子を使用すると、TypeError:obj is not iterableという異常が投げ出されることに気づきました.これも面接問題です.問題は次のとおりです.
タイプエラーを起こさずに、次の文の展開演算を何らかの方法で使用できますか?
エラー・コードの例です.
let obj = { x: 1, y: 2, z: 3 }
console.log([...obj]) // TypeError

問題を解く知識点
Symbol.iteratorは、各オブジェクトのデフォルトの反復器を定義します.この反復器はfor...ofでリサイクルすることができる.
Reflect.ownKeysスタティックメソッドReflect.ownKeys()は、ターゲットオブジェクト自体のプロパティキーからなる配列を返します.
解答を解く
  • next法は反復器iteratorの1つの方法
  • である.
  • は、少なくとも1つのオブジェクトを返し、オブジェクトにはvalue&done
  • の2つのプロパティがあります.
  • value反復値
  • を定義するために使用される
  • doneブールタイプ:trueを設定すると、直接戻ります.falseを設定または設定しないで、forループのような歩き方を続けます.

  • 答えは次のとおりです.
    var obj = { x: 1, y: 2, z: 3 }
    obj[Symbol.iterator] = function() {
    		return {
    			next:function(){
    				let objArr = Reflect.ownKeys(obj)
    				if (this.index < objArr.length-1) {
    					let key = objArr[this.index];
    					this.index++;
    					return { value: obj[key] };
    				} else {
    					return { done: true };
    				}
    			},
    			index:0
    		}
    }
    console.log([...obj]) // [1, 2, 3]
    

    参照先:
    1.8の経典JavaScript面接問題の解析、あなたは本当にJavaScriptを掌握しましたか?2.MDN-Reflect.ownKeys()3.MDN-Symbol.iterator 4.ES 6学習-新しい構文:Symbols-Symbol.iterator