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()
就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是false
。value
,get
和set
字段的默认值为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未定义 // 写法一:报错 if (x) { return 1; } // 写法二:不正确 if (window.x) { return 1; } // 写法三:正确 if ('x' in window) { return 1; }
var o = new Object();
o.hasOwnProperty('toString') // false'toString'in o // true
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']
// 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
var o = {p: 1}; Object.keys(o) // ["p"] delete o.p // true o.p // undefined Object.keys(o) // [] var o={}; delete o. p // true