美文网首页
Object.keys(obj)与for..in的区别

Object.keys(obj)与for..in的区别

作者: HuFan_JS | 来源:发表于2020-05-03 22:12 被阅读0次

    Object.keys(obj)
    参数obj:要返回其可枚举属性的对象
    返回值:对象本身的可枚举属性组成的数组


    for..in 语句
    以任意顺序遍历一个对象的除symbol以外的可枚举属性


    区别
    object.keys(obj)只包括对象本身的属性
    for...in遍历包括对象继承自原型对象的属性

    实例

    // 构造函数
    function test(name, age) {
        this.name = name;
        this.age = age;
    }
    // 实例化一个对象
    const mytest = new test('zs', 18)
    // 为构造函数添加原型方法
    test.prototype.action = () => {
        console.log('我是test原型上的方法')
    }
    const arr = ['a', 'b', 'c']
    // 传入够着函数,返回空数组
    console.log(Object.keys(test))  // []
    // 传入实例对象,返回实例对象的所有属性名
    console.log(Object.keys(mytest))  // ['name','age']
    // 传入数组,返回索引
    console.log(Object.keys(arr)) // ['0','1','2']
    // for in 遍历实例对象,原型中的属性也会被遍历
    for (item in mytest) {
        console.log(item)   // name age action
    }
    

    js对象属性中的可枚举性?
    在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的。
    如果某个对象的属性是不可枚举的,那么以下三个方法无法作用到这个属性:
    for…in
    Object.keys()
    JSON.stringify

    如何给对象定义一个不可枚举的属性
    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,
    或者修改一个对象的现有属性,并返回此对象

    //定义一个不可枚举的属性
    Object.defineProperty(mytest,'sex',{
        value:'male',
        enumerable: false
       })
    //通过对象.属性的形式可以直接访问到    
    console.log(mytest.sex)
    // 通过for...in、Object.keys(mytest)、JSON.stringify 无法作用到
    for(item in mytest){
        console.log(item)  // name age action
    }
    console.log(Object.keys(mytest)) //['name','age']
    console.log(JSON.stringify(mytest)) // {"name":"zs","age":18}
    

    相关文章

      网友评论

          本文标题:Object.keys(obj)与for..in的区别

          本文链接:https://www.haomeiwen.com/subject/yiujghtx.html