学习js高级第一期笔记

  1. 简单创建一个基本对象

 var students=[s1]//保存十个学生对象
        var s1={
            name:"王一",
            age:21,
            eat:function(){
                console.log(this.name+"正在吃")
            }
        }
        var s2={
            name:"王一",
            age:21,
            eat:function(){
                console.log(this.name+"正在吃")
            }
        }
        var s3={
            name:"王一",
            age:21,
            eat:function(){
                console.log(this.name+"正在吃")
            }
        }

优点:最大的优点就是简单明了

缺点:当需要创建的对象比较多的时候就比较麻烦了,无法做到量产的目的

2.工厂模式

 function createStudent(name,age){
            var s=new Object()//{}
            s.name=name
            s.age=age
            s.eat=function(){
                console.log(this.name+"正在吃")
            }
            return s
        }
       
        var s1=createStudent("王一",21)
        var s2=createStudent("王二",21)
        ......
        

优点:相较于之前的的创建对象的方式最大的优点在于可以减少很多重复的代码,提高创建的效率

缺点:通过工厂模式创建出来的对象,无法明确对应类型

3.构造函数

 function Student(name,age){
            this.name=name
            this.age=age
            this.eat=function(){
                console.log(this.name+'正在吃')
            }
        }
        //new做了什么?
        //1.创建一个空对象 {}
        //2.执行后面的构造函数,将函数内容this,指向空对象
        //3.函数执行完成后,将创建的空对象返回给前方变量
        var s1=new Student("王一",21)
        var s2=new Student("王仁",21)
        var s3=new Student("王四",23)

优点:弥补了工厂函数创建对象的缺陷,用来模拟类,明确了类型

缺点:共用的方法,占据内存

4.原型

 //在创建构造函数的过程中,将共有的方法放入构造函数的原型里
        function Student(name,age){
            this.name=name
            this.age=age
        }
        //prototype
        Student.prototype.eat=function(){
            console.log(this.name+"正在吃")
        }
        var s1=new Student("王一",21)
        var s2=new Student("王二",22)
        console.log(s1.eat==s2.eat)//true
        //__proto__ 实例化对象的原型
        //prototype 构造函数的原型

优点:在构造函数时将共有的方法放到原型中,构造函数可直接调用,节省了资源的占用

缺点:原型链的顶端是Object,如果给Object添加一个属性,那么所建造的构造函数都可以使用这个属性,个人感觉也不是很大的缺点,不过总感觉所构造的函数多了点什么

以上是第一期所学习的东西,下面是搜集的15道前端面试题

1.什么是原型链

原型链用于在现有对象的基础上构建新类型的对象。它类似于基于类的语言中的继承。

对象实例上的原型可通过Object.getPrototypeOf(object)proto属性获得,而构造函数上的原型可通过Object.prototype 获得

2.数组切片方法的目的是什么

slice()方法将数组中的选定元素作为新数组对象返回。它选择从给定 start 参数开始的元素,并在给定的可选 end 参数处结束,不包括最后一个元素。如果您省略第二个参数,那么它会一直选择到最后。

这种方法的一些例子是,

let arrayIntegers  =  [ 1 ,  2 ,  3 ,  4 ,  5 ] ; 
let arrayIntegers1  =  arrayIntegers.splice( 0 , 2 ) ;  // 返回 [1,2] 
let  arrayIntegers2  =  arrayIntegers.splice( 2 , 3 ) ;  // 返回 [3] 
let  arrayIntegers3  =  arrayIntegers.splice(4 ); //返回 [5]

注意: Slice 方法不会改变原始数组,但它会将子集作为新数组返回。

3.== 和 === 运算符有什么区别

JavaScript 提供了严格(===, !==) 和类型转换(==, !=) 相等比较。严格运算符考虑变量的类型,而非严格运算符根据变量的值进行类型校正/转换。严格的运算符遵循以下不同类型的条件,

  1. 当两个字符串具有相同的字符序列、相同的长度和对应位置的相同字符时,它们是严格相等的。
  2. 当两个数字在数值上相等时,它们是严格相等的。即,具有相同的数值。这里面有两种特殊情况,
    1. NaN 不等于任何东西,包括 NaN。
    2. 正零和负零彼此相等。
  3. 如果两个布尔操作数都为真或都为假,则两个布尔操作数严格相等。
  4. 如果两个对象引用同一个对象,则它们是严格相等的。
  5. Null 和 Undefined 类型不等于 ===,但等于 ==。即,null===undefined --> false 但 null==undefined --> true

4.什么是声明

声明是一种 JavaScript 机制,其中变量和函数声明在代码执行之前被移动到其作用域的顶部。请记住,JavaScript 只提升声明,而不是初始化。

5.什么是闭包

闭包是函数和声明该函数的词法环境的组合。即,它是一个内部函数,可以访问外部或封闭函数的变量。闭包具有三个作用域链

  1. 自己的范围,其中在其大括号之间定义的变量
  2. 外部函数的变量
  3. 全局变量

6.什么是模块

模块是指独立的、可重用的代码的小单元,也是许多 JavaScript 设计模式的基础。大多数 JavaScript 模块都导出对象字面量、函数或构造函数

7.javascript中的作用域是什么

范围是在运行时代码的某些特定部分中的变量、函数和对象的可访问性。换句话说,范围决定了代码区域中变量和其他资源的可见性。

8.什么是回调函数

回调函数是作为参数传递给另一个函数的函数。该函数在外部函数内部被调用以完成一个动作。

9.什么是回调地狱

Callback Hell 是一种具有多个嵌套回调的反模式,这使得在处理异步逻辑时代码难以阅读和调试。回调地狱如下所示,

async1 (函数( ) { 
    async2 (函数( ) { 
        async3 (函数( ) { 
            async4 (函数( ) { 
                ... . 
            } ) ; 
        } ) ; 
    } ) ; 
} );

10.什么是 typeof 运算符

您可以使用 JavaScript typeof 运算符来查找 JavaScript 变量的类型。它返回变量或表达式的类型。

11.什么是未定义属性

undefined 属性表示一个变量没有被赋值,或者根本没有声明。未定义值的类型也是未定义的。

12.什么是空值

值 null 表示有意缺少任何对象值。它是 JavaScript 的原始值之一。空值的类型是对象。您可以通过将值设置为 null 来清空变量。

13.null 和 undefined 有什么区别

以下是 null 和 undefined 之间的主要区别,

空值 不明确的
它是一个赋值值,表示变量不指向任何对象。 它不是一个赋值值,其中一个变量已被声明但尚未被赋值。
null 的类型是对象 未定义的类型未定义
null 值是表示 null、空或不存在的引用的原始值。 未定义值是未为变量赋值时使用的原始值。
表示变量没有值 表示变量本身不存在
在执行原始操作时转换为零 (0) 在执行原始操作时转换为 NaN

14.什么是 NaN

isNaN() 函数用于判断一个值是否为非法数字(Not-a-Number)。即,如果值等于 NaN,则此函数返回 true。否则返回false。

15.什么是事件流

事件流是在网页上接收事件的顺序。当您单击嵌套在各种其他元素中的元素时,在您的单击实际到达其目的地或目标元素之前,它必须首先触发其每个父元素的单击事件,从全局窗口对象的顶部开始。事件流有两种方式

  1. 从上到下(事件捕获)
  2. 自下而上(事件冒泡)

事件冒泡是一种事件传播,事件首先在最内层的目标元素上触发,然后依次在同一嵌套层次结构中的目标元素的祖先(父级)上触发,直到到达最外层的 DOM 元素。

你可能感兴趣的