关于JS 新人自学有两个小细节的问题

1.书本例题,对一个数组遍历,输出数组里的所有值。答案是这样的:

if (image.length>0){
    for (var x=0; x<image.length; x++){
      //code
    }
}

而我没有写判断语句直接做的循环,因为我想如果image长度是0自然会跳过循环:

for (var x=0; x<image.length; x++){
  //code
}

输出结果是一样的。但是这样做可以么?以后会不会造成什么错误?

2.书本例题,对英文名字重新排版,名字首写字母大写,姓全部大写。名字被split的成数组。
名字的处理上答案是这样的:

name[0] = name[0],slice(0,1).toUpperCase()+name[0].slice(1).toLowerCase();

我写的答案是这样的:

name[0] = name[0][0].toUpperCase()+name[0].slice(1).toLowerCase();

两个得到的结果是一样的。但是这样做可以么?以后会不会造成什么错误?

谢谢您花费时间回答我的问题。谢谢

阅读 2.8k
6 个回答

第一个 你写的只是多出来一个x=0的变量
第二个 如果是空字符串会报错,通过下标获取的方法在低版本ie不兼容也会报错

第一题
if判断类型是否有length属性 并且不为空! 然后再决定是否去循环数组 避免不必要的代码执行
而你写法也可以 只不过少了一层判断 它直接去循环 如果有值就循环 无值就跳出 而且多了var x变量缓存 意义不同

第二题
你是通过字符串的索引去改变首字母的大写 写法没问题
例题是通过slice截取字符去操作首字母大写 结果相同 方法不同 没什么问题

不会造成错误

性能方面忽略,两个答案实际差不多,实际业务需要考虑健壮性,你不能确保image一定是数组,所以可能会报错,或者考虑不是数组的情况应该如何去处理。

if (image.length>0)是为了确认image是可以遍历的,例如下面这个就会报错了(好吧并不会,应该只是判断如果没有长度就不进入循环了,你的写法没啥问题)

var image = {}
for (var x=0; x<image.length; x++){
    // code
}

第二个也是同样的道理,如果name[0]是个空字符串,name[0].slice(0,1)返回的是空字符串"",可以继续后面的操作,但是name[0][0]会返回undefined,执行toUpperCase方法就会报错了。

顺便有更方便的方法:

name.replace(/./, $ => $.toUpperCase());

关于第一个问题,其实我觉得最严谨的写法应该是:
`

if (image && Array.isArray(image) && image.length) {
    //for loop
}

`

你的两个代码都可以,比书上写的简洁和直观,没有问题。
实现相同的功能,代码可以有多种写法,很正常的。就像做数学题,同样解出答案,可能计算方法和计算过程不一样。
至于,你担心程序会不会出错,可以学一学单元测试的知识,对自己写的程序做自动化单元测试,就可以保证代码质量了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题