了解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这么久由于没有系统学习过基础,总是拿来主义. 所以对一些基础知识还是搞不清楚很混乱. 今天自己做个小例子,希望彻底能搞清楚. 注释中对象只例子的对象本身,原型只原型继承对象的新 ...
随机推荐
- NodeJs 开发微信公众号(五)真实环境部署
在测试环境下开发完成代表着你离正式上线的目标不远了.接下来本章就主要谈一谈把测试环境的公众号升级为正式的公众号. 服务器和域名 目前为止我们只是在自己的电脑上完成了测试环境.真实的线上环境当然需要自己 ...
- 【Knockout.js 学习体验之旅】(2)花式捆绑
本文是[Knockout.js 学习体验之旅]系列文章的第2篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...
- SAE+WordPress快速搭建个人博客
前些天一时冲动,买了个域名,我想总不能放着不用吧,干脆就搭建了一个个人博客.下面我把搭建的过程分享给大家.注意,此文并不是攻略,只是为了记录下这个从无到有的过程,当然,假如解决了你的疑惑,那当然是极好 ...
- ValueInjecter----最好用的OOM(以微信消息转对象举例)
使用数据实体的好处我这里就不多说了,但大家享受这些好处的时候,难免也对那些琐碎的赋值代码感到厌烦,基于此,我认为掌握一个oom的使用,还是很有必要的. 这种类型的工具有很多,比如automapper, ...
- TCP同步与异步,长连接与短连接【转载】
原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896 这是今天看到的一篇讲到T ...
- quartz.net 时间表达式----- Cron表达式详解
序言 Cron表达式:就是用简单的xxoo符号按照一定的规则,就能把各种时间维度表达的淋漓尽致,无所不在其中,然后在用来做任务调度(定时服务)的quart.net中所认知执行,可想而知这是多么的天衣无 ...
- Python标准模块--os
1.模块简介 os模块主要包含普遍的操作系统相关操作,如果开发者希望自己开发的Python应用能够与平台无关,尤其需要关注os这个模块. 2.模块使用 2.1 os模块 1. os.name,输出字符 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录
系列目录 我们之前做了验证码,登录界面,却没有登录实际的代码,我们这次先把用户登录先完成了,要不权限是讲不下去了 把我们之前的表更新到EF中去 登录在Account控制器,所以我们要添加Account ...
- ES6转换器之Babel
ES6部分功能没有支持,所以想学习ES6,得先有个转换器,就是将ES6的代码转换为ES5. 我这里用的是Gulp + Bable的形式来将ES6转换为ES5的. 前提: (1).Gulp和Bable都 ...
- 浅析MySQL二进制日志
查看MySQL二进制文件中的内容有两种方式 1. mysqlbinlog 2. SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offs ...