对象(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(三):对象的更多相关文章

  1. JavaScript RegExp 对象的三种方法

    JavaScript RegExp 对象有 3 个方法:test().exec() 和 compile().(1) test() 方法用来检测一个字符串是否匹配某个正则表达式,如果匹配成功,返回 tr ...

  2. 从零构建JavaScript的对象系统

    一.正统的类与继承 类是对象的定义,而对象是类的实例(Instance).类不可直接使用,要想使用就必须在内存上生成该类的副本,这个副本就是对象. 以Java为例: public class Grou ...

  3. JavaScript 三个组成部分

    1.核心(ECMAScript) ECMAScript 仅仅是一个描述,定义了脚本语言的所有属性.方法和对象.其他语言可以实现 ECMAScript 来作为功能的基准,JavaScript 就是这样: ...

  4. 关于JavaScript中对象的继承实现的学习总结

    一.原型链 JavaScript 中原型链是实现继承的主要方法.其主要的思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.实现原型链有一种基本模式,其代码如下. function Super ...

  5. javascript中对象的深度克隆

    记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...

  6. JavaScript日期对象使用总结

    javascript Date日期对象的创建 创建一个日期对象: var objDate=new Date([arguments list]); 我总结了参数形式主要有以下3种: new Date(& ...

  7. JavaScript 三种创建对象的方法

    JavaScript中对象的创建有以下几种方式: (1)使用内置对象 (2)使用JSON符号 (3)自定义对象构造 一.使用内置对象 JavaScript可用的内置对象可分为两种: 1,JavaScr ...

  8. JavaScript 本地对象、内置对象、宿主对象

    首先解释下宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序.如:web浏览器,一些桌面应用系统等.即由web浏览器或是这些桌面应用系统早就的环境即宿主环境. ...

  9. 从头开始学JavaScript (三)——数据类型

    原文:从头开始学JavaScript (三)--数据类型 一.分类 基本数据类型:undefined.null.string.Boolean.number 复杂数据类型:object object的属 ...

  10. 第一百二十节,JavaScript事件对象

    JavaScript事件对象 学习要点: 1.事件对象 2.鼠标事件 3.键盘事件 4.W3C与IE JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功 ...

随机推荐

  1. 《mongoDB》概念-数据类型

    一:概念 - mongoDB 是一个面向文档的数据库,而不是关系型数据库. - 摘自<mongoDB 权威指南 第2版>第3页 二:数据类型 - null - 用于表示空值或者不存在的字段 ...

  2. adb devices offline的解决办法

    手机通过USB线连接电脑后,输入adb devices 识别为 offline,如图: 解决办法如下: (0) 换数据线.换主机后面的USB口先试一下 (1) 重启adb服务 adb kill-ser ...

  3. SC-FDM和OFDM的区别

    3GPP定义的LTE空中接口,在下行采用正交频分多址(OFDMA)技术,在上行采用的就是这个单载频频分多址(SC-FDMA)技术. SC-FDMA(Single-carrier Frequency-D ...

  4. c语言指针应用

    指针变量指向数组元素: #import <stdio.h> int main() { int a[10]={1,2,3,4,5,6,7,8,9,0}; int *p; p=a; for ( ...

  5. iOS 允许po打印frame等内容

    终端: 1. touch ~/.lldbinit 2. echo display @import UIKit >> ~/.lldbinit 3. echo target stop-hook ...

  6. mysql 初识数据库 目录

    数据库管理软件的由来 数据库概述 MySQL介绍 Window版本 安装mysql linux 安装mysql yum方式 windows平台mysql密码设置 windows平台mysql密码破解设 ...

  7. OpenWrt 路由系统上抓包

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/qianguozheng/article/details/32108093 前言: 做路由器开发,难免 ...

  8. android常用函数

    package com.cqytjr.util; import java.io.File; import java.net.InetAddress; import java.net.NetworkIn ...

  9. docker+jenkins+maven简单部署

    构建jar包 1.拉取jenkins容器景象 docker pull docker.io/jenkins/jenkins 2.配置映射目录,创建一个容器 mkdir /data/jenkins doc ...

  10. ansible实现keepalived和nginx高可用

    实验环境 ansible节点 keepalived+nginx节点1    ansible自动安装配置 keepalived+nginx节点2    ansible自动安装配置 httpd节点1 ht ...