发新帖

你不知道的js面试题

盐汽水真好喝 8月前 31

1.编写一个方法,去掉数组的重复元素

var arr = ["a", "c", "c", "a", "a", "a", "a", "a", "a", "a"];
var arr2 = [];
for (var i = 0; i < arr.length; i++) {
  if (arr2.indexOf(arr[i]) < 0) {
    arr2.push(arr[i]);
  }
}
console.log(arr2);

 

2.判断一个字符串中出现次数最多的字符,统计这个次数

var str = "fdsffdsgtfdhgdfgdffd";
var obj = {};
var arr = [];
for (var i = 0; i < str.length; i++) {
  var num = str[i];
  if (!obj[num]) {
    obj[num] = 1;
  } else {
    obj[num]++;
  }
}
var a = 0;
var b = 0;
for (key in obj) {
  if (b < obj[key]) {
    b = obj[key];
    a = key;
  }
}
console.log("字母:" + a + "次数" + b);

 

3.Javascript多人开发函数重名问题

(1) 可以开发前规定命名规范,根据不同开发人员开发的功能在函数前加前缀
(2) 将每个开发人员的函数封装到类中,调用的时候就调用类的函数,即使函数重名只要类名不重复就ok

 

4.编写一个方法,去掉数组的重复元素

var arr = ["a", "c", "c", "a", "a", "a", "a", "a", "a", "a"];
var arr2 = [];
for (var i = 0; i < arr.length; i++) {
  if (arr2.indexOf(arr[i]) < 0) {
    arr2.push(arr[i]);
  }
}
console.log(arr2);

 

5.怎样添加、移除、移动、复制、创建和查找节点?

1)创建新节点

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

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

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

3)查找

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

 

6.javascript的typeof返回哪些数据类型

bject number function boolean underfind;

 

7.例举3种强制类型转换和2种隐式类型转换?

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


8.编写一个b继承a的方法

function A(name) {
  this.name = name;
  this.sayHello = function() {
    alert(this.name + "say Hello!");
  };
}

function B(name, id) {
  this.temp = A;
  this.temp(name); //相当于new A();
  delete this.temp;
  this.id = id;
  this.checkId = function(ID) {
    alert(this.id == ID);
  };
}

 

9.如何阻止事件冒泡和默认事件

function stopBubble(e) {
  if (e && e.stopPropagation) e.stopPropagation();
  else window.event.cancelBubble = true;
}
return false;


10.谈谈This对象的理解。

this是js的一个关键字,随着函数使用场合不同,this的值会发生变化。
但是有一个总原则,那就是this指的是调用函数的那个对象。
this一般情况下:是全局对象Global。 作为方法调用,那么this就是指这个对象

 

11.javaScript中如何检测一个变量是一个String类型,请写出函数实现

var a="dsds";
console.log(typeof a);

 

12.Ajax是什么?Ajax的交互模型?同步和异步的区别

 Ajax包含技术JavaScript - ECMA、BOM、DOM、 Xml、XMLHttpRequest。

 Ajax交互模型:

  1.创建XMLHttpRequest对象

  2.客户端与服务器端建立连接

  3.客户端向服务器端发送数据

  4.客户端接收服务器端发送的数据

  同步交互

    之前所有的客户端与服务器端的交互

    客户端向服务器端发送请求,直到服务器端响应结果,这个过程中,用户不能做任何其他事情

  异步交互

    目前实现的客户端与服务器端的交互

客户端向服务器端发送请求,直到服务器端响应结果,这个过程中,用户可以做任何其他事情

 

13.jQuery中的ready()与 window.onload事件的区别?

ready具有简写写法的

一个HTML页面允许编写多个ready

(速度快)只需等待DOM数结构加载完毕

window.onload

没有任何简写形式

一个HTML页面只许编写一个onload

(速度慢)必须等待HTML所有内容加载完毕

 

14.谈一谈你对闭包的理解

闭包:保护一个可重用的局部变量的词法结构

    为什么: 全局变量: 可重用,但易被污染

            局部变量: 不可重用,

    何时使用: 即可重用,又不会被污染

    如何创建闭包:

     1. 外层函数封装受保护的变量以及专门操作变量的内层函数

     2. 外层函数将操作变量的内层函数返回到外部

     3. 调用外层函数,获得内层函数的对象。

闭包实际操作时

    1. 找受保护的变量

    2. 同一次外层函数调用返回的内层函数,始终使用同一个受保护的局部变量

3. 每调用一次外层函数,就会多创建一个受保护的变量的副本。

 

15.javascript中的设计模式有哪些?请尝试说几种,并谈谈你对他的理解。(对js的理解考察的比较深)

第一种模式:js工厂模式

