了解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这么久由于没有系统学习过基础,总是拿来主义. 所以对一些基础知识还是搞不清楚很混乱. 今天自己做个小例子,希望彻底能搞清楚. 注释中对象只例子的对象本身,原型只原型继承对象的新 ...
随机推荐
- ENode 2.8 最新架构图简介
ENode架构图 什么是ENode ENode是一个.NET平台下,纯C#开发的,基于DDD,CQRS,ES,EDA,In-Memory架构风格的,可以帮助开发者开发高并发.高吞吐.可伸缩.可扩展的应 ...
- Lesson 23 A new house
Text I had a letter from my sister yesterday. She lives in Nigeria. In her letter, she said that she ...
- Windows10-UWP中设备序列显示不同XAML的三种方式[3]
阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...
- .NET里简易实现IoC
.NET里简易实现IoC 前言 在前面的篇幅中对依赖倒置原则和IoC框架的使用只是做了个简单的介绍,并没有很详细的去演示,可能有的朋友还是区分不了依赖倒置.依赖注入.控制反转这几个名词,或许知道的也只 ...
- [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5
原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...
- ASP.net 使用ConfigurationManager获取连接字符串
在解决方案资源管理器里右键单击解决方案选择“添加引用”,并且从 .net 中找到 System.Configuration 引用它 在项目的web.config文件中添加 <connection ...
- iOS-----程序异常处理----- 断言NSAssert()和NSParameterAssert区别和用处
NSAssert和assert是断言,主要的差别是assert在断言失败的时候只是简单的终止程序,而NSAssert会报告出错误信息并且打印出来.所以尽管的使用NSAssert,可以不去使用asser ...
- <JavaScript语言精粹>-读书笔记(一)
用object.hasOwnProperty(variable)来确定这个属性名是否为该对象成员,还是来自于原型链. for(my in obj){ if(obj.hasOwnProperty(my) ...
- Web API与OAuth:既生access token,何生refresh token
在前一篇博文中,我们基于 ASP.NET Web API 与 OWIN OAuth 以 Resource Owner Password Credentials Grant 的授权方式( grant_t ...
- Compile FreeCAD on Windows
Compile FreeCAD on Windows eryar@163.com 1.Introduction FreeCAD是一个参数化的三维造型软件,主要用于任意大小的实际模型的设计.参数化的建模 ...