精华内容
参与话题
问答
  • 原生JS面试题

    千次阅读 2019-03-29 20:41:00
    面试中遇到的原生js题总结 1、js 去重1) indexOf Array.prototype.unique = function(){ var result = []; var len = this.length; for(var i = 0; i<len; i++){ if(result.indexOf(this[i])&...

    面试中遇到的原生js题总结

     

    1、js 去重
    1) indexOf

    Array.prototype.unique = function(){
        var result = [];
        var len = this.length;
        for(var i = 0; i<len; i++){
            if(result.indexOf(this[i])<0){
                result.push(this[i]);
            }
        }
        return result;
    }
    var arr = [1,2,3,2,1,3,2,1];
    arr.unique();//arr = [1,2,3]
    • 在IE6、7、8不支持indexOf方法,可以在Array原型链上扩展indexOf方法
    if(!Array.prototype.indexOf){    
       Array.prototype.indexOf = function(val){    
           var value = this;    
           for(var i =0; i < value.length; i++){    
              if(value[i] == val) return i;    
           }    
          return -1;    
       };    
    }  

    2)数组先排序

    Array.prototype.unique = function(){
        this.sort();
        var result = [this[0]];
        var len = this.length;
        for(var i = 0; i<len; i++){
            if(this[i] !== result[result.length-1]){
                result.push(this[i]);
            }
        }
        return result;
    }
    var arr = [1,2,3,2,1,3,2,1];
    arr.unique();//arr = [1,2,3]

    3)ES6新方法set和Array.from

    function unique(arr){
      return Array.from(new Set(arr));
    }
    • set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目,返回的是json对象
    • Array.from可以把类数组对象、可迭代对象转化为数组

    2、js 字符串转为驼峰法

    function tansform(str){
        var re = /-(\w)/g;
        return str.replace(re,function($0,$1){//replace 中正则表达式$0,$1,$n等代表正则表达式内小括号的匹配值,从$1开始,$0代表正则表达式的整体值
            return $1.toUpperCase();
        });
    }
    var str = 'border-left-color';
    tansform(str);//borderLeftColor

    3、查找字符串中最多的字符及个数

    function repeatCharNum(str){
        var arr = str.split('');
        str = arr.sort().join('');
        var re = /(\w)\1+/g;
        var index = 0;
        var value = '';
        str.replace(re,function($0,$1){
            if(index < $0.length){
                index = $0.length;
                value = $1 ;
            }
        });
        alert ('最多字符'+value+'出现的次数'+index);
    }

    4、编写一个函数,将输入的参数中的数字字符追加为一个数字字符串,参数输入不确定

    function getStrChange(){
      var len = arguments.length;//参数不确定时使用arguments关键字
      var re = /^\d+$/;
      var str = '';debugger;
      for(var i =0; i< len; i++){
        if(!(re.test(arguments[i]))){ 
          continue;
        }
        if(i == len-1){
          str = str+arguments[i];
        }else{
          str = str+arguments[i]+',';
        }  
      }
      return str;
    }
    alert(getStrChange('1','a','45','b','3',1));//('1,45,3,1')

    5、var和function的预解析问题,以及变量和function的先后顺序的问题

     // 以下代码执行输出结果是什么
        function b () {
            console.log(a);// function a(){}
            var a = 10;
            function a() {};
            a = 100;
            console.log(a);//100
        }
        b();
    
        function c () {
            console.log(a);//function a(){}
            function a() {};
            var a = 10;
            a = 100;
            console.log(a);//100
        }
        c();
    
        (function d (num) {
            console.log(num);//100
            var num = 10;
        }(100))
    
        (function e (num) {
            console.log(num);//function num () {};
            var num = 10;
            function num () {};
        }(100))
    
        (function f (num) {
            function num () {};
            console.log(num);//function num () {};
            var num =10
            console.log(num);//10
        }(100))
    
        //仍然是预解析(在与解析过程中还要考虑一下当前变量的作用于)
        function m () {
            console.log(a1); // underfined
            console.log(a2); // underfined
            console.log(b1); // underfined
            console.log(b2); // underfined
            if(false) {
                function b1 (){};
                var a1 = 10;
            }
            if(true) {
                function b2 (){};
                var a2 = 10;
            }
            console.log(a1); // underfined
            console.log(a2); // 10
            console.log(b1); // underfined
            console.log(b2); // function
        }
        m();
    
        function n() {
            if(2>1) {
                arr = 10;
                brr = 10;
                let arr;//要在严格模式'use strict'下运行
                var brr;
                console.log(arr);
                console.log(brr);
            }
        }
        n(); // ReferenceError
    • 函数声明:function a(){}可以提前解析;
    • 函数表达式:var b = function a(){} : 命名函数表达式
      var b = function (){} :匿名函数表达式
      (function a(){}) : 表达式
      位运算符:(为了区分函数表达式和函数声明)
      ~funtion a(){} : 表达式
      -funtion a(){} : 表达式
      +funtion a(){} : 表达式
      !funtion a(){} : 表达式
      (不可以被提前解析)
    • 函数表达式和函数声明的区别:函数声明可以提前被解析,函数表达式不可以,需要在引用前提前声明;函数表达式可以直接后面加括号执行,函数声明不可以。
    • let关键字要在严格模式'use strict'下运行

    6、判断数据类型

       function gettype(nm){
        return Object.prototype.toString.call(nm);
    } 
       console.log(gettype(3)); //[object number]
    • js基础数据类型:number string null undefined string boolean,存放在栈内存
    • js引用数据类型:Object (Array,Date,RegExp,Function),存放在堆内存

    7、如何将arguments转为array

    function changeArg(arguments){
        return Array.prototype.slice.apply(arguments);
    }

    8、如何判断array对象
    可以使用Array.isArray()或者Object.prototype.toString.call()判断

    9、原生dom实现删除dom结点

    function deleteNode(node){
        if(!node) return;
        if(node.parentNode){
            node.parentNode.removeChild(node);
        }
    }

    10、给button绑定click事件

    var x = document.getElementById("myBtn");
    if (x.addEventListener) {                    //所有主流浏览器,除了 IE 8 及更早 IE版本
        x.addEventListener("click", myFunction);
    } else if (x.attachEvent) {                  // IE 8 及更早 IE 版本
        x.attachEvent("onclick", myFunction);
    }
    • 还可以用onclick()绑定,但是onclick()混合了js和html,不建议使用。
    • addEventListener("click", function,useCapture),useCapture默认false,代表事件冒泡阶段执行,true代表事件捕获阶段执行。
    • addEventListener和onclick的区别:addEventListener可以添加多个事件,不会被覆盖;onclick只可以一个事件,重复添加,后面一个会覆盖前面一个的事件。

    11、排序算法
    1)冒泡排序

         相邻元素两两对比然后元素交换

    function bubbleSort(arr){

      for(var i = 0;i< arr.length-1;i++){
        for(j=i+1;j<arr.length;j++){
          if(arr[i]>arr[j]){
            var temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
          }
        }
      }
      return arr;
    }

    2)快速排序

    获取数组中间的索引 获取数组中间项

    function quickSort(arr){
      if(arr.length<=1){
        return arr;
      }
      var len = Math.floor(arr.length/2);
      var cur = arr.splice(len,1);
      var left = [];
      var right = [];
      for(var i=0;i<arr.length;i++){
        if(cur>arr[i]){
          left.push(arr[i]);
        }else{
          right.push(arr[i]);
        }
      }
      return quickSort(left).concat(cur,quickSort(right));
    }

    3)选择排序(Selection sort)

    是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
    for(var i=0;i<arr.length;i++){//按顺序假设每一个值都是最小值。
    var minindex=i;//假设的最小值的索引下标
    var minvalue=arr[minindex];//假设的最小值
    for(var j=i+1;j<arr.length;j++){
    if(minvalue>arr[j]){//数组项的值比假设的最小值还要小,当前这项就是最小值
    minvalue=arr[j];
    minindex=j;
    }
    }
    //如果获取到了最小值,和假设的最小值进行交换。
    if(minindex!=i){//防止假设的真的是最小值,无需自己和自己进行交换。
    var temp=arr[i];
    arr[i]=arr[minindex];
    arr[minindex]=temp;
    }

    }

     

    
    

    转载于:https://www.cnblogs.com/cqgxlove/p/10623797.html

    展开全文
  • 原生js面试题

    2019-09-22 05:18:12
    1、线程与进程的区别 一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了...

    1、线程与进程的区别

    一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。

    另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

    线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

    从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

    2、你如何对网站的文件和资源进行优化?

    期待的解决方案包括:文件合并文件最小化/文件压缩使用CDN托管缓存的使用(多个域名来提供缓存)其他。

    3、请描述一下cookies,sessionStorage和localStorage的区别?

    sessionStorage和localStorage是HTML5 Web Storage API提供的,可以方便的在web请求之间保存数据。有了本地数据,就可以避免数据在浏览器和服务器间不必要地来回传递。sessionStorage、localStorage、cookie都是在浏览器端存储的数据,其中sessionStorage的概念很特别,引入了一个“浏览器窗口”的概念。sessionStorage是在同源的同窗口(或tab)中,始终存在的数据。也就是说只要这个浏览器窗口没有关闭,即使刷新页面或进入同源另一页面,数据仍然存在。关闭窗口后,sessionStorage即被销毁。同时“独立”打开的不同窗口,即使是同一页面,sessionStorage对象也是不同的cookies会发送到服务器端。其余两个不会。Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie。

    • Firefox每个域名cookie限制为50个。

    • Opera每个域名cookie限制为30个。

    • Firefox和Safari允许cookie多达4097个字节,包括名(name)、值(value)和等号。

    • Opera允许cookie多达4096个字节,包括:名(name)、值(value)和等号。

    • InternetExplorer允许cookie多达4095个字节,包括:名(name)、值(value)和等号。

    4、描述下“reset”CSS文件的作用和使用它的好处。

    因为浏览器的品种很多,每个浏览器的默认样式也是不同的,所以定义一个css reset可以使各浏览器的默认样式统一。

     

    5、解释下JavaScript中this是如何工作的。

    this永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。匿名函数或不处于任何对象中的函数指向window 。

    • 1.如果是call,apply,with,指定的this是谁,就是谁。

    • 2.普通的函数调用,函数被谁调用,this就是谁。

    6、call和.apply的区别是什么?

    call方法: 
    语法:call(thisObj,Object) 
    定义:调用一个对象的一个方法,以另一个对象替换当前对象。 
    说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 
    apply方法: 
    语法:apply(thisObj,[argArray]) 
    定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
    说明:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

    对于apply和call两者在作用上是相同的,但两者在参数上有以下区别: 
    对于第一个参数意义都一样,但对第二个参数:apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入。

     

    转载于:https://www.cnblogs.com/yangshuzhong/p/11458059.html

    展开全文
  • 原生JS面试题2

    2020-04-22 11:17:18
    三、js跨域问题怎么解决? 1、 JSONP跨域请求 要理解跨域,先要了解一下”同源策略“。所谓同源是指,协议、域名、端口都相同。所谓”同源策略“,简单的说,就是基于安全考虑,当前域不能访问其他域的东西。 http ...

    三、js跨域问题怎么解决?
    1、 JSONP跨域请求
    要理解跨域,先要了解一下”同源策略“。所谓同源是指,协议、域名、端口都相同。所谓”同源策略“,简单的说,就是基于安全考虑,当前域不能访问其他域的东西。
    http 和 https :协议不同
    www.a.com 和 www.b.com :域名不同
    www.a.com : 8080 和 www.a.com : 1000 : 端口不同

    在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的。
    例如我们在自己的网站通过 ajax 去 获取豆瓣上的图书接口:
    https://api.douban.com/v2/book/search?q=javascript&count=1

    我们通过以上 ajax 去访问,发现运行时会报错:
    在这里插入图片描述
    只要出现这个错误,就说明服务器接口不支持跨域
    //No ‘Access-Control-Allow-Origin’ header is present on the requested resource
    这是因为不同源,所以无法访问其他服务器的数据

    但是 img的 src ( 获取图片 ) , link 的 href (获取css),script 的 src (获取js)这三个属性都不符合同源策略,它们可以跨域获取数据。JSONP就是利用script 的 src 来实现跨域获取数据。

    跨域原理
    JSONP实现跨域请求的原理,简单的说,就说动态创建
    script标签,然后利用script的 src 不受同源策略的约束来跨域获取数据。
    JSONP 由两部分组成:回调函数和数据。回调函数 是当响应到来时,应该在页面中调用的函数。回调函数的名字,一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。

    注意:JSONP不是真正的 ajax
    ajax是异步的,jsonp是同步的,所以它不是真正的ajax

    动态创建 script>标签,设置其 src ,回调函数在 src 中设置:

    var script = document.createElement("script");
    script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1";
    document.body.insertBefore( script, document.body.firstChild );
    

    在页面中,返回的 JSON 作为参数传入 回调函数中,我们通过回调函数来 操作数据

    function handleResponse(response){
        //对 response 数据进行操作代码
    }
    

    了解了 JSONP 的基本使用方法,我们在实现上面,通过 ajax 调用豆瓣接口的需求,实现代码如下:
    在这里插入图片描述
    注意:以上代码中,要记得成功访问完数据后,要删除创建的动态 script标签:document.body.removeChild(script)

    其实在接口数据的形式类似:fn( { name: “张三” , age: “20” } ) ,我们传递过去一个和这个函数名字相同的回调函数,参数就是访问到的数据。
    假如接口是:

    http://api.money.126.net/data/feed/0000001,1399001?callback=refreshPrice

    函数名就是 callbanck = 的值:refreshPrice.

    JSONP目前还是比较流行的跨域方式,虽然JSONP使用起来方便,但是也存在一些问题:如果其他域不安全,很可能会在响应中夹带一些恶意代码。而且要确定 JSONP请求是否失败并不容易。
    JSONP有个限制,只能用GET请求,并且要求返回JavaScript

    更多跨域的方法介绍:
    https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434499861493e7c35be5e0864769a2c06afb4754acc6000
    对ajax有更进一步的理解,利用cros进行跨域处理!!!

    2、CROS跨域

    3、反向代理

    四、闭包
    概念:闭包就是能够读取其他函数内部变量的函数
    由于函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”(然后将这个内部的函数 return 返回出来)。
    所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁

    闭包的作用:它最大的用处有两个: 1) 一个是可以读取函数内部的变量;
    2) 另一个就是让这些变量的值始终保存在内存中。

    使用闭包的注意点:1) 由于闭包会使得函数中的变量都保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

    内存泄漏:程序的运行需要内存。对于持续运行的服务进程,必须及时释放不再用到的内存,否则占用越来越高,轻则影响系统性能,重则导致进程崩溃。不再用到的内存,没有及时释放,就叫做内存泄漏。
    http://www.ruanyifeng.com/blog/2017/04/memory-leak.html

    2) 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。

    五、promise的用法和原理?
    概念:promise 是异步编程的一种解决方案。它可以把异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
    Promise 为异步操作提供了统一的接口,使得控制异步操作更加容易,它的强大之处在于它的链式调用。

    基本用法:

    new Promise(function(resolve, reject) {
    //待处理的异步逻辑
    //处理结束后,调用resolve或reject方法
    })
    

    新建一个promise很简单,只需要new 一个 Promise 对象即可。所以promise本质上就是一个函数,它接受一个函数作为参数,并且返回promise对象,这就给链式调用提供了基础。

    特点:
    1、对象的状态不受外界影响。 Promise 的实例 有以下三种状态: 1)pending : 进行中 2)resolved : 已成功完成 3)rejected : 已失败

    只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

    2、一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为resolved;从pending变为rejected。 只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。
    基本用法:
    ES6规定,Promise 对象是一个构造函数,用来生成Promise
    实例
    在这里插入图片描述

    Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由JavaScript 引擎提供, 不是自己部署。

    resolve函数的作用,将Promise对象的状态从“进行中”变成 “成功”( 即从pending变为resolved ) ,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。
    reject函数的作用,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

    Promise实例生成以后,可以用then方法分别制定 Resolved状态和Rejected状态的回调函数:
    在这里插入图片描述

    then方法可以接受 2 个回调函数作为参数,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

    promise捕获错误 .catch方法:

    Promise.prototype.catch方法是Promise.prototype.then(null,
    rejection)的别名,用于指定发生错误时的回调函数。

    在这里插入图片描述
    Promise对象的错误具有“ 冒泡 ”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。
    在这里插入图片描述
    题外话:async 函数是es7 提案出来的语法, async函数是用来取代回调函数的另一种方法。

    展开全文
  • 原生JS面试题1

    2020-04-20 22:07:31
    一、es6中的箭头函数和普通函数有什么区别? 1.普通函数中的 this总是指向调用它的那个对象, 箭头函数没有自己的this,他的this永远指向其定义环境,任何方法都改变不了其指向,如call()、bind()、apply()。...

    一、es6中的箭头函数和普通函数有什么区别?

    1.普通函数中的 this总是指向调用它的那个对象,
    箭头函数没有自己的this,他的this永远指向其定义环境,任何方法都改变不了其指向,如call()、bind()、apply()。(正是因为它没有this,所以也就不能用作构造函数,也没有原型对象)
    2. 箭头函数不能当作构造函数,也就是说,不能使用new命令,否则会报错。
    3. 箭头函数没有原型属性。
    4. 箭头函数不可以使用yield命令,因此箭头函数不能用作Generator函数。
    5. 箭头函数不能使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替。
    6. 变量提升:由于js的内存机制,function的级别最高,而用箭头函数定义函数的时候,需要var(let、const)关键字,而var所定义的变量不能得到变量提升。故箭头函数一定要定义于调用之前。

    拓展:this的指向问题?
    1、普通函数中,this指向其函数的直接调用者;
    2、箭头函数中,this指向其定义环境,任何方法都改变不了其指向,如call( )、bind()等;
    3、构造函数中,如果不使用new,则this指向window,
    如果使用new创建了一个实例,则this指向该实例。

    4、window 内置函数中,如setInterval,setTimeout等,其内部的this指向Window。
    5、匿名函数的this指向Window。
    6、apply()、call()、bind()可以改变this的指向

    二、谈谈你对原型链的认识?

    对象:1 、 函数对象: 由 function 创造出来的函数,比如 function a(){ } ; 系统内置的函数对象: Function , Object , Array , String , Number
    2、 普通对象: 除开函数对象之外的对象,都是普通对象
    每个普通对象的__proto__属性,都指向 Object().prototype ,
    var obj = { } 就等于 var obj = new Object ( ) ; 即普通对象是 构造函数( Object ) 的一个实例
    所以 obj. proto == Object.prototype ( 但是老高说的,Object的原型还是object对象, )
    obj. constructor == Object
    凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。
    注:所有对象都有 proto 属性 只有函数对象才有 prototype 属性 !!!!!!!!!!

    原型对象: prototype 属性也叫原型对象,主要是为了实现继承;

    指针 __proto__ : js中,万物皆对象!所有的对象 obj 都具有 proto 属性(null 和 undefined除外 ),而且指向创造obj 对象的函数对象(生成实例的构造函数)的prototype属性 。 如以下例子:

    在这里插入图片描述

    Person 构造函数的原型对象 是 Mother ()。相当于原型是妈妈,Person现在是儿子。
    在默认情况下,所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)

    结论: 原型对象(Person.prototype)是 构造函数(Person)的一个实例。

    以下是 深入解答原型是怎么回事 的一篇文章
    1、https://www.jianshu.com/p/dee9f8b14771
    2、https://www.jianshu.com/p/652991a67186
    3、https://www.jianshu.com/p/a4e1e7b6f4f8

    原型链的概念
    如果问原型链是什么,直接把下面的这张图画出来就行了。
    https://www.cnblogs.com/shuiyi/p/5305435.html

    回答出以下问题,就知道 __proto__和prototype 的什么了

    function Person(){ } ; var person1 = new Person( );

    1. person1.proto 是什么?
    2. Person.proto 是什么?
    3. Person.prototype.proto 是什么?
    4. Object.proto 是什么?
    5. Object.prototype__proto__ 是什么?

    答案:
    第一题
    因为 person1.proto === person1 的构造函数.prototype
    因为 person1的构造函数 === Person
    所以 person1.proto === Person.prototype
    第二题
    因为 Person.proto === Person的构造函数.prototype
    因为 Person的构造函数 === Function
    所以 Person.proto === Function.prototype
    第三题
    Person.prototype 是一个普通对象,我们无需关注它有哪些属性,只要记住它是一个普通对象。
    因为一个普通对象的构造函数 === Object
    所以 Person.prototype.proto === Object.prototype
    第四题,参照第二题,因为 Person 和 Object 一样都是构造函数
    不要把 Object 想的太复杂,它其实也不过是 Function 构造出来的一个 方法 (一个普通的构造函数)
    所以 Object.proto === Function.prototype
    第五题
    Object.prototype 对象也有proto属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。
    Object.prototype.proto === null
    记住:prototype是一个普通对象,所有普通对象的__protp__都指向 Object.prototype

    展开全文
  • 原生JS面试题3

    2020-04-22 11:21:28
    六、面向对象和面向过程各有什么的优点? 面向过程: 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源。 缺点:没有面向对象易维护、易服用、易扩展。 面向对象(OOP): ...
  • 原生JS面试题4

    2020-04-22 12:08:13
    九、你对前端页面的性能优化有什么好的解决方案 1、CSS放在页面最上部(head标签中),...js 文件则相反,浏览器在加载 js 后,立即执行,有可能会阻塞整个页面,造成页面显示缓慢,因此 js 最好放在页面最下面。但...
  • 原生JS面试题5

    2020-04-22 12:08:35
    十九、简述 ajax 的过程 1. 创建XMLHttpRequest对象,也就是创建一个异步调用对象 2. 创建一个新的HTTP请求,并...5. 获取异步调用返回的数据 6. 使用JavaScript和DOM实现局部刷新 ...分别代表什么? 200 - 请求成功 3...
  • --------------------------预编译阶段--------------------------------------------- //编写代码 ---预编译---》编译执行 //预编译阶段会做很多的事情: //1、没有赋值的变量,默认赋值为undefined;...
  • 三道原生js面试题(面向高级)

    千次阅读 2018-07-23 17:21:22
    独乐乐不如众乐乐,分享给大家,共同提升对原生js的理解~ 话不多说,亮~ 大家如果有更好的实现方法欢迎提出探讨~   1.编写curry.js 实现函数的分步调用 var curry = require('./curry.js');// &lt;- ...
  • //一、 for(var i=1;i&lt;=3;i++){  setTimeout(function(){  console.log(i);  },0);...// 虽然 setTimeout的时长是0,但是,也是启动了异步操作,而JavaScript本身是单线程的。...//所以,setTimeout的回调函数...
  • 全局变量和局部变量重名,并带有变量声明提升 一、定义全局变量和局部变量,变量名都是age。在函数内部不对局部变量age赋值 var age = 250;//定义一个全局变量age,赋值为250 function testf(){ ...
  • 一、 event对象中的target,currentTarget的区别  在使用event对象时,event对象有两个属性target和currentTarget,这两属性都代表事件源,由于事件冒泡和捕获(如果想知道事件冒泡和事件捕获请点击)的原因,会...
  • 生活中的例子:  我家里有三个孩子,其中两个是我自己亲生的孩子,另个一个是我朋友由于出差而把他的孩子放在我家。  我朋友的孩子就是宿主(寄生)孩子 ... 我的孩子就是我自己的孩子。...即对象不是JavaScript...

空空如也

1 2 3 4 5 ... 20
收藏数 390
精华内容 156
关键字:

原生js面试题