文档章节

前端js面试题

西米粟
 西米粟
发布于 2017/08/13 11:49
字数 4171
阅读 75
收藏 5

** js中有哪些数据类型,并解释清楚原始数据类型和引用数据类型**

js中共有null,undefined, string,number,boolean,object六种数据类型。
原始数据类型: null,undefined, string,number,boolean
引用数据类型:object
通过typeof(x)可以返回一个变量x的数据类型“number”、“string”、“boolean”、“undefined”、"object",这里要注意一点:typeof运算符对于null类型返回的是object。

1)值存储方式不同:

原始数据类型:将变量名和值都存储在栈内存中
引用数据类型:将变量名存储在栈内存中,将值存储在堆内存中,并在栈内存中存储值的地址,该地址指向堆内存中的值。

2)赋值方式不同:

当给b赋予另一个a的值
若a值为原始数据类型,直接在栈内存中生成b值,两个变量以后进行值改变不会相互影响
若a值为引用数据类型,赋予b变量的是值地址,通过这个地址,两者指向的其实是堆内存中的同一个值,所以以后a,b任一变量对值进行改变,会直接影响另一个变量的值

类型识别的方法?

typeof a

可以判别标准类型,除了null之外
typeof 1 返回结果:"number" ,typeof {} 返回结果:"object"
不能判别具体的对象类型,除了function之外
typeof [1] 返回结果:"object" ,typeof function(){} 返回结果:"function"

a instanceof b

可以判别内置对象类型
[] instanceof Array 返回结果:true ,new String() instanceof String 返回结果:true
不能判别原始类型值
'a' instanceof String 返回结果:false
可以判别自定义对象类型
 function Point(x,y){
         this.x = x;
         this.y = y
     }

 var c = new Point(1,2)
 c instanceof Point
返回结果:true

a.constructor

可以判别标准数据类型(undefined和null除外)
'123'.constructor == String 返回结果:true
可以判别具体的内置对象类型
[1,2].constructor == Array 返回结果:true
可以判别自定义对象类型
 function Point(x,y){
     this.x = x;
     this.y = y
 }

var c = new Point(1,2)
c.constructor == Point
返回结果:true

Object.prototype.toString.call(a)

可以判别标准数据类型
Object.prototype.toString.call(1)返回结果:"[object Number]" 
Object.prototype.toString.call(undefined) 返回结果:"[object Undefined]"
可以判别内置对象类型 
Object.prototype.toString.call([a]) 返回结果:"[object Array]"
不能判别自定义对象类型
  function Point(x,y){
      this.x = x;
      this.y = y
  }
  var c = new Point(1,2)
  Object.prototype.toString.call(c)
返回结果:"[object Object]"

工作中可以写一个函数方便判定

 function type(obj){
          return Object.prototype.toString.call(obj).slice(8,-1)
      }
type('a') 返回结果: "S

type('a') 返回结果: "String" type([a]) 返回结果: "Array"

解释清楚 null 和 undefined

null表示一个标识被赋值了,且该标识赋值为“空值”,从逻辑角度来看,null值表示空对象指针;
undefined表示声明了标识,但没有给标识赋值。

null和undefined的区别?

null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。
undefined:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
null:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。

** 谈一谈JavaScript作用域链**

当执行一段JavaScript代码(全局代码或函数)时,JavaScript引擎会创建为其创建一个作用域又称为执行上下文(Execution Context),在页面加载后会首先创建一个全局的作用域,然后每执行一个函数,会建立一个对应的作用域,从而形成了一条作用域链。每个作用域都有一条对应的作用域链,链头是全局作用域,链尾是当前函数作用域。
作用域链的作用是用于解析标识符,当函数被创建时(不是执行),会将this、arguments、命名参数和该函数中的所有局部变量添加到该当前作用域中,当JavaScript需要查找变量X的时候(这个过程称为变量解析),它首先会从作用域链中的链尾也就是当前作用域进行查找是否有X属性,如果没有找到就顺着作用域链继续查找,直到查找到链头,也就是全局作用域链,仍未找到该变量的话,就认为这段代码的作用域链上不存在x变量,并抛出一个引用错误(ReferenceError)的异常。

如何理解JavaScript原型链

JavaScript中的每个对象都有一个prototype属性,我们称之为原型,而原型的值也是一个对象,因此它也有自己的原型,这样就串联起来了一条原型链,原型链的链头是object,它的prototype比较特殊,值为null。
原型链的作用是用于对象继承,函数A的原型属性(prototype property)是一个对象,当这个函数被用作构造函数来创建实例时,该函数的原型属性将被作为原型赋值给所有对象实例,比如我们新建一个数组,数组的方法便从数组的原型上继承而来。
当访问对象的一个属性时, 首先查找对象本身, 找到则返回; 若未找到, 则继续查找其原型对象的属性(如果还找不到实际上还会沿着原型链向上查找, 直至到根). 只要没有被覆盖的话, 对象原型的属性就能在所有的实例中找到,若整个原型链未找到则返回undefined;

JavaScript变量声明提前

