java面试题网

普通会员

257

帖子

9

回复

131

积分

楼主
发表于 2018-06-12 16:50:59 | 查看: 1601| 回复: 0

介绍js的基本数据类型。

  Undefined、Null、Boolean、Number、String、

  ECMAScript 2015 新增:Symbol(创建后独一无二且不可变的数据类型 )



介绍js有哪些内置对象?

 Object 是 JavaScript 中所有对象的父对象

 数据封装类对象:Object、Array、Boolean、Number 和 String

 其他对象:Function、Arguments、Math、Date、RegExp、Error



说几条写JavaScript的基本规范?

 1.不要在同一行声明多个变量。

 2.请使用 ===/!==来比较true/false或者数值

 3.使用对象字面量替代new Array这种形式

 4.不要使用全局函数。

 5.Switch语句必须带有default分支

 6.函数不应该有时候有返回值,有时候没有返回值。

 7.For循环必须使用大括号

 8.If语句必须使用大括号

 9.for-in循环中的变量 应该使用var关键字明确限定作用域,从而避免作用域污染。



JavaScript原型,原型链 ? 有什么特点?

 每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时,

 如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,

 于是就这样一直找下去,也就是我们平时所说的原型链的概念。

 关系:instance.constructor.prototype = instance.__proto__

 特点:

 JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。

  当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的话,

  就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象。

  function Func(){}

  Func.prototype.name = "Sean";

  Func.prototype.getInfo = function() {

   return this.name;

  }

  var person = new Func();//现在可以参考var person = Object.create(oldObject);

  console.log(person.getInfo());//它拥有了Func的属性和方法

  //"Sean"

  console.log(Func.prototype);

  // Func { name="Sean", getInfo=function()}



如何实现数组的随机排序?

  方法一:

  var arr = [1,2,3,4,5,6,7,8,9,10];

  function randSort1(arr){

  for(var i = 0,len = arr.length;i < len; i++ ){

  var rand = parseInt(Math.random()*len);

  var temp = arr[rand];

  arr[rand] = arr[i];

  arr[i] = temp;

  }

  return arr;

  }

  console.log(randSort1(arr));

  方法二:

  var arr = [1,2,3,4,5,6,7,8,9,10];

  function randSort2(arr){

  var mixedArray = [];

  while(arr.length > 0){

  var randomIndex = parseInt(Math.random()*arr.length);

  mixedArray.push(arr[randomIndex]);

  arr.splice(randomIndex, 1);

  }

  return mixedArray;

  }

  console.log(randSort2(arr));

  方法三:

  var arr = [1,2,3,4,5,6,7,8,9,10];

  arr.sort(function(){

  return Math.random() - 0.5;

  })

  console.log(arr);




Javascript作用链域?

 全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。

 当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找,

 直至全局函数,这种组织形式就是作用域链。



谈谈This对象的理解。

this总是指向函数的直接调用者(而非间接调用者);

如果有new关键字,this指向new出来的那个对象;

在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window;



eval是做什么的?

 它的功能是把对应的字符串解析成JS代码并运行;

 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。

 由JSON字符串转换为JSON对象的时候可以用eval,var obj =eval('('+ str +')');



什么是window对象? 什么是document对象?

 window对象是指浏览器打开的窗口。

 document对象是Documentd对象(HTML 文档对象)的一个只读引用,window对象的一个属性。



null,undefined 的区别?

 null 表示一个对象是“没有值”的值,也就是值为“空”;

 undefined 表示一个变量声明了没有初始化(赋值);

 undefined不是一个有效的JSON,而null是;

 undefined的类型(typeof)是undefined;

 null的类型(typeof)是object;

 Javascript将未赋值的变量默认值设为undefined;

 Javascript从来不会将变量设为null。它是用来让程序员表明某个用var声明的变量时没有值的。

 typeof undefined

  //"undefined"

  undefined :是一个表示"无"的原始值或者说表示"缺少值",就是此处应该有一个值,但是还没有定义。当尝试读取时会返回 undefined;

  例如变量被声明了,但没有赋值时,就等于undefined

 typeof null

  //"object"

  null : 是一个对象(空对象, 没有任何属性和方法);

  例如作为函数的参数,表示该函数的参数不是对象;

 注意:

  在验证null时,一定要使用 === ,因为 == 无法分别 null 和 undefined

  null == undefined // true

  null === undefined // false




写一个通用的事件侦听器函数。

  // event(事件)工具集,来源:github.com/markyun

  markyun.Event = {

  // 页面加载完成后

  readyEvent : function(fn) {

  if (fn==null) {

  fn=document;

  }

  var oldonload = window.onload;

  if (typeof window.onload != 'function') {

  window.onload = fn;

  } else {

  window.onload = function() {

  oldonload();

  fn();

  };

  }

  },

  // 视能力分别使用dom0||dom2||IE方式 来绑定事件

  // 参数: 操作的元素,事件名称 ,事件处理程序

  addEvent : function(element, type, handler) {

  if (element.addEventListener) {

  //事件类型、需要执行的函数、是否捕捉

  element.addEventListener(type, handler, false);

  } else if (element.attachEvent) {

  element.attachEvent('on' + type, function() {

  handler.call(element);

  });

  } else {

  element['on' + type] = handler;

  }

  },

  // 移除事件

  removeEvent : function(element, type, handler) {

  if (element.removeEventListener) {

  element.removeEventListener(type, handler, false);

  } else if (element.datachEvent) {

  element.detachEvent('on' + type, handler);

  } else {

  element['on' + type] = null;

  }

  },

  // 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)

  stopPropagation : function(ev) {

  if (ev.stopPropagation) {

  ev.stopPropagation();

  } else {

  ev.cancelBubble = true;

  }

  },

  // 取消事件的默认行为

  preventDefault : function(event) {

  if (event.preventDefault) {

  event.preventDefault();

  } else {

  event.returnValue = false;

  }

  },

  // 获取事件目标

  getTarget : function(event) {

  return event.target || event.srcElement;

  },

  // 获取event对象的引用,取到事件的所有信息,确保随时能使用event;

  getEvent : function(e) {

  var ev = e || window.event;

  if (!ev) {

  var c = this.getEvent.caller;

  while (c) {

  ev = c.arguments[0];

  if (ev && Event == ev.constructor) {

  break;

  }

  c = c.caller;

  }

  }

  return ev;

  }

  };




