三元条件中出现意外的令牌中断

unexpected token break in ternary conditional

本文关键字:意外 令牌 中断 三元 条件      更新时间:2023-09-26

下面的函数旨在将(可能嵌套的)对象的值作为数组返回,列表参数是任何对象。如果我把break语句移到for循环之后,我不会得到任何错误,但当然,我的函数不会按需要运行。我使用break的方式有什么问题?

function listToArray(list) {
    var objectArray = [];
    function objectPeeler() {
        let peel = Object.getOwnPropertyNames(list);
        for(var i = 0; i < peel.length; i++) {
            list[peel[i]] && typeof list[peel[i]] != 'object' ? 
                objectArray.push(list[peel[i]]): 
                list[peel[i]] ? 
                    (list = list[peel[i]], objectPeeler()) :
                    break;
        }
    return objectArray;
    }
    objectPeeler();
}

如果其他人有这个问题:三元运算符只适用于值表达式,而不适用于语句(如break),并且不适用于这些情况。

这项工作:

function listToArray(list) {
    var objectArray = [];
    function objectPeeler() {
        let peel = Object.getOwnPropertyNames(list);
        for(var i = 0; i < peel.length; i++) {
            list[peel[i]] != null && typeof list[peel[i]] != 'object' ? 
                objectArray.push(list[peel[i]]): 
                list[peel[i]] ? 
                    (list = list[peel[i]], objectPeeler()): null;
        }
    }
    objectPeeler();
    return objectArray;
}

但是使用jquery.next方法可以得到更好的解决方案:

function listToArray(list) {
  var array = [];
  for (var obj = list; obj; obj = obj.next)
    array.push(obj.value);
  return array;
}

为什么不写这样的东西:

var obj = { 0: "a", 1: "b", 2: "c"}; //test target
var objectArray = [];
var keyArray = Object.getOwnPropertyNames(obj);
for (var i = 0; i < keyArray.length; i++)  objectArray.push(obj[keyArray[i]]);
console.log(objectArray);  // test result