《JavaScript权威指南》中是这样解释的:JavaScript变量在声明之前已经可用,JavaScript的这个特性被非正式的称为声明提前(hoisting),即JavaScript函数中声明的所有变量(但不涉及赋值)都被“提前”至函数的顶部。
从一个例子来看:

var scope = "global";
function myFunc(){
 console.log(scope); 
 var scope = "local";
}
控制台打印出来的不是“global”而是“undefined”,这是因为在myFunc这个函数的作用域中,局部变量scope声明被提前至函数顶部,而此时,scope仅声明,未赋值,因此输出undefined。实际上,上面的代码和下面的效果是一样的:

var scope = "global";
function myFunc(){
 var scope;
 console.log(scope);
 scope = "local";
}

new构建对象的本质

function User(){
this.name = "Vicfeel";
this.age = 23;
}
 
var user = new User();
通过new操作符,实际上在构造函数User中完成了如下操作:
•创建一个新的对象(空对象),并且this变量引用该对象,同时继承了该对象的原型,这个对象的类型是object;
•设置这个新的对象的内部、可访问性和prototype属性为构造函数(指prototype.construtor所指向的构造函数)中设置的(简单来说:属性和方法被加入到 this 引用的对象中);
•执行构造函数;
•(隐式)返回新创建的对象。
function User(){
 //this = {}; 
 //this.constructor = User;
 this.name = "Vicfeel";
 this.age = 23;
 //return this;
}

var user = new User();
如果构造函数默认返回的新创建的this对象,如果手动return 一个变量的话,如果该变量是原始类型则无效,如果是对象,则返回该对象。

JavaScript如何实现继承?

构造继承
原型继承
实例继承
拷贝继承
原型prototype机制或apply和call方法去实现较简单,建议使用构造函数与原型混合方式。
        function Parent(){
            this.name = 'wang';
        }

        function Child(){
            this.age = 28;
        }
        Child.prototype = new Parent();//继承了Parent,通过原型
        var demo = new Child();
        alert(demo.age);
        alert(demo.name);//得到被继承的属性

例举3种强2种隐式类型转换?

强制(parseInt,parseFloat,number)隐式(== – ===)

数组方法 push() pop() unshift() shift()

Push()尾部添加 pop()尾部删除
Unshift()头部添加 shift()头部删除

添加 插入 替换 删除 到某个接点的方法

obj.appendChidl()
obj.innersetBefore()
obj.replaceChild()
obj.removeChild()

**谈谈This对象的理解。 **

this是js的一个关键字,随着函数使用场合不同,this的值会发生变化。
但是有一个总原则,this总是指向函数的直接调用者(而非间接调用者)。
this一般情况下:是全局对象Global。 作为方法调用,那么this就是指这个对象
如果有new关键字,this指向new出来的那个对象;
在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window;

eval是做什么的?

它的功能是把对应的字符串解析成JS代码并运行;
应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。
由JSON字符串转换为JSON对象的时候可以用eval,var obj =eval('('+ str +')');

请解释一下 JavaScript 的同源策略

概念:同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准。它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。
这里的同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议。
指一段脚本只能读取来自同一来源的窗口和文档的属性。
为什么要有同源限制?
我们举例说明:比如一个黑客程序,他利用Iframe把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。

在严格模式('use strict')下进行 JavaScript 开发有什么好处?

消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
消除代码运行的一些不安全之处,保证代码运行的安全;
提高编译器效率,增加运行速度;
为未来新版本的Javascript做好铺垫。

ajax请求时,如何解释json数据

使用eval parse,鉴于安全性考虑 使用parse更靠谱;
JSON.stringify 来存储对象数据,JSON.stringify 可以将对象转换为字符串。JSON.parse 方法将字符串转换为 JSON 对象。

JSON 的了解?

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小。
格式:采用键值对,例如:{'age':'12', 'name':'back'}

常见的状态码

简单版

  [
       100  Continue   继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息
       200  OK         正常返回信息
       201  Created    请求成功并且服务器创建了新的资源
       202  Accepted   服务器已接受请求,但尚未处理
       301  Moved Permanently  请求的网页已永久移动到新位置。
       302 Found       临时性重定向。
       303 See Other   临时性重定向,且总是使用 GET 请求新的 URI。
       304  Not Modified 自从上次请求后,请求的网页未修改过。

       400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
       401 Unauthorized 请求未授权。
       403 Forbidden   禁止访问。
       404 Not Found   找不到如何与 URI 相匹配的资源。

       500 Internal Server Error  最常见的服务器端错误。
       503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。
   ]

** 完整版**

1**(信息类):表示接收到请求并且继续处理
  100——客户必须继续发出请求
  101——客户要求服务器根据请求转换HTTP协议版本

2**(响应成功):表示动作被成功接收、理解和接受
  200——表明该请求被成功地完成,所请求的资源发送回客户端
  201——提示知道新文件的URL
  202——接受和处理、但处理未完成
  203——返回信息不确定或不完整
  204——请求收到,但返回信息为空
  205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
  206——服务器已经完成了部分用户的GET请求

