Javascript 方法导致范围错误

Javascript 方法导致范围错误,javascript,Javascript,我正在为每个公式创建一个对象für。公式[0]=start_obj,它是unixtimestamps,公式也是unixtimestamps。在某些情况下,我需要从数组中删除最后一个戳记。我试着用pop()和splice()方法来实现。两者都导致了误差 这是我的代码: var formel_obj = {} ; formel_obj.start_obj = "change=[ (( x1 ))>0 ]; start=[ T(find(change)); T(1) ]; res

我正在为每个公式创建一个对象für。公式[0]=start_obj,它是unixtimestamps,公式也是unixtimestamps。在某些情况下,我需要从数组中删除最后一个戳记。我试着用pop()和splice()方法来实现。两者都导致了误差

这是我的代码:

    var formel_obj = {} ;
    formel_obj.start_obj = "change=[ (( x1 ))>0 ]; start=[ T(find(change)); T(1) ]; res=[start];" ;
    formel_obj.stop_obj = "change=[ (( x1 ))<0 ]; stop=[ T(find(change)); T(1) ]; res=[stop];" ;

var label, formel ;

for(label in formel_obj) {
    formel = formel_obj[label] ;
    this[label] = new Array() ;
    this[label] = wedge.calc.eval_with_timeaxis( formel, tag_x1, {timebase: interval_length, intervals: [ { start: t_axis_start, end: t_axis_stop } ] })[0] ;   // creating for both formel ojects an array from function - see console log
}

last=start_obj[Object.keys(start_obj).length - 1] ;
pre_last=start_obj[Object.keys(start_obj).length - 2] ;

if (last < pre_last) {
    console.log(start_obj.length) ;
    console.log(start_obj) ;
    start_obj.pop() ;       results in Range error , why?
}
我真的不知道为什么;(

有什么想法吗

编辑\u 1:

它是一个运行时数组,请参见控制台中的屏幕。

编辑2:

再次感谢各位,你们的好朋友。我发现这绝对不是一个常规数组。我编写了一个函数,可以将这个混乱的数组(或是其他任何形式的数组)转换成常规数组。这是一个商业软件,我无法直接访问这些“后台函数”。wedge.what.ever()正在做什么。 无论如何,感谢大家在这里进行的闪电般的讨论

以下是转换函数:

function form_reg_array (runtimearray) {
    var item ;
    newarray = new Array() ;
    for (item in runtimearray) {
        newarray.push(runtimearray[item]) ;
    }
    return newarray
}
我称之为:

start_obj=form_reg_array(start_obj)

这将它转换为常规数组!感谢大家的高声思考。

当我运行以下代码(根据您的示例简化)时,它可以工作:

var start=[1446153600、1446163200、1446170400、1446229200、1446270600、1446364200、1446366600、1446415200、1446422400、1446436200、1446452400、1446457200、1446472200、1446133800]
var end=[1446157800、1446164400、1446173400、1446267000、1446363000、1446364800、1446409200、1446421800、1446435000、1446450600、1446456600、1446464400、1446472800、1446133800]
var-element=document.createElement('p');
element.textContent=end.pop();

document.body.appendChild(元素);
ES6文档显示pop不会生成范围错误


您正在调用的pop不是本机数组pop。您必须提供该函数的代码,以便我们提供帮助。此外,由于它不是本机函数,您应该能够使用调试器进入该函数并找到问题的根源。

运行时数组类型显然不支持数组的所有方法,或者不正确

由于它确实具有
length
属性和编号属性,因此您可以自己动手删除最后一项:

start_obj.length--;
delete start_obj[start_obj.length];

此代码也适用于实际数组。减少长度也将删除最后一项,
delete
将没有任何工作要做。

您的start\u obj变量定义在哪里?它是否存在于formel\u obj对象上?您可能试图从未初始化的数组中弹出。
wedge.calc.eval\u随时间变化的数据类型是什么axis(…)[0]
return?您创建了一个数组,但随后将其替换为该值。如果这不是一个数组,则不能将其用作数组。@CameronTinker:start\u obj变量是在循环中创建的:
this[label]=…
where
label==“start\u obj”
@Guffa哈哈,我现在明白了。:)感谢您的快速回复:)。楔块是一种特殊的过程分析软件。看到我上面的编辑很酷,我一直在使用document.write和safari作为一个空的小提琴与控制台日志总是看起来如此。。。未完成。很高兴知道!(哎呀,我不小心删除了我的评论,在^之前阅读了它)document.write可能在沙盒环境(如小提琴)中不起作用。
start\u obj
stop\u obj
变量是在循环中创建的。@Guffa这只有在
this
可启用的上下文中运行时才是真的,还有一个事实是,尽管声明为
this.something
,但它被请求为常规的
something
,它与环境没有连接。@something here:是的,这就是为什么我在问题的注释中问它会返回什么。它归结到这一行,对:
this[label]=wedge.calc.eval_with_timeaxis(formel,tag_x1,{timebase:interval_length,interval:[{start:t_axis_start,end:t_axis_stop}]})[0]
-此行将其设置为不一定是常规数组的内容。@您的猜测和我的一样好。我只知道它看起来很乱,它的作用是任何人都猜得到的,这是指什么,也不知道我们有什么。
start_obj.length--;
delete start_obj[start_obj.length];