javascript(三):对象
对象(object)是javascript中很重要的数据类型。对象是“键值对”的集合,同时也是无序的。(注意:对象结尾处有分号)
var ob1={
a1:'name',//a1可以加引号或者不加
a2:100,
a3:function test(){}//末尾逗号(,)可加可不加
};
var a1;
console.log(ob1['a1']);
console.log(ob1.a2);
var a2='a2';
console.log(ob1[a2]);//此处a2被当做变量处理
for(var obj in ob1){
console.log(ob1[obj]);//此处obj被当做字符串处理
}
对象的生成方法有三种:三种方法等价!
var ob2={};
var ob2=new Object();
var ob3=Object.create(Object.prototype);
关于对象键名:对象的键名是字符串,加不加引号均行;键名是数值,会自动转化为字符串;键名如果不符合标识名的条件,则需要加上引号!
注意:键名是字符串,但键值是任意形式(比如函数,整数,对象等)
var ob4={
b1:'address',//键名未加引号
'b2':100,//键名加了引号
1e3:'age',//变为'1000'
'02x':[]//02x不符合标识符格式,需要加上引号!
};
对象里面的属性:可以动态添加,亦可动态删除
console.log('I\'m the division line -------------');
var ob5={
name:'Bob'
};
ob5.name1='Alice';
console.log(ob5.name1+" "+ob5.name);
delete ob5.name;
delete ob5.name1;
console.log(ob5.name1+' '+ob5.name);
运行结果:

对象中的“方法”:属性的值是函数,即对象里面的函数,称为“方法”!
var ob6={
name:'cat',
//属性f是一个方法,即对象里面的函数
f:function test(a,b){
return a<b ? a:b;
}
};
console.log(ob6.name+' '+ob6.f(1,10));
运行结果:

对象引用:不同的变量名指向同一个对象,那么它们都是这个对象的引用,即指向同一个内存地址!修改其中一个变量,会影响到其它变量!
var obj={
name:'Dog'
}
var o=obj;
console.log(o);
o.sex='male';//修改o,同时会影响obj
console.log(o,obj);
delete obj.name;
console.log(o,obj);
运行结果:

注意:当取消一个变量对对象的引用,则不会对另外一个变量造成影响!
obj=100;
console.log('此时obj=100,不是对象的引用了');
console.log(obj,o);
运行结果:

但是这种引用只限于对象,其它原始数据类型的数据依然是传值引用,即值的拷贝!
一个值发生变化,另一个值不会跟着发生相应的变化!
var v1=10;
v2=v1;
console.log(v1,v2);
v2=100;
console.log(v1,v2);
v1=1000;
console.log(v1,v2);
运行结果:

查看对象中所有键名(属性):使用Object.keys()方法。
var obj2={
name:'Array',
sex:'mail',
age:180
};
console.log(Object.keys(obj2));
运行结果:

对象中的delete命令:一般删除对象中存在或不存在的键(属性),都返回true;除非对象设置configurable:false,此时delete后返回false。
同时delete不能删除继承来的属性。
var obj3={
name:'xiaoming',
grade:'middle school',
age:20
};
console.log(obj3.age);
console.log(delete obj3.age);//返回 true
console.log(obj3.age);//此时返回undefined
console.log(delete obj3.address);//返回true,纵然address键不存在
console.log(delete obj3.toString);//返回true,但是继承来的方法并未被删除
console.log(obj3.toString);
设置configurable:false后:
var obj4=Object.defineProperty({},'p',{
value:100,
configurable:false
});
console.log(delete obj4.p);//返回false
当然,前面学习变量申明时,就知道了delete 不能删除var申明的变量。(var 申明的是顶层对象,即window的属性,默认不可删除!)