Ajax 是什么? 如何创建一个Ajax?

 ajax的全称:Asynchronous Javascript And XML。

 异步传输+js+xml。

 所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验。


 (1)创建XMLHttpRequest对象,也就是创建一个异步调用对象

 (2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息

 (3)设置响应HTTP请求状态变化的函数

 (4)发送HTTP请求

 (5)获取异步调用返回的数据

 (6)使用JavaScript和DOM实现局部刷新



Ajax 解决浏览器缓存问题?

  1、在ajax发送请求前加上 anyAjaxObj.setRequestHeader("If-Modified-Since","0")。

  2、在ajax发送请求前加上 anyAjaxObj.setRequestHeader("Cache-Control","no-cache")。

  3、在URL后面加上一个随机数: "fresh=" + Math.random();。

  4、在URL后面加上时间戳:"nowtime=" + new Date().getTime();。

  5、如果是使用jQuery,直接这样就可以了 $.ajaxSetup({cache:false})。这样页面的所有ajax都会执行这条语句就是不需要保存缓存记录。



同步和异步的区别?

同步的概念应该是来自于OS中关于同步的概念:不同进程为协同完成某项工作而在先后次序上调整(通过阻塞,唤醒等方式).同步强调的是顺序性.谁先谁后.异步则不存在这种顺序性.

同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作。

异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容。



如何解决跨域问题?

 jsonp、 iframe、window.name、window.postMessage、服务器上设置代理页面

页面编码和被请求的资源编码如果不一致如何处理?



documen.write和 innerHTML的区别

  document.write只能重绘整个页面

  innerHTML可以重绘页面的一部分



DOM操作——怎样添加、移除、移动、复制、创建和查找节点?

  (1)创建新节点

    createDocumentFragment()    //创建一个DOM片段

    createElement()   //创建一个具体的元素

    createTextNode()   //创建一个文本节点

  (2)添加、移除、替换、插入

    appendChild()

    removeChild()

    replaceChild()

    insertBefore() //在已有的子节点前插入一个新的子节点

  (3)查找

    getElementsByTagName()    //通过标签名称

    getElementsByName()    //通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)

    getElementById()    //通过元素Id,唯一性




.call() 和 .apply() 的区别?

   例子中用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);


   注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。


  function add(a,b)

  {

     alert(a+b);

  }


  function sub(a,b)

  {

     alert(a-b);

  }


  add.call(sub,3,1);



Jquery与jQuery UI 有啥区别?

 *jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。

 *jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。

  提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等



jquery 中如何将数组转化为json字符串,然后再转化回来?

jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:

$.fn.stringifyArray = function(array) {

   return JSON.stringify(array)

}


$.fn.parseArray = function(array) {

   return JSON.parse(array)

}


然后调用:

$("").stringifyArray(array)




那些操作会造成内存泄漏?

 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。

 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。

 setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。

 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)




JQuery一个对象可以同时绑定多个事件,这是如何实现的?

 * 多个事件同一个函数:

  $("div").on("click mouseover", function(){});

 * 多个事件不同函数

  $("div").on({

  click: function(){},

  mouseover: function(){}

  });




Webpack热更新实现原理?

  1. Webpack编译期,为需要热更新的 entry 注入热更新代码(EventSource通信)

  2. 页面首次打开后,服务端与客户端通过 EventSource 建立通信渠道,把下一次的 hash 返回前端

  3. 客户端获取到hash,这个hash将作为下一次请求服务端 hot-update.js 和 hot-update.json的hash

  4. 修改页面代码后,Webpack 监听到文件修改后,开始编译,编译完成后,发送 build 消息给客户端

  5. 客户端获取到hash,成功后客户端构造hot-update.js script链接,然后插入主文档

  6. hot-update.js 插入成功后,执行hotAPI 的 createRecord 和 reload方法,获取到 Vue 组件的 render方法,重新 render 组件, 继而实现 UI 无刷新更新。




Object.is() 与原来的比较操作符“ ===”、“ ==”的区别?

  两等号判等,会在比较时进行类型转换;

  三等号判等(判断严格),比较时不进行隐式类型转换,(类型不同则会返回false);

  Object.is 在三等号判等的基础上特别处理了 NaN 、-0 和 +0 ,保证 -0 和 +0 不再相同,

  但 Object.is(NaN, NaN) 会返回 true.

  Object.is 应被认为有其特殊的用途,而不能用它认为它比其它的相等对比更宽松或严格。



您需要登录后才可以回帖 登录 | 立即注册

java面试题网无聊看看网与java建站系统提供技术支持V2.1 网站地图 © 2016-2018