2018前端面试总结js部分【中】

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 闭包就是函数嵌套函数,可以理解为定义在函数内部的函数,本质上闭包是函数内部和外部连接的桥梁,但如果父函数定义的变量没有被子函数引用就不叫闭包 闭包让函数的变量都保存在内存中,内存消耗变大。使用不当会造成内存泄漏。 用途:读取函数内部变量 让变量保存到内存中 设置私有变量和方法

定义函数的方法

1.
        语法:function 函数名(参数1[,参数2]……){
        	函数体;
        	[return];   //返回值
        }
        function fx() {
            
        }
        
        function () {
            
        }  //匿名函数

2.字面量 
        var fn=function(){
        
        }
        
3.通过函数对象方式

        var x=new function () {
                
        }
复制代码

函数的调用

  • 这里的this指向window
//1、函数名();
     function getSum() {
        console.log(this) //window
     }
     getSum()
     
//2、自调用(function(){})()
           
     (function() {
        console.log(this) //window
     })();
     
//3、变量名()     
     var getSum=function() {
        console.log(this) //window
     };
     getSum()
复制代码

创建实例的方法

//1.json方法
    
    let obj={
        name:"张山",
        age:"11",
        call:function(){
            alert(1)
        }
    };
    obj.call();
    
//2.构造函数方法

    function Obj(){
    		this.name = "张三",
    		this.sex = "男",
    		this.phone = 17603514842,
    		this.call = function(){
    			alert(1);
    		}
    	}
    	let obj = new Obj();
    	obj.call();    
    	
//3.object方法

    	var obj = new Object();
    	obj.name = "张三";
    	obj.sex = "男";
    	obj.call = function(){
    		alert(this.name);
    	};
    	obj.call();
复制代码

JavaScript的数据类型

  • string number boolean null underfind object typeof (7种)

什么是闭包,闭包有什么缺点 什么情况下用闭包

  • 闭包就是函数嵌套函数,可以理解为定义在函数内部的函数,本质上闭包是函数内部和外部连接的桥梁,但如果父函数定义的变量没有被子函数引用就不叫闭包
  • 闭包让函数的变量都保存在内存中,内存消耗变大。使用不当会造成内存泄漏。
  • 用途:读取函数内部变量 让变量保存到内存中 设置私有变量和方法

函数重载 以及解析顺序

        var m= 1, j = k = 0; 
        function add(n) { 
            return n = n+1; 
      } ;
        y = add(m); 
        function add(n) { 
            return n = n + 3; 
        } ;
    z = add(m); 
复制代码
  • 以上代码都会输出4,js中没有函数重载的概念,由于定义了连个相同的函数,所以后面的会覆盖前面的
    所以调用add结果都是一样的因此真正到执行代码的时候,也就是第一次调用add(),输出的当然是4,第二次执行add()同样输出4.

js函数调用时加括号和不加括号的区别.不加括号相当于把函数代码赋给等号左边,加括号是把函数返回值赋给等号左边

    var color='green';
    var text={
        color:'blue',
        getColor:function() {
          var color='red';
          alert(this.color)
        }
    };
    var getColor=text.getColor;
    getColor();
    text.getColor();
    //结果为 green blue
复制代码

关于this指针

  • 直接调用的话 this指向window对象(这里如果在函数内部声明一个name也指向的window对象)
    
   var name='张三';
   function sayname() {
     console.log(this.name)
   };
   sayname();
复制代码
  • 对象函数调用 this指向对象本身
    var name='Bob';
    function sayName(){
        console.log(this.name);
    };
    var object={'name':'vicky'};
    object.sayName=sayName;          //sayName没有写成sayName(),表示不是执行函数,而是将sayName的指针赋值给object.sayName
    object.sayName();               //由于对象函数调用方法,this指向对象本身,所以输出:'vicky'
    sayName();                     //由于全局环境调用sayName()等同于window.sayName();输出:'Bob'
复制代码
  • 构造函数调用 this指针指向新创建的对象
    function object(name){
        this.name=name;
        console.log(this);      //由于this指向新创建的对象本身,输出:Object { name: "vikcy" }
        console.log(this.name);  //输出:"vicky"
    }
    var myObject=new Object('vicky');  //由于this指向新创建的对象本身
复制代码

JavaScript原型 原型链

  • 每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时,
    如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,
    于是就这样一直找下去,也就是我们平时所说的原型链的概念。

