编辑代码


/* 
    in 的使用  与  hasOwnProperty
 */


const objStr = '对象不能用于for of 中'
const objStr11 = 'for  in 能遍历原型上的数据'

const arrStr = 'for  in 能遍历原型上的数据,数组的原型也是对象,一般不使用for  in遍历数组'



let obj = {
    name: 'zhansan',
    age: 18
}
Object.prototype.lang = '中文'
for (let i in obj) {
    if (obj.hasOwnProperty(i)) {
        console.log(obj[i])
    }
    console.log(i)
}
console.log('-------------------', objStr11)

// for(let item of obj){
//     console.log(item)
// }
console.log('-------------------', objStr)




/* 
    for ...in 与
    for...of

 */

let arr = [11, 22, 33]
for (let i in arr) {
    console.log(i, '数组上的index')

    if (arr.hasOwnProperty(i)) {
        console.log(arr[i])
    }
}

console.log('------------------- ', arrStr)


for (let item of arr) {
    console.log(item)
}

const zj = '总结:一般情况下不使用for...in方法,因为它会将原型链上的属性值遍历出来,参考in与 hasOwnProperty的差别,而for...of方法因为对象不能使用,一般也只用于数组方法中'
console.log(zj)

console.log('关于call方法的使用')

console.log('------------------- ')


/* 
        this  与  call


 */


this.name = '我是this中的name'
let obj11 = {
    name: '我是obj11中的name',
    getname: function () {
        console.log(this.name)
    }
}


console.log(this, '使用当前this调用obj11中的getname方法')
console.log('------------------- ')

obj11.getname()
console.log('------------------- ')


obj11.getname.call(this)
console.log('------------------- ')


console.log([].slice instanceof Function)
console.log(typeof [].slice)


console.log('------------------- ')
console.log(Math.random)
console.log('------------------- ')

console.log([].concat)



/*
    indexOf findIndex includes
*/


console.log('今天的天气真好,哇哈哈哈')
let arr1 = ['zhangsan', 'lisi', 'zhangsan', 'wangwu', 'lisi']

if (arr1.indexOf('zhangsan') !== -1) {
    console.log(arr1.indexOf('zhangsan'))
} else {
    console.log('bu存在张三')
}

let ttt = arr1.findIndex((item) => {
    return item === 'lisi'
})

console.log(ttt)

console.log('-------------')


if (arr1.includes('wangwu')) {
    console.log('存在')
}

console.log('明天是周日,一天就又过去了,马上要失业了')

/* 
    substring   与  slice  的使用
    从哪里开始到哪里结束不包含最后一位,都不改变原数组
    1.substring 中负数转为0 ,且从数字小到大
    2.slice 接收负数


 */


let strr = 'jintjjnhao'
let arrrr = ['qqq', 'wwww', 'eeee']


console.log(strr.substring(3, -5))
console.log(strr.replace(/j/g, 'n'))



// console.log(strr.slice(0,-1))


console.log(arrrr.slice())


console.log('我是分割线-------------------')
/* 
浅拷贝
1.assign
2.解构
3.for循环

 */

let fo = {
    name: 'zhansan',
    age: 18,
    kid: {
        school: 'kaiming',
        skill: "paint"
    }
}

let foo = {}
Object.assign(foo, fo)

foo.kid['school'] = 'keweixiaoxue'

console.log(fo, '我是fo对象')
console.log(foo, '我是foo对象')


let fooo = { ...foo }
console.log(fooo, '我是fooo对象')


console.log('我是分割线-------------------')
console.log('我是分割线-------------------')
console.log('我是分割线-------------------')


/* 
深拷贝
双重for循环

Object.keys():查看属性,不包括原型链上



 */

let deepClone = {
    name: 'lisi',
    age: 26,
    job: {
        first: 'dianzi',
        second: 'jisuanji'
    },
    skill: ['learning', 'sing', 'dance']
}
Object.prototype.sex = 'nan'
// console.log(deepClone)


function deep(tt) {
    let obj = Array.isArray(tt) ? [] : {}
//for ... in 会遍历出原型链上的属性
//使用hasOwnProperty判断不是自身属性则不进行拷贝
// 所以一般for...in 会与if(hasOwnProperty...)一起使用

//高级用法:可以使用 for...of 与  Object.entries 

    for (let i in tt) {
        // console.log(i)

        if (tt.hasOwnProperty(i)) {
            obj[i] = typeof tt[i] === 'object' ? deep(tt[i]) : tt[i]
        }

    }
    return obj

}

let newobj = deep(deepClone)

deepClone.job['first'] = 'huahua'

newobj.skill[0] =  'daji'

console.log(deepClone, '我是旧对象')
console.log(newobj, '我是深拷贝后的新对象')