搜索
您的当前位置:首页JavascripthasOwnProperty方法&in关键字_javascript技巧

JavascripthasOwnProperty方法&in关键字_javascript技巧

时间:2023-12-02 来源:明星茬娱乐

此方法无法检查该对象的原型链中是否具有该属性;该属性必须是对象本身的一个成员。 in 操作检查对象中是否有名为 property 的属性。也可以检查对象的原型,判断该属性是否为原型链的一部分。 代码如下:function Test(){ this. a= 'abc'; } Test.prototype.b='efg'; var test=new Test; alert(test.hasOwnProperty('a'));//输出 true alert(test.hasOwnProperty('b'));//输出 false alert('a' in test);//输出 true alert('b' in test);//输出 true

小编还为您整理了以下内容,可能对您也有帮助:

怎么判断JS对象是否拥有某属性?

判断JS对象是否拥有某属性的方法:

1、in 运算符

var obj = {name:'jack'};

alert('name' in obj); // --> true

alert('toString' in obj); // --> true

可看到无论是name,还是原形链上的toString,都能检测到返回true。

2、hasOwnProperty 方法

var obj = {name:'jack'};

obj.hasOwnProperty('name'); // --> true

obj.hasOwnProperty('toString'); // --> false

原型链上继承过来的属性无法通过hasOwnProperty检测到,返回false。

需注意的是,虽然in能检测到原型链的属性,但for in通常却不行。

当然重写原型后for in在IE9/Firefox/Safari/Chrome/Opera下是可见的。

JS里的hasOwnProperty这个方法是在什么情况下返回true什么情况下返回false

hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。

下面给出一个列子你自己理解下,至于你提的问题,你自己完全可以写例子来验证,自己写的感受会深一些

<script type="text/javascript">

        var obj = {

            a: 1,

            fn: function(){

            },

            c:{

                d: 5

            }

        };

        console.log(obj.hasOwnProperty('a'));//true

        console.log(obj.hasOwnProperty('fn'));//true

        console.log(obj.hasOwnProperty('c'));//true

        console.log(obj.c.hasOwnProperty('d'));//true

        console.log(obj.hasOwnProperty('d'));//false, obj对象没有d属性

        var str = new String();

        console.log(str.hasOwnProperty('substring'));//false

        console.log(String.prototype.hasOwnProperty('substring'));//true

    </script>

javascript检测对象中是否存在某个属性判断方法

检测对象中属性的存在与否可以通过几种方法来判断

使用in关键字

该方法可以判断对象的自有属性和继承来的属性是否存在

代码如下:

var o={x: };

"x" in o; //true 自有属性存在

"y" in o; //false

"toString" in o; //true 是一个继承属性

使用对象的hasOwnProperty()方法

该方法只能判断自有属性是否存在 对于继承属性会返回false

代码如下:

var o={x: };

o hasOwnProperty("x");    //true 自有属性中有x

o hasOwnProperty("y");    //false 自有属性中不存在y

o hasOwnProperty("toString"); //false 这是一个继承属性 但不是自有属性

用undefined判断

自有属性和继承属性均可判断

代码如下:

var o={x: };

o x!==undefined; //true

o y!==undefined; //false

o toString!==undefined //true

该方法存在一个问题 如果属性的值就是undefined的话 该方法不能返回想要的结果 如下

代码如下:

var o={x:undefined};

o x!==undefined; //false 属性存在 但值是undefined

o y!==undefined; //false

o toString!==undefined //true

在条件语句中直接判断

代码如下:

var o={};

