Javascript 方法导致范围错误
我正在为每个公式创建一个对象für。公式[0]=start_obj,它是unixtimestamps,公式也是unixtimestamps。在某些情况下,我需要从数组中删除最后一个戳记。我试着用pop()和splice()方法来实现。两者都导致了误差 这是我的代码: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
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]=…
wherelabel==“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];