提起操作, 很多人都会想到我们学习过程中最经常做的操作, 就是对数据库进行增, 删, 改, 查, 既然提到这个, 那么对于对象的属性操作也不例外, 基本上可以说也是这几个操作.

  JS中对象的属性标签

  writable(可写), enumerable(可枚举), configurable(可配置), value(值), get/set(get, set方法). 这几个标签会在后面逐渐丰富, 这里先简单介绍下.

  属性的读写

  属性的读写在介绍对象的时候基本已经说的差不多了, 这里补充和总结一下. 这里通过".方法", 或者通过key值的字符串作为索引读取写入.

  var object = {

      x : 1,

      y : 2

    };

  document.write(object.x);  // 1

  document.write(object["y"]);  // 2

  object["x"] = 3;

  object.y = 4;

  document.write(object["x"]);  //3

  document.write(object.y);  //4

  遍历对象属性

  一般通过for in遍历对象的属性, 针对上面的对象, 上代码说话.

  var p;

  for (p in object){

    if (object.hasOwnProperty(p)){

       document.write(p + " : "object[p] + "<br />");

    }

  }

  这段代码旨在将object上面的全部属性遍历出来, 中间加了个判断, 因为for in是将全部的属性, 包括原型链上的属性遍历一遍的, 所以在遍历对象属性的时候切记不要忘记了加上判断.

  undefined的属性读写

  undefined是不具有属性的, 所以切记不要为undefined设置属性和读取属性.

  属性的删除

  delete关键字, delete是用来删除对象的属性和变量的. 下面演示下其用法, 顺便简单介绍下什么状态的属性变量可以删除, 什么时候不可以.

  var object = {

      x : 1,

      y : 2

    };

  delete object.x;  //true

  delete object["y"];  //true

  document.write(object.x);  //undefined

  document.write(object.y);  //undefined

  上面就是成功通过delete关键字删除了object的属性, 但是delete这个方法并不是总是很有用, 这里介绍下一个新的概念DontDelete, 这个可以称之为是一个对象的一个标签, 如果一个对象创建的时候持有了这个标签, 那么就不允许被删除.

  持有DontDelete的属性标记情况

  显式声明一个变量(全局, 局部), 函数, 对象, 都持有DontDelete

  var variable = 1;  //显式声明的全局变量

  delete variable;  //false

  

  function func(){};  //显式声明的函数

  delete func;  //false

  local = 5;  //隐式设置一个全局的属性

  delete local;  //true

  内建对象是自动持有DontDelete标记的, 比如函数内的arguments数组对象, 作为参数数组的内建对象, 是不允许被删除的.

  通过eval()声明的变量是可以删除的, 原因也是在eval中声明的变量创建时都不会持有DontDelete标记的.

  eval('var variable = 3;');

  variable;  //3

  delete variable;  //true

  综上所述, 我有一点个人理解, 对错以后随着我的认识会回来修改, 毕竟写东西不就是让人推翻讨论的么, 我认为delete的特性就是在非eval情况下只可以删除一个已有对象的属性, 而不可以删除一段开辟的内存空间, 显式的声明变量其实是为变量开辟了一块内存, 函数, 对象都是如此, 所以这些都不可以删除, 而对象的属性, 隐式的全局变量(其实就是上下文中this的属性), 这些都是一个对象的属性, 所以他们使可以删除的. eval是JS的动态特征, 类似于OC的runtime貌似, 还没有研究的太深, 所以就不深入讨论了, 知识有限.

  属性的检测

  想要知道一个对象是否具有一个属性, 有几个方式进行检测, 下面会细分.

  in

  如果想要简单的判断一个对象及其原型链是否具有一个属性, 只需要使用in操作符, 它的特性就是无论是自身持有, 还是原型链持有, 都会返回true.

  var person = {

      name : "JianweiWang",

      age : "23",

    };

  'name' in person;  //true, 自身持有

  'hobby' in person;  //false, 自身不持有

  'toString' in person;  //true, 原型链持有

  in操作符的左边通常是一个字符串, 右边必须是一个对象.

  hasOwnProperty()方法

  这个是仅判断当前对象是否具有属性, 它并不会检测原型链上的属性. 所以如果需要准确的判断对象自持有哪些属性, 就选择使用hasOwnProperty()方法, 参数为属性名的字符串.

  var person = {

      name : "JianweiWang",

      age : "23",

    };

  person.hasOwnProperty('name');  //true, 自身持有

  person.hasOwnProperty('toString');  //false, 原型链持有

  Object.keys()方法

  这个方法的作用是将参数对象自身所持有的所有属性(并不会有原型链上的属性), 展现出来, 方法参数要求是对象.

  var person = {

      name : "JianweiWang",

      age : "23",

    };

  document.write(Object.keys(person));  //name, 23

  

