数组中选取最小值的问题

在选取数组中最小值的时候,发现如果是下面这样子的代码直接运行在<script> </script>中会有问题。

代码1

<script> 
var name=[12,3,65,8,2,12];
var min = name[0];
for (var i = 1; i <= 1; i++) {
    if (name[i]<min) 
    {
        min = name[i];
    }    
}
    console.log(min);
}
</script>

代码2

<script> 
function test(){
var name=[12,3,65,8,2,12];
var min = name[0];
for (var i = 1; i <= 1; i++) {
    if (name[i]<min) 
    {
        min = name[i];
    }    
}
    console.log(min);
}
}

test();
</script>

2段代码的结果不一样,想知道是为什么呀?

阅读 693
评论
    6 个回答
    • 506

    这是全局变量导致的,我们知道window在<script></script>标签里可以直接使用,其实还有很多这样的全局变量,比如:
    name(默认为空)
    length(默认为0)

    你可能还会纳闷: 那第一种写法为什么得到的是1呢,接下来我们分析下你的代码:

    <script>
        var name=[12,3,65,8,2,12]; // 全局变量
        var min = name[0];
        for (var i = 1; i <= 1; i++) {
            if (name[i]<min){
                min = name[i];
            }    
        }
        console.log(min);
    </script>
    
    // name是在全局里定义的,而name本身就是一个全局变量,而且作为全局变量时只能是字符串,无论赋值什么内容,都会调用 name.toString()方法
    // 所以在for循环之前,name的值是 "12,3,65,8,2,12", 因为循环只进行了一次,所以结果是1

    我们来看第二段代码:

    function test(){
        var name=[12,3,65,8,2,12]; // 局部变量
        var min = name[0];
        for (var i = 1; i <= 1; i++) {
            if (name[i]<min) 
            {
                min = name[i];
            }    
        }
        console.log(min);
    }
    test();
    
    // 在函数内部,name就变成了局部变量,此时可以正常赋值,即for循环之前的值是:[12,3,65,8,2,12],因为循环执行了一次, 12 < 3,所以得到的结果是3

    总结:在定义变量时,最好不要使用name,因为全局下name会被转化为字符串。length是可以使用,记得还有其他的全局变量,感兴趣的话自己搜一下吧。

    有帮助就点赞哦!

      你可以尝试一下这个方法:`const arr = [1, 2, 3, 4, 5, 6];

      min = 100;

      for (var i = 0; i < arr.length; i++) {

      if (arr[i] < min) {
          min = arr[i];
      }

      }
      console.log(min, "这是你想要的结果");`

          var arr=[1,2,3]
          var min = Math.min(..arr)
          console.log(min)

            上面答案都对,另外我在控制台试了一下

            window.name 被修改一次除非页面关闭重开,否则一直是修改后的内容噢,刷新都不行

              var arr = [12,3,65,8,2,12];
              function test(arr){
                  return Math.min.apply(Math,arr);
              }
              test(arr);
              

              感觉这样更简单一点

                撰写回答

                登录后参与交流、获取后续更新提醒