var lev = function() {
  return "啊打";
};

function Parent() {
  var Child = new Object();
  Child.name = "李小龙";
  Child.age = "30";
  Child.lev = lev;
  return Child;
}

var x = Parent();
alert(x.name);
alert(x.lev());

说明:

1.在函数中定义对象,并定义对象的各种属性,,虽然属性可以为方法,但是建议将属性为方法的属性定义到函数之外,这样可以避免重复创建该方法

 

2.引用该对象的时候,这里使用的是 var x = Parent()而不是 var x = new Parent();因为后者会可能出现很多问题(前者也成为工厂经典方式,后者称之为混合工厂方式),不推荐使用new的方式使用该对象

3.在函数的最后返回该对象

4.不推荐使用这种方式创建对象,但应该了解

第二种模式:js构造函数模式

var lev = function() {
  return "啊打";
};

function Parent() {
  this.name = "李小龙";
  this.age = "30";
  this.lev = lev;
}

var x = new Parent();
alert(x.name);
alert(x.lev());

说明:

1.与工厂方式相比,使用构造函数方式创建对象,无需再函数内部重建创建对象,而使用this指代,并而函数无需明确return

2.同工厂模式一样,虽然属性的值可以为方法,扔建议将该方法定义在函数之外

3..同样的,不推荐使用这种方式创建对象,但仍需要了解

第三种模式:js原型模式

var lev = function() {
  return "啊打";
};

function Parent() {}
Parent.prototype.name = "李小龙";
Parent.prototype.age = "30";
Parent.prototype.lev = lev;

var x = new Parent();
alert(x.name);
alert(x.lev());

说明:

1.函数中不对属性进行定义

2.利用prototype属性对属性进行定义

3.同样的,不推荐使用这样方式创建对象

第四种模式:构造函数+原型的js混合的模式(推荐)

function Parent() {
  this.name = "李小龙";
  this.age = 32;
}

Parent.prototype.lev = function() {
  return this.name;
};

var x = new Parent();
alert(x.lev());

说明:

1.该模式是指混合搭配使用构造函数方式和原型方式

2.将所有属性不是方法的属性定义在函数中(构造函数方式)

将所有属性值为方法的属性利用prototype在函数之外定义(原型方式)

 

3.推荐使用这样方式创建对象,这样做有好处和为什么不单独使用构造函数方式和原型方式,由于篇幅问题这里不予讨论

第五种模式:构造函数+原型的动态原型模式(推荐)

function Parent() {
  this.name = "李小龙";
  this.age = 32;
  if (typeof Parent._lev == "undefined") {
    Parent.prototype.lev = function() {
      return this.name;
    };
    Parent._lev = true;
  }
}

var x = new Parent();
alert(x.lev());

说明:

1.动态原型方式可以理解为混合构造函数,原型方式的一个特例

2.该模式中,属性为方法的属性直接在函数中进行了定义,但是因为

if (typeof Parent._lev == "undefined") {
  Parent._lev = true;
}

从而保证创建该对象的实例时,属性的方法不会被重复创建

 

16.js面向对象中有几大特点?

面向对象三大特点: 封装,继承,多态

   封装:将一个事物的属性和方法集中定义在一个对象中

     为什么: 单独的数据没有意义,不许附着在一个具体对象

             代码重用,便于维护;

   继承:父对象的属性和方法,子对象可直接使用

     为什么: 节约内存空间;代码重用

   多态:同一个事物,在不同情况下表现出不同状态。

     为什么: 体现子对象与父对象的差异!

     重载: 同一个函数,根据传入参数的不同,执行不同的逻辑

     重写: 子对象觉得父对象的成员不好用,可自己定义同名成员,覆盖父对象的成员。

 

17.document.write和innerHTML的区别

document.wite只能重绘整个页面

innerHTML可以重绘页面的一部分

 

18.call和apply的区别是什么?

  替换this的对象

  何时使用: 如果当前this的对象不是想要的,就要替换

  相同点: 不向函数中传递参数时,完全相同

  不同点: call,要求函数的参数值必须单独传入

         apply,要求函数的参数值可用数组传入

 

19.AngularJs的四大特性

1.采用MVC模式

2.双向数据绑定

3.依赖注入

4.模块化设计

 

20.谈一谈你对冒泡的理解。

优化: 如果多个子元素,绑定了相同的事件

      应该仅在父元素定义绑定一次事件处理函数即可

为什么: 网页中,绑定的事件处理函数的个数越少,页面运行效率就越高!

如何利用冒泡:

   1. 获取目标对象:

      DOM: e.target

      IE8: e.srcElement

     兼容模式: var target=e.target||e.srcElement

   2. 根据目标对象的不同,执行不同操作

最新回复 (0)
返回