[关闭]
@Wangww0925 2019-08-07T07:53:29.000000Z 字数 4848 阅读 198

ECMAScript的核心语言 (二)对象 Object

js-笔记


对象 Object: 一切皆对象

概念:

对象是一种数据类型

对象是描述一个具体的事物

对象可以看做属性的无序集合


对象的组成: 属性、方法


对象的书写方式: json格式

1、属性名

引号可以省略

以 关键字 或 - 来命名不能省略引号,如:'if'、'skill-2';不推荐使用关键字

2、分隔符

,逗号隔开

最后一个值不需要用逗号

3、属性值: 数字类型不需要引号

例子:

  1. var obj = {
  2. name:'www',
  3. 'if':10,
  4. 'skill-2':'css'
  5. }
  6. console.log(obj.name); // 返回 www
  7. console.log(obj.if); // 返回 10,但是不推荐使用关键字
  8. // console.log(obj.skill-2); // 返回 NaN ,不能查询结果
  9. console.log(obj['skill-2']); // 返回 css

对象的分类:

1、 内置对象: 数组、函数、日期、正则 等....

2、 宿主对象:

针对于前端来说,JS运行在浏览器上,浏览器就是JS的宿主

htmlElement(元素) comment(注释) text(文本) attribute(属性)

3、 自定义对象


对象的声明(创建):

1、 使用对象直接量创建:

  1. 1. 创建一个空对象
  2. var obj1 = {};
  3. 2. 创建一个对象,并赋值
  4. var obj2 = {
  5. name:'www',
  6. age:18,
  7. sex:'女'
  8. }
  9. 3. 包含 数组、属性、方法 的对象
  10. var obj3 = {
  11. user:['html','css','js'],
  12. type:'post',
  13. test:function(){
  14. console.log('我是一个方法')
  15. }
  16. }

2、 使用构造函数创建:

构造函数的名字: Object Array Number String ......

  1. var obj4 = new Object(); // 创建空的对象

3、 使用Object.create() : ES5的新方法

需要传入原型

1、 只有一个参数,不继承构造函数的方法和属性

  1. function User(){
  2. this.name = 'www';
  3. this.age = 12;
  4. }
  5. var obj = Object.create(User.prototype);
  6. console.log(obj); // 返回 User {}
  7. console.log(obj.name); // 返回 undefined

2、 两个参数,参数二传入对象描述

  1. function Info(){}
  2. var obj3 = Object.create(Info.prototype, {
  3. name:{
  4. value:'www'
  5. }
  6. })
  7. console.log(obj3); // 返回 Info {name: "www"}
  8. console.log(obj3.name); // 返回 www

对象属性 访问、修改、添加: 使用.运算符 或者 []

1、 添加对象属性

  1. var obj = {}
  2. obj.name = 'www'; // 使用. 添加属性
  3. // obj['name'] = 'www'; // 使用[] 添加属性
  4. // 添加方法
  5. obj.test = function(){
  6. console.log('I can play');
  7. }
  8. console.log(obj); // 返回 {name: "www", test: function(){}}

2、 修改对象属性

  1. var obj = {}
  2. obj.name = 'abc';;
  3. obj.test = function(){
  4. console.log('I can look A movie');
  5. }
  6. console.log(obj); // 返回 {name: "abc", test: function(){}}

3、 访问对象属性

  1. var obj = {
  2. name: "abc",
  3. test: function(){
  4. console.log('I can look A movie');
  5. }
  6. }
  7. console.log(obj.name); // 返回 abc
  8. console.log(obj['name']); // 返回 abc
  9. obj.test(); // 返回 I can look A movie

4、 . 和 [] 的区别:

  1. var obj = {
  2. age:99
  3. }
  4. var a = 'age';
  5. console.log(obj.a); // 返回 undefined,属性里面没有a属性
  6. console.log(obj[a]); // 返回 99,使用[]可以访问

对象属性 删除: 使用delete

  1. var obj = {
  2. name:'www',
  3. age:18
  4. }
  5. delete obj.age; // 删除属性名为age的属性
  6. console.log(obj); // 返回 {name: "www"}

对象属性检测:

建议使用 in

1、 使用关键字 in : 返回 true | false,建议使用

  1. var obj = {
  2. name:'www',
  3. age:18
  4. }
  5. console.log('name' in obj); // 返回 true
  6. console.log('skill' in obj); // 返回 false

