了解JavaScript 对象的属性操作
提起操作, 很多人都会想到我们学习过程中最经常做的操作, 就是对数据库进行增, 删, 改, 查, 既然提到这个, 那么对于对象的属性操作也不例外, 基本上可以说也是这几个操作.
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 对象的属性操作的更多相关文章
- JavaScript对象之属性操作
在js对象中,我们可以对对象属性进行操作. 上图的要点为:for-in会把原型链上的可枚举属性也列出来. 上图的要点为:可以使用逻辑运算符&&进行层层查找对象是否为undefined, ...
- javascript对象定义和操作
//js对象定义有三种方式//js方法定义有三种方式 function fn(){} var fun = function(){} var fun = new function() {} //**** ...
- JavaScript 对象 - 与属性的相关知识
function inherit(p){ if(p == null) throw TypeError(); if(Object.create) return Object.create(p); var ...
- jQuery对象的属性操作
jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作 html属性操作:是对html文档中的属性进行读取,设置和移除操作.比如attr().removeAttr ...
- JavaScript | 对象与属性
———————————————————————————————————————————— 对象:JavaScript是基于原型的语言,没有Class,所以将函数作为类 - - - - - - - - ...
- javascript对象的相关操作
Window对象 我们知道浏览器对象模型(BOM)是javascript的组成之一,它提供了独立于内容与浏览器窗口进行交互的对象.其分层结构如下: window对象是整个BOM的核心其有documen ...
- JavaScript对象之属性标签
本文介绍一下js对象的属性标签(configurable.writable.enumerable.value.get.set)的使用. 上图的要点为: 1.Object.getOwnPropertyD ...
- [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- javascript对象的属性,方法,prototype作用范围分析.
用了javascript这么久由于没有系统学习过基础,总是拿来主义. 所以对一些基础知识还是搞不清楚很混乱. 今天自己做个小例子,希望彻底能搞清楚. 注释中对象只例子的对象本身,原型只原型继承对象的新 ...
随机推荐
- Mono 3.2.3 TCP吞吐性能测试报告
在前几天简单地测试了一下Mono 3.2.3 TCP处理的稳定性,有同学问Mono 3.2.3的TCP处理性有怎样,以下是针对Mono 3.2.3TCP在吞吐方面的性能测试.主要测试分两种场分别是连接 ...
- Vim新手入门资料和一些Vim实用小技巧
一些网络上质量较高的Vim资料 从我07年接触Vim以来,已经过去了8个年头,期间看过很多的Vim文章,我自己觉得非常不错,而且创作时间也比较近的文章有如下这些. Vim入门 目前为阿里巴巴高级技术专 ...
- Spark笔记:RDD基本操作(上)
本文主要是讲解spark里RDD的基础操作.RDD是spark特有的数据模型,谈到RDD就会提到什么弹性分布式数据集,什么有向无环图,本文暂时不去展开这些高深概念,在阅读本文时候,大家可以就把RDD当 ...
- Java线程池解析
Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...
- 阿里云ECS安装lnmp环境-转载自:http://ninghao.net/blog/1368
远程控制你的服务器 远程控制 Linux 类型的系统的服务器,比如 CentOS 系统的服务器,一般不像 Windows 服务器那样,使用图形界面的远程控制.我们需要使用命令行工具,远程连接到服务器, ...
- SQL 邮件配置篇
在我们运维工作中,经常要对备份,ETL等作业进行监控,这时我们需要用到SQL SERVER自带的邮件服务器,其原理,我在这么里不多说,直接来实战,下面是我对服务器配置源码,分享给大家,希望对大家有帮助 ...
- 断电不断网——Linux的screen
title: 断电不断网--Linux的screen author:青南 date: 2015-01-01 20:20:23 categories: [Linux] tags: [linux,scre ...
- 带搜索的ComboBox
带搜索的ComboBox就是给ComboBox一个依赖属性的ItemSource,然后通过数据源中是否包含要查询的值,重新给ComboBox绑定数据源. public class EditComboB ...
- socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...
- 构建高可用ZooKeeper集群
ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分布式基础服务.由于 Zo ...