5.js仔必看的对象八股文

1.讲一讲你对对象的理解,手写一个基础的js对象

  • 在js中对象是一个复杂的数据类型

  • 对象类型又属性和方法(函数)组成

  • 下面我手写一个基础的对象 使用的对象字面量的方法去创建对象(其实还有创建对象的方法,比如new object+动态添加属性 new其他类)

 var person = {
      name: "校草",
      age: 20,
      friend: {
        name: "kobe",
        age: 30
      },
      eat: function () {
        console.log("eating");
      },
      run: function () {
        console.log("runing");
      },
      study: function () {
        console.log("studing");
      }
    }
  • 有一个重点,属性之间,需要,隔开哦

2.讲一讲对象的常见操作,并且手写一个例子出来

  • 对象的使用常见操作有如下(代码还是拿第一题的对象举例)

    • 1.访问对象属性

      • console.log(person.name); console.log(person.friend.age);
        person.eat()

    • 2.修改对象属性

      •  person.age = 30
         person.friend.age = 90     person.eat = function () {
              console.log("老子被改了");

    • 3.添加对象属性

      •     person.width = "80斤"
            person.swim = function () {
              console.log("老子是新添加的游泳王");
            }

    • 4.删除对象属性

      • delete person.name

3.讲一讲对象的遍历,手撕几个遍历例子

  • 对象的遍历:表示获取对象中所有的属性和方法

  • 其中Object.keys() 方法 会返回一个:由一个给定对象的自身可枚举属性组成的数组;

  •  // 1.商品对象 以下两个遍历例子都是基于这个对象
        var product = {
          name: "商品",
          priece: 900,
          shoProduct: function () {
            console.log("恭喜你购买商品");
          }
        }

  • 普通for循环
        var productkeys = Object.keys(product)
        for (var i = 0; i < productkeys.length; i++) {
          var key = productkeys[i]
          var value = product[key]
          console.log(`key:${key}, value:${value}`);
        }
    • 该例子使用的for in遍历方法
       for (var key in product) {
            var value = product[key]
            console.log(`key:${key}, value:${value}`);
          }

4.讲讲this以及指向,使用场景

  • 以默认的方式调用一个函数的时候,this指向window

  • 通过对象调用,this指向调用的对象

  • this有两种绑定规则

    • 默认的方式调用函数,指向window

    •     function foo(name, age) {
            console.log(arguments)
            console.log(this)
          }
          foo("abc", 123)
    • function foo() {
        console.log(this)
      }
      var bar = {
        name: "bar",
        foo: foo
      }
      ​
      bar.foo() // this -> bar
    • this让js更加灵活 ,以下是应用场景的例子

  • 如果函数是被某一个对象来引用并且调用的话,那么this会指向这个对象

5.总结一下Chrome的debug调试技巧

  • crome开发者工具consloe(控制台)区域,可以查看代码中使用consloe.log()输出的信息

  • 给代码加断点的话,代码运行时遇到断点会停止执行

  • watch(监视)区域:可以输入对应的变量,可以管擦代码运行的时候,变量的变化。

  • breakpoints(断点)区域:可以查看js代码中所有添加的断点

  • scope(作用域)区域:可以查看代码生成的作用域

  • 左上方工具栏按钮的作用(左到右)

    • 1.控制调试程序的暂停和恢复

    • 2.跳过下一个函数调用,执行下一行代码

    • 3.进入下一个函数调用,可查看函数内部执行顺序

    • 4.跳出当前函数

    • 5.进入下一个函数调用,不会进入setTimeout内部的函数

6.讲一讲值传递和引用传递的区别

  • 值类型(原始类型):在变量中保存的是值本身,占据的空间是在栈内存中分配的

  • 引用类型(对象类型):在变量中保存的是对象的“引用”,占据的空间是在堆内存中分配的

  • 将值类型传递给函数参数,函数内部对参数的改变不会影响函数外部的变量

    function foo(a) {
      a = 200
    }
    var num = 100
    foo(num) 
    console.log(num) // 100
  • 将引用类型传递给函数参数,函数参数保存的是对象的"引用",在函数内部修改对象的属性会影响函数外部的变量

function foo(a) {
  a.name = "HTML"
}
​
var obj = {
  name: "JavaScript"
}
foo(obj)
console.log(obj.name) // HTML

7.讲讲创建对象的方案,类和对象的关系以及构造函数

  • 创建对象的方案有很多种,

    • 常见的有字面量(这样遇到很多对象,都有相同的属性的时候,需要重复写代码)

    • 还有设计模式中的工厂函数,它的原理是封装一个函数,这个函数用于帮助我们创建一个对象,我们只需要调用这个函数就可以

      • 工厂模式就是一种常见的设计模式

      • // 工厂函数(工厂生产student对象) -> 一种设计模式
         // 通过工厂设计模式, 自己来定义了一个这样的函数
        function createStudent(name, age, height) {
             var stu = {}
             stu.name = name
             stu.age = age
             stu.height = height
             stu.running = function() {
               console.log("running~")
             }
             return stu
           }
          
           var stu1 = createStudent("why", 18, 1.88)
           var stu2 = createStudent("kobe", 30, 1.98)
           var stu3 = createStudent("james", 25, 2.05)
           console.log(stu1)
           console.log(stu2)
           console.log(stu3)
      • 因为工厂创建对象有一个比较大的问题就是在打印对象的时候,对象类型都是object类型,非常不方便,所以在开发中构造函数用的将对多一些。

      • 构造函数也称之为构造器,通常我们在创建对象时会调用的函数

      • 在其他面相的编程语言中,构造函数是存在于类中的一个方法,称之为构造方法;

      • 但是js中的构造函数有点不太一样,构造函数扮演了其他语言类的角色;也就是说在js中,构造函数其实就是类的扮演者,

        • 比如说系统默认给我们提供的date就是一个构造函数,也可以看成是一个类;

        • 在ES5之前,我们都是通过function来声明一个构造函数的,之后通过new关键字来调用;

        • 但是在ES6之后,js可以像别的语言一样,通过class来声明一个类;

      • 类和对象的关系就是

        • 类就是构造函数,其实可以理解为模版

        • 对象就是属性具体的对象,比如水果是统称,具体的对象有苹果、橘子等等

      • 构造函数写法如下

      •     // JavaScript已经默认提供给了我们可以更加符合JavaScript思维方式(面向对象的思维方式)的一种创建对象的规则
            // 在函数中的this一般指向某一个对象
            /*
              如果一个函数被new操作符调用
                1.创建出来一个新的空对象
                2.让this指向这个空对象
                3.执行函数体的代码块
                4.如果没有明确的返回一个非空对象, 那么this指向的对象会自动返回
            */
            function coder(name, age, height) {
              this.name = name
              this.age = age
              this.height = height
              this.running = function() {
                console.log("running~")
              }
            }
        ​
            // 在函数调用的前面加 new 关键字(操作符)
            var stu1 = new coder("why", 18, 1.88)
            var stu2 = new coder("kobe", 30, 1.98)
            console.log(stu1, stu2)
      • 补充:面试官喜欢问为什么构造函数不需要添加对象以及返回值

        • 因为new操作符会创建一个新的对象出来

        • 如果没有明确的返回一个非空对象,那么this指向的对象会自动返回

        • 如果一个函数被new操作符调用,他会出现以下情况

          • 1.创建出一个新的对象

          • 2.让this指向这个空对象

          • 3.执行函体的代码块

          • 4.如果没有明确返回一个非空对象,那么this指向的对象会自动返回

    • 8.为什么现在开发中不建议用var了,从对象的角度讲一讲

    • 因为var定义变量会默认添加到windo上面。

  • 31
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值