lishixin/Article/program/Java/JSP/201311/19890

    javascript检测对象中是否存在某个属性判断方法

    检测对象中属性的存在与否可以通过几种方法来判断

    使用in关键字

    该方法可以判断对象的自有属性和继承来的属性是否存在

    代码如下:

    var o={x: };

    "x" in o; //true 自有属性存在

    "y" in o; //false

    "toString" in o; //true 是一个继承属性

    使用对象的hasOwnProperty()方法

    该方法只能判断自有属性是否存在 对于继承属性会返回false

    代码如下:

    var o={x: };

    o hasOwnProperty("x");    //true 自有属性中有x

    o hasOwnProperty("y");    //false 自有属性中不存在y

    o hasOwnProperty("toString"); //false 这是一个继承属性 但不是自有属性

    用undefined判断

    自有属性和继承属性均可判断

    代码如下:

    var o={x: };

    o x!==undefined; //true

    o y!==undefined; //false

    o toString!==undefined //true

    该方法存在一个问题 如果属性的值就是undefined的话 该方法不能返回想要的结果 如下

    代码如下:

    var o={x:undefined};

    o x!==undefined; //false 属性存在 但值是undefined

    o y!==undefined; //false

    o toString!==undefined //true

    在条件语句中直接判断

    代码如下:

    var o={};

    lishixin/Article/program/Java/JSP/201311/19890

      基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式_javascript技巧

      前言

      在面向对象的编程范式中,封装都是必不可少的一个概念,而在诸如 Java,C++等传统的面向对象的语言中, 私有成员是实现封装的一个重要途径。但在 JavaScript 中,确没有在语法特性上对私有成员提供支持, 这也使得开发人员使出了各种奇技淫巧去实现 JS 中的私有成员,以下将介绍下目前实现 JS 私有成员特性的几个方案以及它们之间的优缺点对比。

      现有的一些实现方案

      约定命名方案

      约定以下划线'_'开头的成员名作为私有成员,仅允许类成员方法访问调用,外部不得访问私有成员。简单的代码如下:

      JavaScript

      优点

      毫无疑问,约定命名是最简单的私有成员实现方案,没有代码层面上的工作。

      调试方便,能够在控制台上直接看到对象上的私有成员,方便排查问题。

      兼容性好,ie6+都支持

      不足

      无法阻止外部对私有成员的访问和变更,如果真有不知道或者不遵守约定的开发人员变更私有属性,也是为力。

      必须强制或说服大家遵守这个约定,当然这个在有代码规范的团队中不是什么太大的问题。

      es6 symbol 方案

      在 es6中,引入了一个 Symbol 的特性,该特性正是为了实现私有成员而引入的。

      主要的思路是,为每一个私有成员的名称产生一个随机且唯一的字符串key,这个 key 对外不可见,对内的可见性则是通过 js 的闭包变量实现,示例代码如下:

      JavaScript

      优点

      弥补了命名约定方案的缺陷,外部无法通过正常途径获得私有成员的访问权。

      调试便捷程度上可以接受,一般是通过给 symbol 的构造函数传入一个字符串参数,则控制台上对应的私有属性名称会展示为:Symbol(key)

      兼容性不错,不支持 Symbol的浏览器可以很容易的 shim 出来。

      不足

      写法上稍显别扭,必须为每一个私有成员都创建一个闭包变量让内部方法可以访问。

      外部还是可以通过 Object.getOwnPropertySymbols的方式获取实例的 symbol 属性名称,通过该名称获得私有成员的访问权。这种场景出现得比较少,且知道这种途径的开发人员水平相信都是有足够的能力知道自己的行为会有什么影响,因此这个不足点也算不上真正意义的不足。

      es6 WeakMap 方案

      在 es6 中引入了 Map, WeakMap 容器,最大的特点是容器的键名可以是任意的数据类型,虽说初衷不是为了实现私有成员引入,但意外的可以被用来实现私有成员特性。

      主要的思路是,在类的级别上创建一个 WeakMap 容器,用于存储各个实例的私有成员,这个容器对外不可见,对内通过闭包方式可见;内部方法通过将实例作为键名获取容器上对应实例的私有成员,示例代码如下:

      JavaScript

      优点

      弥补了命名约定方案的缺陷,外部无法通过正常途径获得私有成员的访问权。

      对 WeakMap 做一些封装,抽出一个私有特性的实现模块,可以在写法上相对 Symbol 方案更加简洁干净,其中一种封装的实现可以查看参考文章3。

      最后一个是个人认为最大的优势:基于 WeakMap 方案,可以方便的实现保护成员特性(这个话题会在其他文章说到:))

      不足

      不好调试,因为是私有成员都在闭包容器内,无法在控制台打印实例查看对应的私有成员

      待确认的性能问题,根据 es6的相关邮件列表,weakmap 内部似乎是通过顺序一一对比的方式去定位 key 的,时间复杂度为 O(n),和 hash 算法的 O(1)相比会慢不少

      最大的缺陷则是兼容性带来的内存膨胀问题,在不支持 WeakMap 的浏览器中是无法实现 WeakMap 的弱引用特性,因此实例无法被垃圾回收。 比如示例代码中 privateProp 是一个很大的数据项,无弱引用的情况下,实例无法回收,从而造成内存泄露。

      现有实现方案小结

      从上面的对比来看,Symbol方案最大优势在于很容易模拟实现;而WeakMap的优势则是能够实现保护成员, 现阶段无法忍受的不足是无法模拟实现弱引用特性而导致的内存问题。于是我的思路又转向了将两者优势结合起来的方向。

      Symbol + 类WeakMap 的整合方案

      在 WeakMap 的方案中最大的问题是无法 shim 弱引用,较次要的问题是不大方便调试。

      shim 出来的 WeakMap 主要是无法追溯实例的生命周期,而实例上的私有成员的生命周期又是依赖实例, 因此将实例级别的私有成员部分放在实例上不就好了? 实例没了,自然其属性也随之摧毁。而私有存储区域的隐藏则可以使用 Symol 来做。

      该方案的提供一个 createPrivate 函数,该函数会返回一个私有的 token 函数,对外不可见,对内通过闭包函数获得, 传入当前实例会返回当前实例的私有存储区域。使用方式如下:

      JavaScript

      代码中主要就是实现 createPrivate 函数,大概的实现如下:

      JavaScript

      上述实现做了两层存储,privateStore 这层是实例上统一的私有成员存储区域,而 classToken 对应的则是继承层次之间不同类的私有成员定义,基类有基类的私有成员区域,子类和基类的私有成员区域是不同的。

      当然,只做一层的存储也可以实现,两层存储仅仅是为了调试方便,可以直接在控制台通过Symbol(‘privateStore')这个属性来查看实例各个层次的私有部分。

      奇葩的 es5 property getter 拦截方案

      该方案纯粹是闲得无聊玩了玩,主要是利用了 es5 提供的 getter,根据 argument.callee.caller 去判断调用场景,如果是外部的则抛异常或返回 undefined, 如果是内部调用则返回真正的私有成员,实现起来比较复杂,且不支持 strict 模式,不推荐使用。 有兴趣的同学可以看看实现。

      总结

      以上几个方案对比下来,我个人是倾向 Symbol+WeakMap 的整合方案,结合了两者的优点,又弥补了 WeakMap 的不足和 Symbol 书写的冗余。 当然了,我相信随着 JS 的发展,私有成员和保护成员也迟早会在语法层面上进行支持,正如 es6 对 class 关键字和 super 语法糖的支持一样, 只是现阶段需要开发者使用一些技巧去填补语言特性上的空白。

      Javascript私有成员的实现方式

      总体来讲这本书还是可以的,但看完这本书还留了几个问题一直困扰着我,如js中私有变量的实现,prototype等,经过自己一系列测试,现在终于弄明白了。

      很多书上都是说,Javascript是不能真正实现Javascript私有成员的,因此在开发的时候,统一约定 __ 两个下划线开头为私有变量。

      后来,发现Javascript中闭包的特性,从而彻底解决了Javascript私有成员的问题。

      test._Name 根本访问不到,但是用对象方法能访问到,因为闭包能从当前的执行环境中获取信息。

      接下来我们看看,共有成员是怎样实现的

      接下来在看看类静态变量是怎样实现的

      如何判断Javascript对象是否存在

      第一种写法

      var myObj;

      if (!myObj){

      var myObj = {};

      }

      第二种写法

      除了var命令,还可以有另一种改写,也能得到正确的结果:

      if (!window.myObj){

      myObj = {};

      }

      window是javascript的顶层对象,所有的全局变量都是它的属性。所以,判断myobj是否为空,等同于判断window对象是否有myobj属性,这样就可以避免因为myObj没有定义而出现ReferenceError错误。不过,从代码的规范性考虑,最好还是对第二行加上var:

      if (!window.myObj){

      var myObj = {};

      }

      或者写成这样:

      if (!window.myObj){

      window.myObj = {};

      }

      第三种写法

      上面这种写法的缺点在于,在某些运行环境中(比如V8、Rhino),window未必是顶层对象。所以,考虑改写成:

      if (!this.myObj){

      this.myObj = {};

      }

      在全局变量的层面中,this关键字总是指向顶层变量,所以就可以于不同的运行环境。

      第四种写法

      但是,上面这样写可读性较差,而且this的指向是可变的,容易出错,所以进一步改写:

      var global = this;

      if (!global.myObj){

      global.myObj = {};

      }

      用自定义变量global表示顶层对象,就清楚多了。

      第五种写法

      还可以使用typeof运算符,判断myObj是否有定义。

      if (typeof myObj == "undefined"){

      var myObj = {};

      }

      这是目前使用最广泛的判断javascript对象是否存在的方法。

      第六种写法

      由于在已定义、但未赋值的情况下,myObj的值直接等于undefined,所以上面的写法可以简化:

      if (myObj == undefined){

      var myObj = {};

      }

      这里有两个地方需要注意,首先第二行的var关键字不能少,否则会出现ReferenceError错误,其次undefined不能加单引号或双引号,因为这里比较的是undefined这种数据类型,而不是"undefined"这个字符串。

      第七种写法

      上面的写法在"精确比较"(===)的情况下,依然成立:

      if (myObj === undefined){

      var myObj = {};

      }

      第八种写法

      根据javascript的语言设计,undefined == null,所以比较myObj是否等于null,也能得到正确结果:

      if (myObj == null){

      var myObj = {};

      }

      不过,虽然运行结果正确,但是从语义上看,这种判断方法是错的,应该避免。因为null指的是已经赋值为null的空对象,即这个对象实际上是有值的,而undefined指的是不存在或没有赋值的对象。因此,这里只能使用"比较运算符"(==),如果这里使用"精确比较运算符"(===),就会出错。

      第九种写法

      还可以使用in运算符,判断myObj是否为顶层对象的一个属性:

      if (!('myObj' in window)){

      window.myObj = {};

      }

      第十种写法

      最后,使用hasOwnProperty方法,判断myObj是否为顶层对象的一个属性:

      if (!this.hasOwnProperty('myObj')){

      this.myObj = {};

      }

      总结

      1. 如果只判断对象是否存在,推荐使用第五种写法。

      2. 如果除了对象是否存在,还要判断对象是否有null值,推荐使用第一种写法。

      3. 除非特殊情况,所有变量都应该使用var命令声明。

      4. 为了跨平台,建议避免使用window表示顶层对象。

      5.

      在Javascript语言中,null和undefined容易产生混淆。在可能同时涉及两者的情况下,建议使用"精确比较"运算符(===)。

      明星茬娱乐还为您提供以下相关内容希望对您有帮助:

      JS里的hasOwnProperty这个方法是在什么情况下返回true什么情况下返回...

      //true console.log(obj.hasOwnProperty('d'));//false, obj对象没有d属性 var str = new String(); console.log(

      有哪些方法可以检测JS对象存在属性重复

      属性是不会重复的只有唯一的属性名不过有方法可以判断属性是否已经存在1.in,示例如下//返回trueconsole.log("x"in{x:1})2.hasOwnProperty方法,示例如下//返回trueconsole.log(({x:1}).hasOwnProperty("x"))如果属性...

      怎么判断JS对象是否拥有某属性?

      var obj = {name:'jack'}; alert('name' in obj); // --&gt; true alert('toString' in obj); // --&gt; true 可看到无论是name,还是原形链上的toString,都能检测到返回true。2、hasOwnProperty 方法 var obj ...

      javascript判断对象有多少属性

      可以用 in操作符 和 对象的 hasOwnProperty 操作符 举例 "name" in Object Object.hasOwnProperty("name") 有个公共的方法 function hasPrototype(object,name){ return !object.hasOwnProperty(name)&amp;&amp;(name in object)...

      5种js遍历对象属性的方法

      ​ 其中兼容性最好的是for... in来进行遍历,因为我们通常只需要遍历对象自身拥有的属性 所以使用 Object.prototype.hasOwnProperty() 兼容到ie5.5 方法来排除继承的属性 注意:即使属性的值是 null 或 ...

      怎样编写可自定义维护JS代码

      }for (let prop in obj) { if (obj.hasOwnProperty(prop)) { console.log(`key: ${prop}; value: ${obj[prop]}`); }}关于for-in循环,还有一点需要注意,即for-in循环是用来遍历对象的。一个常见的错误用法是使用for-in...

      JavaScript中创建类/对象的几种方法总结_javascript技巧

      一、由一对大括号括起来 代码如下:var emptyObj = {}; var myObj = { 'id': 1, //属性名用引号括起来,属性间由逗号隔开 'name': 'myName' }; //var m = new myObj(); //不支持不知你注意到对象都是...

      如何判断Javascript对象是否存在的简单实例_javascript技巧_百度...

      这就是var命令的"代码提升"(hoisting)作用。Javascript解释器,只"提升"var命令定义的变量,对不使用var命令、直接赋值的变量不起作用,这就是为什么不加var会报错的原因。第二种写法除了var命令,还可以有另一种改写,...

      js每个对象拥有一个原型对象吗?

      使用in可以检查对象中是否有该属性,但是原型中有,依然会返回true。hasOwnProperty 可以检查对象中是否含有该属性,这个方法只有当对象自身含有该属性时才返回true。原型对象也是一个对象,它也有原型对象。所以当原型对象中没有...

      如何编写可维护的JavaScript代码?

      进一步缓存Object.prototype.hasOwnProperty函数,代码变成下面这样:1vari, hasOwn = Object.prototype.hasOwnProperty;2for(i inman) {3 if(hasOwn.call(man, i)) { // filter4 console.log(i, ":", man[i]);5 }6}避免隐...

      Top