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事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功 ...
随机推荐
- 内部排序->选择排序->树形选择排序
文字描述 树形选择排序又称锦标赛排序; 比如,在8个运动员中决出前3名至多需要11场比赛, 而不是7+6+5=18场比赛(它的前提是甲胜乙,乙胜丙,则甲必能胜丙) 首先对n个记录的关键字进行两两比较, ...
- oracle partition table 分区表详解
Oracle partition table 分区表详解 分区表就是通过使用分区技术,将一张大表,拆分成多个表分区(独立的segment),从而提升数据访问的性能,以及日常的可维护性.分区表中,每个分 ...
- 2018/04/24 PHP 设计模式之注册树模式
之前学习了工厂模式和单例模式,明白了他们的意义. 但是我们在之后的使用中会发现一个问题,在新建一个实例的时候还是需要调用一个单例或者工厂,之后还是造成了代码和耦合和不好处理. 下面开始说一下: -- ...
- inet_addr()和inet_ntoa()使用注意
inet_addr():无法处理255.255.255.255,认为该ip为非法,返回-1 inet_ntoa():转换后地址存储在静态变量中,连续两次调用,第二次会覆盖第一次的值. 建议使用inet ...
- Dubbo服务化框架使用整理
一.垂直应用架构拆分 在应用架构的演进过程中,垂直应用架构因为开发便捷,学习成本低,对于实现业务功能的增删改查提供了高效的开发支持,有利于前期业务高速发展的的快速实现.但是随着系统业务功能的不断扩展和 ...
- MyBatis学习(01)之解决mapper绑定异常
解决mapper绑定异常 HTTP Status 500 - Request processing failed; nested exception is org.apache.ibatis.bind ...
- 【托业】【新托业TOEIC新题型真题】学习笔记10-题库七-P7
1.to request a review of information 要求审查资料 2.inform of 将…告知(某人); 3.flammable [ˈflæməbl]adj.易燃的,可燃的; ...
- RestFramework——API设计规范
what's the RESTful RestFramework是一个能快速为我们提供API接口,方便我们编程的框架.API是后端编程人员写的,为了让前端拿数据的一个接口,通常就是以url的形式存在. ...
- ASP.NET学习笔记(1)
1.ASP.Net简介 A.ASP.Net动态网页技术.在服务器端运行.Net代码,动态生成HTML.在浏览器可以使用JavaScript.Dom完成前台工作.如存储数据.访问数据库.业务逻辑运算等可 ...
- 共分为六部完成根据模板导出excel操作
第一步.设置excel模板路径(setSrcPath) 第二步.设置要生成excel文件路径(setDesPath) 第三步.设置模板中哪个Sheet列(setSheetName) 第四步.获取所读取 ...