2、 使用 === undefined 判断: 存在局限性

  1. var obj = {
  2. name:'www',
  3. age:18
  4. }
  5. console.log(obj.skill); // 返回 undefined
  6. if(obj.skill === undefined){
  7. console.log("不存在")
  8. }else{
  9. console.log("存在")
  10. }

3、 特殊:存在skill属性,但其属性值为undefined,此时不能使用 === undefined来判断,要使用in来判断

  1. var obj = {
  2. name:'www',
  3. age:18,
  4. skill:undefined
  5. }
  6. console.log(obj.skill); // 返回 undefined
  7. console.log('skill' in obj); // 返回 true

对象的遍历:

1、 for in遍历

  1. var info = {
  2. name:'www',
  3. age:18,
  4. skill:'css'
  5. }
  6. for(var i in info){
  7. console.log(i + ':' + info[i]); // 返回 name:www age:18 skill:css
  8. }

2、 Object.keys(obj) ,ECMA5提供的新方法

  1. var info = {
  2. name:'www',
  3. age:18,
  4. skill:'css'
  5. }
  6. var arr = Object.keys(info); // 将对象的属性名 方法名 放到一个数组中
  7. console.log(arr); // 返回 ["name", "age", "skill"]
  8. arr.reverse(); // 验证能不能使用数组的方法
  9. console.log(arr); // 返回 ["skill", "age", "name"] ,通过翻转证明了这是一个数组
  10. for(var j = 0; j < arr.length; j++){
  11. console.log( arr[j] + ':' + info[arr[j]]); // 返回 skill:css age:18 name:www
  12. }

对象中的this:

1、 当前对象

  1. var obj = {
  2. name:'www',
  3. age:18,
  4. say:function(){
  5. console.log(this.name + '今年' + this.age + '岁了'); //
  6. }
  7. }
  8. obj.say() // 返回 www今年18岁了,this是本对象

2、 全局对象window

-- 作用域的顶端

-- 使用return之后,将当前对象变成全局对象

  1. var name = 'abc';
  2. var obj = {
  3. name:'www',
  4. age:18,
  5. say:function(){
  6. return function(){
  7. console.log(this.name);
  8. }
  9. }
  10. }
  11. // obj.say() // 返回 函数 function(){ console.log(this.name); }
  12. obj.say()(); // 返回 abc

3、 改变this的指向

  1. var name = 'abc';
  2. var obj = {
  3. name:'www',
  4. age:18,
  5. say:function(){
  6. var that = this; // this代表obj
  7. return function(){
  8. console.log(that.username);
  9. }
  10. }
  11. }
  12. obj.say()(); // 返回 www

对象的引用比较:

1、 原始类型的数据比较:只是值的比较

  1. console.log(100 == 100); // 返回 true
  2. console.log('abc' == 'abc'); // 返回 true
  3. console.log([1,2,3] == [1,2,3]); // 返回 false

2、 对象类型的数据比较:要求值和引用的地址都相等

  1. function info(name,age){
  2. this.name=name;
  3. this.age=age;
  4. this.test = function(){
  5. console.log('ceshi');
  6. }
  7. }
  8. var people1 = new info('www',18);
  9. console.log(people1); // 返回 {name: "www", age: 18}
  10. var people2 = new info('abc',12);
  11. console.log(people2); // 返回 {name: "abc", age: 12}
  12. console.log(people1.drink == people2.drink); // 返回 false,引用的地址不同

构造函数的特点:

1、 用来新建同时初始化一个新对象

  1. var arr = new Array();

2、 一个构造函数可以有多个对象

  1. var arr1 = new Array();
  2. var arr2 = new Array();
  3. var arr3 = new Array();

3、 每个对象都有与之对应的构造函数,如:

  1. 1. 直接创建字符串
  2. var str = 'abc';
  3. 2. 通过构造函数创建字符串
  4. var str1 = new String('abc');
  5. console.log(str1); // 返回 String {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}
  6. 3. str str1 使用的时候结果是一样的
  7. console.log(str == str1); // 返回 true
  8. console.log(str === str1); // 返回 false

判断自有属性 obj.hasOwnProperty('属性名') : true | false

  1. var list = document.getElementsByTagName('li');
  2. for(var i in list){
  3. if(list.hasOwnProperty(i)){
  4. console.log(list[i]);
  5. }
  6. }

作者 wendy
2019 年 5月 23日

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注