3**(重定向类):为了完成指定的动作,必须接受进一步处理
  300——请求的资源可在多处得到
  301——本网页被永久性转移到另一个URL
  302——请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
  303——建议客户访问其他URL或访问方式
  304——自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用
  305——请求的资源必须从服务器指定的地址得到
  306——前一版本HTTP中使用的代码,现行版本中不再使用
  307——申明请求的资源临时性删除

4**(客户端错误类):请求包含错误语法或不能正确执行
  400——客户端请求有语法错误,不能被服务器所理解
  401——请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
  HTTP 401.1 - 未授权:登录失败
    HTTP 401.2 - 未授权:服务器配置问题导致登录失败
    HTTP 401.3 - ACL 禁止访问资源
    HTTP 401.4 - 未授权:授权被筛选器拒绝
  HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
  402——保留有效ChargeTo头响应
  403——禁止访问,服务器收到请求,但是拒绝提供服务
  HTTP 403.1 禁止访问:禁止可执行访问
    HTTP 403.2 - 禁止访问:禁止读访问
    HTTP 403.3 - 禁止访问:禁止写访问
    HTTP 403.4 - 禁止访问:要求 SSL
    HTTP 403.5 - 禁止访问:要求 SSL 128
    HTTP 403.6 - 禁止访问:IP 地址被拒绝
    HTTP 403.7 - 禁止访问:要求客户证书
    HTTP 403.8 - 禁止访问:禁止站点访问
    HTTP 403.9 - 禁止访问:连接的用户过多
    HTTP 403.10 - 禁止访问:配置无效
    HTTP 403.11 - 禁止访问:密码更改
    HTTP 403.12 - 禁止访问:映射器拒绝访问
    HTTP 403.13 - 禁止访问:客户证书已被吊销
    HTTP 403.15 - 禁止访问:客户访问许可过多
    HTTP 403.16 - 禁止访问:客户证书不可信或者无效
  HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
  404——一个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的URL
  405——用户在Request-Line字段定义的方法不允许
  406——根据用户发送的Accept拖,请求资源不可访问
  407——类似401,用户必须首先在代理服务器上得到授权
  408——客户端没有在用户指定的饿时间内完成请求
  409——对当前资源状态,请求不能完成
  410——服务器上不再有此资源且无进一步的参考地址
  411——服务器拒绝用户定义的Content-Length属性请求
  412——一个或多个请求头字段在当前请求中错误
  413——请求的资源大于服务器允许的大小
  414——请求的资源URL长于服务器允许的长度
  415——请求资源不支持请求项目格式
  416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
  417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。

5**(服务端错误类):服务器不能正确执行一个正确的请求
  HTTP 500 - 服务器遇到错误,无法完成请求
    HTTP 500.100 - 内部服务器错误 - ASP 错误
    HTTP 500-11 服务器关闭
    HTTP 500-12 应用程序重新启动
    HTTP 500-13 - 服务器太忙
    HTTP 500-14 - 应用程序无效
    HTTP 500-15 - 不允许请求 global.asa
    Error 501 - 未实现
HTTP 502 - 网关错误
HTTP 503:由于超载或停机维护,服务器目前无法使用,一段时间后可能恢复正常



© 著作权归作者所有

上一篇: Ajax基本面试题
下一篇: 前端中的MVC
西米粟
粉丝 1
博文 34
码字总数 10760
作品 0
南京
程序员
私信 提问
四月前端知识集锦(每月不可错过的文章集锦)

目前自己组建的一个团队正在写一份面试图谱,将会在七月中旬开源。内容十分丰富,第一版会开源前端方面知识和程序员必备知识,后期会逐步写入后端方面知识。因为工程所涉及内容太多(目前已经...

夕阳
2018/05/02
0
0
前端面试&笔试&错题指南(三)

JavaScript排坑指南(三) JavaScript总是给人以惊喜,学习不止,进步不断,今天继续补充JS容易搞错的几道笔试/面试题,为了秋招继续努力,欢迎一起为秋招努力的小伙伴共勉 ------------------...

Vincent Ko
2018/08/12
0
0
太原面经分享:如何用js实现返回斐波那契数列的第n个值的函数

面试攒经验,let's go! 值此高考来临之际,闲不住的我又双叒叕出发去面试攒经验了,去了公司交待一番流程后,面试官甩给了我一张A4纸,上面写着一道js算法笔试题(一开始我并不知道这是在考...

闰土大叔
2018/06/07
0
0
阿里巴巴Web前端开发面试题赋答案

最近发现阿里巴巴的Web前端开发面试题,共分三部分:CSS部分,JavaScript部分,紧急处理部分,分享给大家做个参考~ 第一部分:用CSS实现布局 让我们一起来做一个页面 首先,我们需要一个布局...

Qianduaner
2013/09/06
935
0
网易音乐前端实习程序员面试的10个问题,你会几个?

近日,w3cschool app开发者头条上分享了网易音乐前端实习程序员面经,引来了不少程序员粉丝们的围观。 在分享网易音乐前端实习面试问题之前,w3cschool先跟小伙伴们分享前端学习干货: 0、h...

W3Cschool
2018/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部