zoukankan      html  css  js  c++  java
  • 容易遗忘的JS知识点整理—hasOwnProperty相关

    为了判断一个对象是否包含自定义属性而不是原型链上的属性,我们需要使用继承自 Object.prototype 的 hasOwnProperty方法
    hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数

    // 修改Object.prototype
    Object.prototype.bar = 1; 
    var foo = {goo: undefined};
    
    foo.bar; // 1
    'bar' in foo; // true
    
    foo.hasOwnProperty('bar'); // false
    foo.hasOwnProperty('goo'); // true

    注意: 通过判断一个属性是否 undefined 是不够的。 因为一个属性可能确实存在,只不过它的值被设置为 undefined。

    hasOwnProperty 作为属性

    JavaScript 不会保护 hasOwnProperty 被非法占用,因此如果一个对象碰巧存在这个属性, 就需要使用外部的 hasOwnProperty 函数来获取正确的结果。

    var foo = {
        hasOwnProperty: function() {
            return false;
        },
        bar: 'Here be dragons'
    };
    
    foo.hasOwnProperty('bar'); // 总是返回 false
    
    // 使用其它对象的 hasOwnProperty,并将其上下文设置为foo
    ({}).hasOwnProperty.call(foo, 'bar'); // true
    当检查对象上某个属性是否存在时,hasOwnProperty 是唯一可用的方法。 同时在使用 for in loop遍历对象时,推荐总是使用 hasOwnProperty 方法, 这将会避免原型对象扩展带来的干扰。

    for in 循环

    和 in 操作符一样,for in 循环同样在查找对象属性时遍历原型链上的所有属性。

    注意: 由于 for in 总是要遍历整个原型链,因此如果一个对象的继承层次太深的话会影响性能。

    由于不可能改变 for in 自身的行为,因此有必要过滤出那些不希望出现在循环体中的属性, 这可以通过 Object.prototype 原型上的 hasOwnProperty 函数来完成。

    // foo 变量是上例中的
    for(var i in foo) {
        if (foo.hasOwnProperty(i)) {
            console.log(i);
        }
    }

     推荐总是使用 hasOwnProperty。不要对代码运行的环境做任何假设,不要假设原生对象是否已经被扩展了
  • 相关阅读:
    Solution -「ARC 126E」Infinite Operations
    toString()、String.valueOf、(String)强转,有啥区别?
    Win10下python3和python2同时安装并解决pip共存问题
    3295. 星际旅行(计算几何)
    计算几何基础(入土)知识
    (淀粉质)P2634 [国家集训队]聪聪可可 and P3806 多次离线查询树上距离为k的点对是否存在
    企业微信 之员工报餐
    PHP 之tp5导出到Excel并下载
    小程序 之安全问题考虑
    PHP 之上传网络图片到微信临时素材
  • 原文地址:https://www.cnblogs.com/aixue/p/10169609.html
Copyright © 2011-2022 走看看