JavaScript有几种类型的值?

  • 栈:原始数据类型(Undefined,Null,Boolean,Number、String)
  • 堆:引用数据类型(对象、数组和函数) 两种类型的区别是:存储位置不同; 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储; 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数
    据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取
    得地址后从堆中获得实体

任何对象转为布尔值,都为得到 true(切记!在JS中,只有 0,-0,NaN,"",null,undefined 这六个值转布尔值时,结果为 false)

    
   var x = new Boolean(false);
   if (x) {
     alert('hi');
   }
   var y = Boolean(0);
   if (y) {
     alert('hello'); 
   }
   
   //结果只会显示 hi

复制代码

变量提升

  • 在某作用域,声明变量语句会默认解析为在该作用域的最开始就声明了。
    var a=5;
    function foo() {
      a=2;
      console.log(a);
      var a;
    }
    foo();
    //结果会输出2
复制代码
  • 我们可以看到,var a;语句并没有刷新a的值,因为解析编译的时候,’var a;’被提前了.所以我们看的a是内部变量a而不是外面已赋值的5。
  var a=5;
  function foo() {
    console.log(a);
    var a=1;
  }
  foo();
  //结果输出underfind
复制代码
  • 由于变量提升的原因a已经声明,所以没有输出我们再外部声明的5,但是a=1;并没有被提前执行.所以变量提升这个概念,只适用于声明变量的
    语句,而变量赋值的语句并不能被提前
    foo();
    function foo(){
        console.log(1);
    }
    //TypeError: foo is not a function
复制代码
  • 这里的foo被提升了,所以这里并没有发生ReferenceError,但是这个时候foo并没有被赋值,所以发生了TypeError。这段代码经过提升后是这样的:
    var foo;
    foo();
    foo=function fooo() {
      console.log(1)
    }
复制代码
  • 我们习惯将‘var a=5’看做一条声明。其实这里两条语句的简写,‘var a’和‘a = 3’,并且其实这两条语句是两个不同类型的语句,是由两个不同
    的组件完成的。前一句是在编译阶段执行,后一句是在运行阶段执行。所以,不管’var a’写在哪里,都会在代码本身被执行之前处理。这一过程很像
    是代码的一个移动过程,所以被大家称为“变量提升”。

浏览器从输入url到加载完成 都发生了什么

1、浏览器地址栏输入url

2、浏览器会先查看浏览器缓存--系统缓存--路由缓存,如有存在缓存,就直接显示。如果没有,接着第三步

3、域名解析(DNS)获取相应的ip

4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手

5、握手成功,浏览器向服务器发送http请求,请求数据包

6、服务器请求数据,将数据返回到浏览器

7、浏览器接收响应,读取页面内容,解析html源码,生成DOM树

8、解析css样式、浏览器渲染,js交互

常见的浏览器内核

谷歌:-webkit- 火狐:-moz- ie:-ms- 欧鹏:-o- qq浏览器:双内核 -webkit- -ms-

节点操作

  • 创建节点
    createDocumentFragment() //创建一个DOM片段
    createElement() //创建一个具体的元素
    createTextNode() //创建一个文本节点

  • 添加、移除、替换、插入
    appendChild() //添加
    removeChild() //移除
    replaceChild() //替换
    insertBefore() //插入

  • 查找
    getElementsByTagName() //通过标签名称
    getElementsByName() //通过元素的Name属性的值
    getElementById() //通过元素Id,唯一性

作用域

  • 每个函数都有一个作用域,比如我们创建了一个函数,函数里面又包含了一个函数,那么现在就有三个作用域,这样就形参了一个作用域链
  • 特点: 先在自己的变量范围中查找,如果找不到,就会沿着作用域链网上找。


原文发布时间为:2018年06月24日

原文作者:陇锦

本文来源: 掘金  如需转载请联系原作者
相关文章
|
11天前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
25天前
|
JSON JavaScript 前端开发
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
本文介绍了JSONP的工作原理及其在解决跨域请求中的应用。首先解释了同源策略的概念,然后通过多个示例详细阐述了JSONP如何通过动态解释服务端返回的JavaScript脚本来实现跨域数据交互。文章还探讨了使用jQuery的`$.ajax`方法封装JSONP请求的方式,并提供了具体的代码示例。最后,通过一个更复杂的示例展示了如何处理JSON格式的响应数据。
30 2
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
|
13天前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
29 4
|
23天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
23天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
29 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
28天前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
40 1
|
29天前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
25 1
|
1月前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
64 1
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
20天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?