javaScript对象

 js中的对象简介

js中的数据类型
string字符串
number数值
boolean布尔值
null空值
undefined未定义
以上五种数据类型属于基本数据类型

object对象
基本数据类型都是单一的值"hello" 123 true,值和值之间没有任何关系

在js中表示一个人的信息(name gender age)

var name = "孙悟空";
var gender = "男";
var age = 18;

如果使用基本数据类型的数据,我们创建的变量都是独立的,不能成为一个整体
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性.

对象的三种分类
1.内建对象
由ES标准定义的对象,在任何ES的实现中都可以使用
比如,Math String Number Boolean function object 等等全都属于内荐对象
2.宿主对象
由js环境提供的对象,目前来说主要是由浏览器提供的对象
比如说BOM DOM
3.自定义对象
由开发人员自主创建的对象

第一:

创建对象1

var obj = {}

创建对象2
使用new的关键字调用函数,是构造函数constructor(建造者)

var obj = new Object();
console.log(typeof obj);

 创建对象3

如果对象中不存在指定的属性,Object.defineProperty()就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是falsevaluegetset字段的默认值为undefined。一个没有get/set/value/writable定义的属性被称为“通用的”,并被“键入”为一个数据描述符。

var o = {}; // 创建一个新对象

// 在对象中添加一个属性与数据描述符的示例
Object.defineProperty(o, "a", {
  value : 37,
  writable : true,
  enumerable : true,
  configurable : true
});

// 对象o拥有了属性a,值为37

// 在对象中添加一个属性与存取描述符的示例
var bValue;
Object.defineProperty(o, "b", {
  get : function(){
    return bValue;
  },
  set : function(newValue){
    bValue = newValue;
  },
  enumerable : true,
  configurable : true
});

o.b = 38;
// 对象o拥有了属性b,值为38

// o.b的值现在总是与bValue相同,除非重新定义o.b

// 数据描述符和存取描述符不能混合使用
Object.defineProperty(o, "conflict", {
  value: 0x9f91102, 
  get: function() { 
    return 0xdeadbeef; 
  } 
});
// throws a TypeError: value appears only in data descriptors, get appears only in accessor descriptors


第二:

我们可以向对象中添加属性
在对象中保存的值称之为属性
语法:对象.属性名 = 属性值;

var obj = new Object();
obj.name = "孙悟空"
obj.gender = "公"
obj.age = "18"
console.log(typeof obj);
console.log(obj);

修改对象的属性值
语法对象.属性名 = 新值

var obj = new Object();
obj.name = "孙悟空"
obj.name = "tom"
console.log(obj);

第三:

删除对象属性
语法:delete 对象.属性名

delete obj.neme;

第四:

向对象中添加属性
属性名
对象的属性名不强制要求遵守标识符的规范
什么乱七八遭的名字都可以使用
但是使用时还是按照标识符的规范来使用
如果使用特殊的属性,不能采用.的方式来操作
需要使用另一种方式:
语法:对象["属性名"] = 属性值;
读取时也是使用同样格式去读取
使用[]这种形式去操作,更加的灵活
在[]中可以直接传递一个变量,这样的变量值是多少就会读取那个属性

var obj = new Object();
obj["123"] = "789";
var n = "123";
console.log(obj[n]);

js中的属性值可以使任意的数据类型也可以嵌套

var obj = new Object();
obj.name = "猪八戒";
var n = new Object();
n.name = obj;
console.log(n);

 

in运算符

通过该运算符可以检查一个对象中是否含有指定的属性
如果有就返回true,没有就返回false
语法:
属性名 in 对象
检查obj中是否含有test属性没有就返回felse有的话返回true

var obj = new Object();
obj.name = "猪八戒";
var n = new Object();
n.name = obj;
console.log(n);
console.log("text" in obj);
console.log("name" in n);

 在JavaScript语言中,所有全局变量都是顶层对象(浏览器的顶层对象就是 window 对象)的属性,因此可以用 in 运算符判断,一个全局变量是否存在。

下面三种写法之中,如果 x 不存在,第一种写法会报错;如果 x 的值对应布尔值 false (比如 x 等于空字符串),第二种写法无法得到正确结果;只有第三种写法,才能正确判断变量 x 是否存在。
// 假设变量x未定义
// 写法一:报错
if (x) { return 1; }
// 写法二:不正确
if (window.x) { return 1; }
// 写法三:正确
if ('x' in window) { return 1; }
in 运算符的一个问题是,它不能识别对象继承的属性
下面代码中, toString 方法不是对象 o 自身的属性,而是继承的属性, hasOwnProperty 方法可以说明这一点。但是, in 运算符不能识别,对继承的属性也返回 true 。
var o = new Object();
o.hasOwnProperty('toString') // false'toString'in o // true

