【前端面试】、JS高级实用问答,come on!

330 阅读9分钟

什么是js? js是一门脚本语言, 解释性语言 弱类型语言 动态型的语言 基于对象的语言

    js是怎么实现的呢?
            ECMAscript :规定的是 核心语法
            DOM:  文档对象模型   规定的是:如喝操作网页
            BOM:浏览器对象模型: 规定的是:如何操作浏览器

     创建对象的三种方式
            1.字面量方式
                var cc = {
                    name :"于谦"
                    sihai:function(){
                        console.log("你还")
                    }
                }
            2. 系统构造函数
            var cc = new  Object();
            cc.name="张三";
            cc.say=function(){
                    console.log("你好")
            }
            3.自定义构造函数
            function Aa (name ){
                this.name = name;
                this.eat = function (){
                    console.log("你好")
                }
            }



    New关键字的四个作用?
            1.开辟内存空渐渐
            2.给属性添加属性值
            3.把对象指向this
            4.返回this这个对象并把地址给了对象

    工厂模式创建对象和自定义构造函数创建对象有什么异同点?
        相同点:都可以创建对象,都有参数   都是函数

        自定义构造函数特点:
        1.函数名首字母大写
        2.没有new
        3.没有返回值
        4.this指向当前对象
        5.需要new才能创建对象
        工厂模式创建对象特点:
        1.函数名使用小驼峰命名法
        2.有new
        3.有返回值
        4.返回的就是当前对象
        5.不需要new直接调用方法 就能创建对象


    狗咱函数和实例对象之间的关系?
        1.实例对象是通过构造函数创建的 --创建的过程称为实例化
        2.实例对象的原型的构造函数指向自己的构造函数

     如何判断某对象是不是哪个数据类型?
        1.对象.__proto__.constructor == 构造函数
        2.对象 instanceof 构造函数

    什么是原型?
        实例对象中有一个属性: __proto__ 叫原型 也是一个对象 这个属性是给浏览器用的
        构造函数中有一个属性: prototype 叫原型 也是一个对象 这个属性是给开发者用的

    构造函数,实例对象和原型对象之间的关系?
        当构造函数创建出来以后,就会产生protype原型对象,实例对象的__proto__和构造函数的原型对象相等

    原型的作用?
            共享数据  节省内存

    如何把局部变量变成全局变量?
            把函数内部的变量赋值给window

    什么是原型链?
             1.原型链指的是 原型和实例对象之间的关系
             2.实例对象的__proto__指向自己的构造函数的原型

    什么是继承?
        js中的继承主要讲的是 构造函数与构造函数之间的关系


    继承有哪几种方式?
        1.借用构造函数继承
            在需要继承的构造函数中使用  被继承函数名.call(this,参数)
            注意:该继承的参数一定要添加在形参上

        2.拷贝继承
            遍历对象  然后把便利出来的每一项都添加在新数组里
        3.原型继承
            在需要继承的构造函数 的原型方法前  构造函数名.protype=new 被继承函数名()
        4.混合继承
            借用构造函数和原型继承的混合使用
    继承的作用?
            节省内存  共享数据

    函数声明和函数表达式有两点区别?
        1.函数声明在 if else 中 表现在ie10及以下  会直接去else 不去正确的
        2.函数表达式  会发生变量的提升  函数声明肯定不会  因为压根就没有变量  注意:要先声明  后调用

    call和apply 直接有什么异同点?
        都是用来调用函数,而且是立即调用
        如果第一个参数指定了 `null` 或者 `undefined` 则内部 this 指向 window
        但是可以在调用函数的同时,通过第一个参数指定函数内部 `this` 的指向
        call 调用的时候,参数必须以参数列表的形式进行传递,也就是以逗号分隔的方式依次传递即可
        apply 调用的时候,参数必须是一个数组,然后在执行的时候,会将数组内部的元素一个一个拿出来,与形参一一对应进行传递


    函数有几个成员?
        1.name  代表函数名
        2.lenght  代表形参个数
        3.arguments  代表实参个数
        4.caller  代表调用者


    函数作为返回值或者函数作为参数?
        函数作为返回值 和 函数作为参数都属于回调函数,说明实参和返回值的数据都需要进行处理

    什么式预解析?
        全局作用域
            只要变量或函数定义在script标签 里 或函数外 那么一定是全局变量或者全局函数 对应有全局作用域
        局部作用域
            在js中 局部作用域只有函数才能有 除此以外都没有
        块级作用域
            在js中 在现阶段没有块级作用域 其实在现在来讲是可以创建块级作用域的
            用let来定义变量 就可以创建 块级作用域
            用一对大括号包起来的代码 外面是不能访问的(ES5)
    什么是作用域?
            就是在浏览器解析代码之前,把变量的声明和函数的声明提升到该作用域的最上面
        如果是变量 那么把变量的声明提升到该变量作用域的最前面
        如果是函数  那么把函数的声明提升到该函数作用域的最前面
        如果函数和变量同名 优先提升函数
    什么是闭包?
        闭包就是能够读取其他函数内部 变量的函数
        由于在js语言中,只有函数内部的子函数才能读取局部变量。因此可以把闭包简单的理解成定义在一个函数内部的函数
        所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁

    闭包的优缺点及作用?
        闭包的作用:  缓存数据, 延长作用域
        闭包的优点和缺点: 缓存数据(有缓存 把数据存下来 可以继续用 但是如果你一直不释放这个数据 最终内存会爆掉)
    闭包有哪几种模式?
        第一种是函数模式
        第二种是对象模式


    什么是沙箱?
            沙箱:黑盒 小环境在这个环境中做任何事情与外界无关

    什么是递归?
            函数中调用自己此时就形成了递归 ,递归一定要用结束条件
            白话:一个人从楼顶往下一层一层的走  ,每一层有一个硬币,知直到他走到了一楼然后从一楼把硬币(好比数据)从下往上一层一层的去捡
    什么是浅拷贝
            直接让 两个对象指向同一个地址

    // 什么是深拷贝?
            拷贝还是复制, 把一个对象中所有的属性或方法, 一个个的找到,并且在另一个对象中开辟相应的空间,一个个的村到另一个对象中



    正则表达式相关概念:
            什么是正则表达式
            所谓的正则表达式:是用于匹配规律规则的表达式,正则表达式最初是科学家对人类神经系统的工作原理的早期研究,现在在编程语言中有广泛的应用。正则表通常被用来检索、替换那些符合某个模式(规则)的文本
            正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合、组成一个"规则字符串",这个挥着字符串用来表达对字符串的一种过滤逻辑

            正则表达式的作用
            1.给定的字符串是否符合正则表达式的过滤逻辑 就是匹配
            2.可以通过正则表达式,从字符串中获取我们想要的特定部分(提取)
            3.强大的字符串替换能力(替换)

            正则表达式的特点
            1.灵活性 逻辑性和功能性非常的强
            2.可以迅速地用极简单的方式达到字符串的复杂控制
            3.对于刚接触的人来说,比较晦涩难懂

            正则表达式的组成
            由元字符(特殊字符)和限定字符组成
    创建正则表达式的两种方法?
            1.字面量方式
                格式: var 变量 = /正则语法/
            2.正则表达式构造函数
                格式: var 变量 = new 函数名(/正则语法/)
    正则表达式基础语法:
             . 表示的是: 除了\n以外额任意一个字符 "adfa14321432"
             [] 表示的是:范围 [0-9]表示的是0-9之间的任意一个数字"789"
             [1-7]表示的是1-7之间的任意的一个数字
             [a-z] 表示的是a-z之间所有的小写字母的任意一个
             [A-Z] 表示的是 所有大写字母中的任意一个
             [a-zA-z]表示的是: 所有的字母的任意一个
             [0-9a-zA-Z]表示的是 所有数字或者字母中的一个
             | 代表或者
             [0-9]|[a-z] 表示的是要么是一个数字 要么是一个小写字母
             () 分组 提升优先级
             ([0-9])|(1-5)|(a-z)三组 从最左边开始计算

             限定符
             * 代表 0次或多次
             [a-z][0-9] 小写字母中的任意一个 后面要么是没有数字要么是多个数字
             + 表示的是至少一次
             [a-z][9]+ 小写字母一个后面最少一个9 或者多个9
             ? 表示的是: 前面的表达式出现了0次到一次 最少0次 最多1次
             [a-z][9]?

             限定符: 限定前面的表达式出现的次数
             {} 更加的明确前面的表达式出现的次数
             {0,} 表示的是前面的表达式出现了0到多次 和*一样
             {1,} 表示的是前面的表达式出现了1次到多次 和+一样
             {0,1} 表示的是前面的表达式出现了0次到一次 和 ?一样
             {5,10} 表示的是前面的表达式出现了5次到10次
             {4}前面的表达式出现了4次
             ^ 表示的是以什么开始,或者取反 ^[0-9]以数字开头
             ^[a-z]以小写字母开头
             [^0-9]去反 非数字
             [^a-z]取反,非小写字母
             [^0-9a-z]不以小写字母数字开头
             $ 表示的是以什么结束 [0-9][a-z]$ 必须以小写字母结束
             \d 数字中的任意一个
             \D 非数字中的一个
             \s 空白符中的一个
             \S 非空白符
             \w非特殊符
             \W 特殊符号
             \b 单词的边界



             .除了\n以外的任意一个单个字符
             []范围
             ()分组 提升优先级
             | 或者
             *  0-多
             + 1到多
             ? 0-1
             {0,} 和*
             {1,} 和+
             {0,1} 和?

             \d 数字中的一个
             \D 非数字
             \s 空白符
             \S 非空白符
             \w 非特殊字符
             \W 特殊字符
             ^ 以...开头
             $以...结尾
             \b 单词边界