了解JavaScript 对象的属性操作的更多相关文章

  1. JavaScript对象之属性操作

    在js对象中,我们可以对对象属性进行操作. 上图的要点为:for-in会把原型链上的可枚举属性也列出来. 上图的要点为:可以使用逻辑运算符&&进行层层查找对象是否为undefined, ...

  2. javascript对象定义和操作

    //js对象定义有三种方式//js方法定义有三种方式 function fn(){} var fun = function(){} var fun = new function() {} //**** ...

  3. JavaScript 对象 - 与属性的相关知识

    function inherit(p){ if(p == null) throw TypeError(); if(Object.create) return Object.create(p); var ...

  4. jQuery对象的属性操作

    jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作 html属性操作:是对html文档中的属性进行读取,设置和移除操作.比如attr().removeAttr ...

  5. JavaScript | 对象与属性

    ———————————————————————————————————————————— 对象:JavaScript是基于原型的语言,没有Class,所以将函数作为类 - - - - - - - - ...

  6. javascript对象的相关操作

    Window对象 我们知道浏览器对象模型(BOM)是javascript的组成之一,它提供了独立于内容与浏览器窗口进行交互的对象.其分层结构如下: window对象是整个BOM的核心其有documen ...

  7. JavaScript对象之属性标签

    本文介绍一下js对象的属性标签(configurable.writable.enumerable.value.get.set)的使用. 上图的要点为: 1.Object.getOwnPropertyD ...

  8. [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. javascript对象的属性,方法,prototype作用范围分析.

    用了javascript这么久由于没有系统学习过基础,总是拿来主义. 所以对一些基础知识还是搞不清楚很混乱. 今天自己做个小例子,希望彻底能搞清楚. 注释中对象只例子的对象本身,原型只原型继承对象的新 ...

随机推荐

  1. Topshelf 学习 跨平台

    Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主. 官网:http://topshelf-project.com Git ...

  2. 一种简单的CQRS架构设计及其实现

    一.为什么要实践领域驱动? 近一年时间我一直在思考一个问题:"如何设计一个松耦合.高伸缩性.易于维护的架构?".之所以有这样的想法是因为我接触的不少项目都是以数据库脚本来实现业务逻 ...

  3. Async和Await异步编程的原理

    1. 简介 从4.0版本开始.NET引入并行编程库,用户能够通过这个库快捷的开发并行计算和并行任务处理的程序.在4.5版本中.NET又引入了Async和Await两个新的关键字,在语言层面对并行编程给 ...

  4. 再次学习 java 类的编译

    做JAVA开发的都知道myeclipse, 我们在myeclipse中新建一个类,然后保存, 如何正常的话,那么在项目指定的目录(也就是项目的output目录)就会生成同名的class文件, 可是,我 ...

  5. win10更新系统后wifi连接不上了怎么解决?

    遇到了一个小问题,由于更新了一下win10,发现wifi不能用了,以为是wifi密码错了,选择忘记密码试了两次,又试了不同的wifi都不行,发现网卡无线驱动也没事,在网上百度了好久发现说的方法都没用, ...

  6. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作

    从MyEclipse转战到IntelliJ IDEA的经历 注转载址:http://blog.csdn.net/luoweifu/article/details/13985835 我一个朋友写了一篇“ ...

  7. 给 Android 研发的一些的建议

    作为应用程序开发人员,我们需要注意在开发应用程序时的一些问题. 这些问题的安全级别是取决于应用程序的类型和使用域. 在这里列举了一些我们在开发中需要注意的一些问题: 开发日志输出相关: 1. 不要在 ...

  8. json数据格式及json校验格式化工具简单实现

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, ...

  9. pixi.js webgl库

    分析pixi源码,刚搭建环境gulp+webpack,目前正在看... https://github.com/JsAaron/webgl-demo

  10. Python标准模块--import

    1 模块简介 作为一个Python初学者,你首先要学会的知识就是如何引入其它模块或者包.但是,我发现有些开发者虽然使用Python很多年,依然不了解Python引入机制的灵活性.这篇文章,我们就会研究 ...