for…in循环

for...in 循环用来遍历一个对象的全部属性。
var o = {a: 1, b: 2, c: 3};
for (var i in o) {
 console.log(o[i]);
}
// 1
// 2
// 3

 下面是一个使用 for...in 循环,提取对象属性的例子。

var obj = {
 x: 1,
 y: 2
};
var props = [];
var i = 0;
for (props[i++] in obj);
props // ['x', 'y']
for...in 循环有两个使用注意点。
1.它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性它不仅遍历对象自身的属性,还遍历继承的属性。下面代码中, name 是对象本身的属性, describe 是对象继承的属性, for...in 循环的遍历会包括这两者。
2.如果只想遍历对象本身的属性,可以使用 hasOwnProperty 方法,在循环内部判断一下是不是自身的属性。对象 person 其实还有其他继承的属性,比如 toString。
这个 toString 属性不会被 for...in 循环遍历到,因为它默认设置为“不可遍历”
// name 是 Person 本身的属性
function Person(name) {
 this.name = name; }
// describe是Person.prototype的属性
Person.prototype.describe = function () {
 return 'Name: '+this.name;
};
var person = new Person('Jane');
// for...in循环会遍历实例自身的属性(name),
// 以及继承的属性(describe)
for (var key in person) {
 console.log(key);
}
// name
// describe
for (var key in person) {
if (person.hasOwnProperty(key)) {
console.log(key);
}
}
// name
 
person.toString()
//"[object Object]"
 

js中的数据类型

string字符串
number数值
boolean布尔值
null空值
undefined未定义
以上五种数据类型属于基本数据类型

引用数据类型object对象

基本数据类型和引用数据类型的区别
js中的变量都是保存在栈内存中储存
值于值之间是独立存在,修改一个变量不会影响其他变量

对象是保存到堆内存中的,每创建一个新对象,就会在堆内存中开辟一个新的空间
而变量保存是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,
当一个变量修改属性时,另一个也会受到影响.

var a = 123;
var b = a;
a++;
console.log(a);
console.log(b);


第二个变量赋值第一个变量然而改动第一个变量中的对象会出现怎样的问题?

var obj = new Object();
obj.name = "孙悟空";
var obj2 = obj;
obj.name = "猪八戒";
console.log(obj.name);
console.log(obj2.name);


第二个变量赋值第一个变量然而改动第二个变量中的对象会出现怎样的问题?

var obj = new Object();
obj.name = "孙悟空";
var obj2 = obj;
obj.name = "猪八戒";
obj2 = NaN;
console.log(obj.name);
console.log(obj2.name);

创建两个变量看似同一个对象会相等吗?

var obj = new Object();
obj.name = "孙悟空";
var obj2 = new Object();
obj2.name = "孙悟空";
console.log(obj.name);
console.log(obj2.name);
console.log(obj2 == obj);

使用对象的字面量来创建一个对象var a = new Object(); == var a = {};使用大括号的方式和使用new的方式本质是一模一样的
使用对象字面量,可以在创建对象时,直接指定对象中的属性
语法:{属性名:属性值,属性名:属性值.....}
对象字面量的属性可以加双引号也可以不加比如123数字可以不加
如果使用一些特殊的名字,必须加引号
属性名和属性值是一组一组的名值对结构
名和值之间使用:连接,多个值对使用,隔开

var a = {name:"猪八戒"}
console.log(a)
 

查看一个对象本身的所有属性,可以使用 Object.keys 方法

var o = {
 key1: 1,
 key2: 2
};
Object.keys(o);
// ['key1', 'key2']

delete 命令用于删除对象的属性,删除成功后返回 true

delete 命令删除 o 对象的 p 属性。删除后,再读取 p 属性就会返回 undefined ,而且 Object.keys 方法的返回值中, o 对象也不再包括该属性。注意,删除不存在的属性, delete 不报错,而且返回 true 。
下面代码中, o 对象并没有 p 属性,但是 delete 命令照样返回 true 。因此,不能根据 delete 命令的结果,认定某个属性是存在的,只能保证读取这个属性肯定得到 undefined 。只有一种情况, delete 命令会返回 false ,那就是该属性存在,且不得删除。
var o = {p: 1};
Object.keys(o) // ["p"]
delete o.p // true
o.p // undefined
Object.keys(o) // []
var o={};
delete o.
p // true
 
 
原文地址:https://www.cnblogs.com/niuyaomin/p/11924319.html