Day2青训营练习题

278 阅读4分钟

选择题 1:A
对于一条100M的宽带,理论下载速度上限是多少?
A. 12.5MB/s
B. 100MB/s
C. 10MB/s
D. 10Mb/s

选择题 2:AD
关于 for of 和 for in 的描述,正确的是?
A. for in 可以循环普通对象
B. for of 可以循环普通对象
C. 都不可以循环数组
D. 都可以循环数组

宽带计算

电脑、手机中测试网速时的单位是:MB/s;而运营商的计算单位是:Mb/s,其中 1B=8b。所以100M宽带的下载速度为:100Mb/s ÷ 8 =12.5MB/s (注意,这是理论速度)。

for,forEach,for in和for of

  • foreach 语句是对数组的每个元素执行一次提供的函数。是for语句的特殊简化版本,不能完全取代for语句,但任何foreach语句都可以改写为for语句版本。
  • for...in语句以任意顺序迭代对象的可枚举属性
  • for...of语句遍历可迭代对象定义要迭代的数据
let arr=[111,222,333],obj={a:1,b:2,c:3}

for(var i = 0; i < arr.length; i++){console.log(arr[i])}
//依次打印 111 222 333

arr.forEach((e)=>{console.log(e)})
//依次打印 111 222 333

for(let r in arr){console.log(r)}
//依次打印下标 0 1 2 

for(let k in obj){console.log(k)}
//依次打印属性名 a b c

for(let r of arr){console.log(r)}
//依次打印下标 111 222 333

for(let k of obj){console.log(k)}
//报错 Uncaught TypeError: obj is not iterable 说明for of不能遍历普通对象

简述for in 和 for of 的区别

blog.csdn.net/m0_71231013…

1、推荐在循环对象属性的时候使用 for...in,在遍历数组的时候的时候使用 for...of

  • 使用for in遍历数组得到的是数组下标
  • 遍历顺序有可能不是按照实际数组的内部顺序
  • 使用for in会遍历数组所有的可枚举属性,包括原型
  • in操作符:用来判断一个属性是否是某个对象本身的属性或者是从原型继续下来的,如果是返回true,否则的话,返回false

2、for...in 循环出的是 key ,for...of 循环出的是 value

3、for...of 是 ES6 新特性。修复了 ES5 引入的 for...in 的不足

4、for...of 不能循环普通的对象,会报错(如通过构造函数创造的),需要通过和 Object.keys()搭配使用

比较for、for...in、for...of、forEach的区别

blog.csdn.net/thwr1881/ar…

1、优缺点

  • for

优点:程序简洁,结构清晰,循环初始化,循环变量化和循环条件位置突出。

缺点:结构比while循环复杂,容易出编码错误。

  • forEach

优点:便利的时候更加简洁,效率和for循环相同,不用关心集合下标的问题,减少了出错的效率

缺点:不能同时遍历多个集合,在遍历的时候无法修改和删除集合数据,方法不能使用break,continue语句跳出循环,或者使用return从函数体返回,对于空数组不会执行回调函数

  • for…in

优点:不仅支持数组的遍历,还可以遍历类似数组的对象,支持字符串的遍历最简洁。

缺点:不适用于处理原有的原生对象。

  • for…of

优点:避免了for…in的所有缺点,支持break,continue,return。支持遍历map,object,array,set string等。

缺点:不适用于处理原有的原生对象。

2、区别

四个算法语句区别主要体现在响应break, continue, return上和使用的对象上。

  • for 语句性能最好;能响应break, continue, return控制循环。
  • forEach 无法响应break, continue, return控制循环。
  • for in 无法响应break, continue, return控制循环;for in 主要针对对象,它不仅会循环对象本身的属性,还会查找循环原型上的属性;循环的顺序不确定。
  • for of 能响应break, continue, return控制循环,还能遍历map、set 等类数组,但是不能循环普通的对象

扩展学习 hasOwnProperty()和Object.keys():blog.csdn.net/weixin_4715…

let arr=["一一","二二","三三"]
Array.prototype.addsome=["思思","呜呜"]
for (let i in arr) {
    console.log(arr[i])
}
			
console.log("---------我是华丽丽的分割线---------")
			
for (let j in arr) {
    if(arr.hasOwnProperty(j)){
        console.log(arr[j])
    }
}

image.png

使用for…in遍历时,原型链上的所有属性都将被访问,hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中。这个方法只在给定属性存在于对象实例中时,才会返回true。

一个数据结构只有部署了 Symbol.iterator 属性, 才具有 iterator接口可以使用 for of循环。例子中的obj对象没有Symbol.iterator属性 所以会报错。

部署了 Symbol.iteratoer属性的数据结构:数组 Array、Map、Set、String、arguments对象、Nodelist对象(获取的dom列表集合)

想让对象可以使用for of需要使用 Object.keys()获取对象的 key值集合后,再使用 for of

let obj = {a: '1', b: '2', c: '3', d: '4'}
for (let o of Object.keys(obj)) {
    console.log(o) // a,b,c,d
}

或者使用内置的Object.values()方法获取对象的value值集合再使用for of

let obj = {a: '1', b: '2', c: '3', d: '4'}
for (let o of Object.values(obj)) {
    console.log(o) // 1,2,3,4
}

深拷贝的实现

function deepClone(source){
    if(source === null) return null 
    if(typeof source !== 'object') return source;
    if(source.constructor===Date) return new Date(source); 
    if(source.constructor === RegExp) return new RegExp(source);
    const targetObj = source.constructor === Array?[]:{}
    for(let keys in targetObj){
        if(source.hasOwnProperty(keys)){
            if(source[keys] && typeof source[keys] === 'object'){
                targetObj[keys] = deepClone(source[keys])
            }else{
                targetObj[keys] = source[keys]
            }
        }
    }
}