Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么值会使该函数崩溃?_Javascript_Arrays_Crash_Duplicates - Fatal编程技术网

Javascript 什么值会使该函数崩溃?

Javascript 什么值会使该函数崩溃?,javascript,arrays,crash,duplicates,Javascript,Arrays,Crash,Duplicates,我正在考虑使用以下功能: function delDups(arr){ var out=[],obj={}; for(var i=0,len=arr.length;i<len;i++){ obj[arr[i]]=0; } for(i in obj){ out.push(i); } return out; } 函数增量(arr){ var out=[],obj={}; 对于(var i=0,len=arr.l

我正在考虑使用以下功能:

function delDups(arr){
    var out=[],obj={};

    for(var i=0,len=arr.length;i<len;i++){
        obj[arr[i]]=0;
    }
    for(i in obj){
        out.push(i);
    }
    return out;
}
函数增量(arr){
var out=[],obj={};

对于(var i=0,len=arr.length;i嗯,如果
arr
不是类似数组的对象(例如,具有
length
和索引属性),它将崩溃


然而,当
arr
中的数据不是字符串数组时,它也可能不会像您所期望的那样。在这种情况下,您将得到一个只包含字符串的数组,原始对象及其数据类型将丢失。但它不会崩溃…

如果
arr
不是一个类似数组的对象(例如,使用
长度
和索引属性)它将崩溃


但是,当
arr
中的数据不是字符串数组时,它也可能不会达到您预期的效果。在这种情况下,您将获得一个仅包含字符串的数组,原始对象及其数据类型将丢失。但它不会崩溃…

呜呼!我崩溃了它,我的奖品在哪里

var arr3 = delDups(eval());

呜呜!我撞坏了,我的奖品呢

var arr3 = delDups(eval());

崩溃不是执行代码带来的唯一不方便的结果。还有(可能更重要的)有趣的情况是,代码运行时返回的结果不正确。您的分析可能类似于:

for(var i=0,len=arr.length;i<len;i++){ 
function delDups(arr) {
    var out=[],obj={};
    var len = arr && arr.length;

    if (len && len > 0) { 

        for(var i=0; i<len; i++) {
            obj[arr[i]] = 0;

        for (i in obj) {

            if (obj.hasOwnProperty(i)) {
                out.push(i);
            }
        }
    }
    return out;
}
在这一行中,求值结果
arr[i]
被用作属性名,因此无论该表达式返回什么不适合作为属性名的内容,您都会得到一个错误,例如,如果
arr[i]
是一个ActiveX对象,可能会出现意外结果。如果它是本机对象,则该值将是调用其toString方法的结果,该方法可能会为不同的对象提供相同的值,或出现错误,或“仅工作”

将迭代obj的所有可枚举属性,包括其继承的属性。如果将可枚举属性添加到Object.prototype,它将出现在循环中,因此通常使用hasOwnProperty测试来筛选继承的属性

测试错误的程度取决于您希望代码在其中使用的环境。如果您有合理的控制,并记录了预期传递给函数的值(例如,基元值数组),则执行最小(或不)操作是合理的测试输入值。如果有人传入一个ActiveX对象而不是数组,并且它崩溃了,您将用“RTFM”响应

另一方面,如果已知代码将在库中不受控制和广泛变化的情况下使用,那么测试输入是否具有非负的数值长度属性似乎是明智的,向for..in循环添加hasOwnProperty测试也是明智的

您在使代码健壮性方面投入了多少时间和精力取决于您希望代码在何处运行,但是在前面添加一些合理和明显的检查可能会避免以后的一些痛苦。因此,我会做如下操作:

for(var i=0,len=arr.length;i<len;i++){ 
function delDups(arr) {
    var out=[],obj={};
    var len = arr && arr.length;

    if (len && len > 0) { 

        for(var i=0; i<len; i++) {
            obj[arr[i]] = 0;

        for (i in obj) {

            if (obj.hasOwnProperty(i)) {
                out.push(i);
            }
        }
    }
    return out;
}
函数增量(arr){
var out=[],obj={};
var len=arr&&arr.length;
如果(len&&len>0){

for(var i=0;i崩溃并不是执行代码时唯一不方便的结果。还有(可能更有趣)的情况是代码运行但返回错误结果。您的分析可能类似于:

for(var i=0,len=arr.length;i<len;i++){ 
function delDups(arr) {
    var out=[],obj={};
    var len = arr && arr.length;

    if (len && len > 0) { 

        for(var i=0; i<len; i++) {
            obj[arr[i]] = 0;

        for (i in obj) {

            if (obj.hasOwnProperty(i)) {
                out.push(i);
            }
        }
    }
    return out;
}
在这一行中,求值结果
arr[i]
被用作属性名,因此无论该表达式返回什么不适合作为属性名的内容,您都会得到一个错误,例如,如果
arr[i]
是一个ActiveX对象,可能会出现意外结果。如果它是本机对象,则该值将是调用其toString方法的结果,该方法可能会为不同的对象提供相同的值,或出现错误,或“仅工作”

将迭代obj的所有可枚举属性,包括其继承的属性。如果将可枚举属性添加到Object.prototype,它将出现在循环中,因此通常使用hasOwnProperty测试来筛选继承的属性

测试错误的程度取决于您希望代码在其中使用的环境。如果您有合理的控制,并记录了预期传递给函数的值(例如,基元值数组),则执行最小(或不)操作是合理的测试输入值。如果有人传入一个ActiveX对象而不是数组,并且它崩溃了,您将用“RTFM”响应

另一方面,如果已知代码将在库中不受控制和广泛变化的情况下使用,那么测试输入是否具有非负的数值长度属性似乎是明智的,向for..in循环添加hasOwnProperty测试也是明智的

您在使代码健壮性方面投入了多少时间和精力取决于您希望代码在何处运行,但是在前面添加一些合理和明显的检查可能会避免以后的一些痛苦。因此,我会做如下操作:

for(var i=0,len=arr.length;i<len;i++){ 
function delDups(arr) {
    var out=[],obj={};
    var len = arr && arr.length;

    if (len && len > 0) { 

        for(var i=0; i<len; i++) {
            obj[arr[i]] = 0;

        for (i in obj) {

            if (obj.hasOwnProperty(i)) {
                out.push(i);
            }
        }
    }
    return out;
}
函数增量(arr){
var out=[],obj={};
var len=arr&&arr.length;
如果(len&&len>0){

对于(var i=0;Ilso),我修改了函数(我将
var I
移动到第一个循环中……我是否也需要将
var I
放在第二个循环中?您不需要将
var
声明放在第二个循环中。JavaScript将变量声明提升到函数顶部,因此想象一下JavaScript在函数顶部插入行
var I;
)。但也就是说,最好是自己在顶部声明,或者为了一致性起见为每个for循环声明。@Anurag会用我正在使用的代码创建一个全局
i
?不是全局
i
。它将是整个
delDups
函数的局部。@Anurag抱歉再次打扰您,但是,会吗这意味着第二个
i
与第一个声明的
var i
不同(因为我喜欢尽可能地回收var),同时,我修改了该函数(我将
var i
移动到第一个循环内…我是否也需要将
var i
放在第二个循环上?您需要