检测对象中是否包含某个属性:in运算符!但是用in检测对象继承的属性,也返回true!!!
var obj5={
language:"Go,Dart",
company:'google',
product:'chrome'
};
console.log('------------');
if('company' in obj5){
console.log('yes');
}else{
console.log('no');
}
console.log('toString' in obj5);//in,继承来的属性,返回true
console.log(obj5.hasOwnProperty('toString'));//继承来的属性,返回false
在JavaScript中,所有由var申明的全局变量都是顶层对象(window)的属性(--一切皆对象),都可以用in运算符检测。
console.log('wondow -------');
b=1000;
console.log(b in window);//false
var a=100000;
console.log(a in window);//true
var x=1;
if(window.x){
console.log('这种方法不能检测空字符串或null或undefined');
}
if(x){
//执行不下去了,报错,not definded
}
for...in循环遍历对象属性:
1.只遍历可遍历(enumerable)的属性,会跳过不可遍历的属性;
2.不仅遍历自身属性,还遍历继承属性。
with:操作同一个对象的多个属性时,提供书写上的一些方便。
var obj6={
name:"apple",
name1:'blue',
name2:'cat'
};
console.log('obj6-----');
with(obj6){
console.log(name);//返回"apple"
}
但是with很容易创造全局变量(即没有经过var申明):
with(obj6){
age=100;//obj6中没有这个属性
console.log(age);
}
所以with缺点:无法判断变量如age是对象的一个属性,还是一个全局变量;这样不利于代码的排错和模块化;编译器无法对代码进行优化,只能运行时判断,拖慢了运行速度。因此不建议使用with,可以采用临时变量进行代替。
但是with的一个使用场景是:模板引擎变量替换。
javascript(三):对象的更多相关文章
- JavaScript RegExp 对象的三种方法
JavaScript RegExp 对象有 3 个方法:test().exec() 和 compile().(1) test() 方法用来检测一个字符串是否匹配某个正则表达式,如果匹配成功,返回 tr ...
- 从零构建JavaScript的对象系统
一.正统的类与继承 类是对象的定义,而对象是类的实例(Instance).类不可直接使用,要想使用就必须在内存上生成该类的副本,这个副本就是对象. 以Java为例: public class Grou ...
- JavaScript 三个组成部分
1.核心(ECMAScript) ECMAScript 仅仅是一个描述,定义了脚本语言的所有属性.方法和对象.其他语言可以实现 ECMAScript 来作为功能的基准,JavaScript 就是这样: ...
- 关于JavaScript中对象的继承实现的学习总结
一.原型链 JavaScript 中原型链是实现继承的主要方法.其主要的思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.实现原型链有一种基本模式,其代码如下. function Super ...
- javascript中对象的深度克隆
记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...
- JavaScript日期对象使用总结
javascript Date日期对象的创建 创建一个日期对象: var objDate=new Date([arguments list]); 我总结了参数形式主要有以下3种: new Date(& ...
- JavaScript 三种创建对象的方法
JavaScript中对象的创建有以下几种方式: (1)使用内置对象 (2)使用JSON符号 (3)自定义对象构造 一.使用内置对象 JavaScript可用的内置对象可分为两种: 1,JavaScr ...
- JavaScript 本地对象、内置对象、宿主对象
首先解释下宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序.如:web浏览器,一些桌面应用系统等.即由web浏览器或是这些桌面应用系统早就的环境即宿主环境. ...
- 从头开始学JavaScript (三)——数据类型
原文:从头开始学JavaScript (三)--数据类型 一.分类 基本数据类型:undefined.null.string.Boolean.number 复杂数据类型:object object的属 ...
- 第一百二十节,JavaScript事件对象
JavaScript事件对象 学习要点: 1.事件对象 2.鼠标事件 3.键盘事件 4.W3C与IE JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功 ...
随机推荐
- 搭建Kubernetes服务集群遇到的问题
kube-proxy问题: Apr 12 09:42:49 compute1 kube-proxy[12965]: E0412 09:42:49.602342 12965 reflector.go:2 ...
- 洛谷P4562 [JXOI2018]游戏 数论
正解:数论 解题报告: 传送门! 首先考虑怎么样的数可能出现在t(i)那个位置上?显然是[l,r]中所有无法被表示出来的数(就约数不在[l,r]内的数嘛QwQ 所以可以先把这些数筛出来 具体怎么筛的话 ...
- AT2046 Namori 图论
正解: 解题报告: 传送门! 首先看数据范围可以发现要么是棵树要么是个奇环要么是个偶环 然后就分类讨论分别看下这几个情况 首先是棵树的 首先可以想到树的情况就是个二分图,所以不妨把颜色重定义,让奇数层 ...
- 【Python全栈-后端开发】Django入门基础
Django基础知识 一. 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的 ...
- No converter found for return value of type
springMVC请求接口的时候报500 No converter found for return value of type 原因:这是因为springmvc默认是没有对象转换成json的转换器 ...
- swift 相机、相册、定位的权限判断
//是否开启相机权限 func IsOpenCamera() -> Bool{ let authStatus = AVCaptureDevice.authorizationStatus(for: ...
- eslint 在VSCode中不能使用
在VSCode中安装号eslint插件,还是不能使用,还需安装 npm install eslint-plugin-promise --save-dev 我也不知道为什么?我现在只是用两天不到vsco ...
- SpringMVC(三):参数绑定、输入输出转换
一.参数解析绑定 1. 自定义绑定:不绑定某些项 @InitBinder private void initBinder(WebDataBinder dataBinder) { dataBinder. ...
- OC动画:CAAnimationGroup
//贝塞尔曲线路径 UIBezierPath *movePath = [UIBezierPath bezierPath]; [movePath moveToPoint:CGPointMake(10.0 ...
- docker+jenkins的构建历史记录(Build History)时间不正确
1.分别查看宿主机时间和容器时间 宿主机时间 root@fcaad17f146a:/# date Fri Jan :: CST 容器时间 [root@ ~]# docker exec -ti 8798 ...