
JavaScript面试题
JS相关问题数组去重function uniq(array){var temp = []; //一个新的临时数组for(var i = 0; i < array.length; i++){if(temp.indexOf(array[i]) == -1){temp.push(array[i]);}}return temp;}var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5];console.log(aa)console.log(uniq(aa))1、谈一谈JavaScript作用域链当执行一段JavaScript代码(全局代码或函数)时,JavaScript引擎会创建一个作用域又称为执行上下文(Execution Context),在页面加载后会首先创建一个全局的作用域,然后每执行一个函数,会建立一个对应的作用域,从而形成一条作用域链。每个作用域都有一条对应的作用域链,链头是全局作用域,链尾是当前函数作用域。作用域链的作用是用于解析标识符,当函数被创建时(不是执行),会将this,arguments,命名参数和该函数中所有局部变量添加到该当前作用域中,当JavaScript需要查找变量X的时候(这个过程称为变量解析),它首先会从作用域链中的链尾也就是当前作用域进行查找是否有X属性,如果没有找到就顺着作用域链继续查找,直到查找到链头,也就是全局作用域链,仍未找到该变量的话,就认为这段代码的作用域上不存在x变量,并抛出引用错误(ReferenceError)的异常。2、如何理解JavaScript原型链JavaScript中每个对象都有一个prototype属性,我们称之为原型,而原型的值也是一个对象,因此它也有自己的原型,这样就串联起来了一条原型链,原型链的链头是object,它的prototype.__proto__,值为null。原型链的作用是用于对象继承,函数A的原型属性(prototype property)是一个对象,当这个函数被用作函数来创建实例时,该函数的原型属性被作为原型赋值给所有对象实例,比如我们新建一个数组,数组的方法便从数组的原型上继承而来。当访问对象的一个属性时,首先查找对象本身,找到则返回;未找到则继续查找原型对象的属性(如果还找不到实际上还会沿着原型链向上查找,直至到根)。只要没有被覆盖的话,对象原型的属性就能在所有的实例中找到,若整个原型链未找到则返回undefined。2(1)、JavaScript原型,原形链?有什么特点?原型对象也是普通的对象,是对象一个自带隐式__proto__属性,原型也有可能有自己的原型,如果一个原型对象的原型为null的话,我们就称为原型链。原形链是由一些用来继承和共享属性的对象组成的(有限的)对象链。如何查找构造函数和原型中的属性?构造函数.prototype 查看构造函数的原型属性实例对象 .__proto__查看实例对象的构造函数的原型实例对象.__proto__.constructor查看实例对象的构造函数3、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(1)JavaScript如何实现继承?1.借用构造函数。也叫伪造对象或经典继承。思路:在子类构造函数的内部调用超类型构造函数。可以通过使用apply()和call()方法在新创建的对象上执行构造函数。缺点:方法都在构造函数中定义,函数的复用就无从谈起。在超类型的原型中定义的方法,对子类而言也是不可见的,结果所有的类型都只能使用构造函数模式。function SuperType() {this.colors = ["red","blue","green"];}function SubType() {SuperType.call(this);//继承了SuperType}var instance1 = new SubType();instance1.colors.push("black");console.log(instance1.colors);//"red","blue","green","black"var instance2 = new SubType();console.log(instance2.colors);//"red","blue","green"2.原型链继承思路:借助原型可以基于已有的对象创建对象,同时还不必因此创建自定义类型在object()函数内部,先创建一个临时的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回了这个临时类型的一个新实例==原型链继承的思想可用以下函数来说明function object(o) {function F(){}F.prototype = o;return new F();}例子var person = {name:"EvanChen",friends:["Shelby","Court","Van"];};var anotherPerson = object(person);anotherPerson.name = "Greg";anotherPerson.friends.push("Rob");var yetAnotherPerson = object(person);yetAnotherPerson.name = "Linda";yetAnotherPerson.friends.push("Barbie");console.log(person.friends);//"Shelby","Court","Van","Rob","Barbie"3.组合继承指的是将原型链和借用构造函数的技术组合在一起,从而发挥二者之长。思路:使用原型链实现对原型属性和方法的继承,通过借用构造函数来实现实例属性的继承优点:即通过在原型上定义发法实现了函数复用,又能保证每一个实例都有它自己的数组。组合继承避免了原型链和借用构造函数的缺陷。融合了他们的优点。成为JavaScript中常用的继承模式例子function SuperType(name) {this.name = name;this.colors = ["red","blue","green"];}SuperType.prototype.sayName = function() {console.log(this.name);}function SubType(name, age) {SuperType.call(this,name);//继承属性this.age = age;}//继承方法SubType.prototype = new SuperType();Subtype.prototype.constructor = Subtype;Subtype.prototype.sayAge = function() {console.log(this.age);}var instance1 = new SubType("EvanChen",18);instance1.colors.push("black");consol.log(instance1.colors);//"red","blue","green","black"instance1.sayName();//"EvanChen"instance1.sayAge();//18var instance2 = new SubType("EvanChen666",20);console.log(instance2.colors);//"red","blue","green"instance2.sayName();//"EvanChen666"instance2.sayAge();//204.寄生式继承思路:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真的是它做了所有的工作一样返回对象例子function createAnother(original) {var clone = object(original); //通过调用函数创建一个新对象clone.sayHi = function () { //以某种方式来增强这个对象alert("hi");};return clone; //返回这个对象}var person = {name:"EvanChen",friends:["Shelby","Court","Van"];};var anotherPerson = createAnother(person);anotherPerson.sayHi();///"hi"5.寄生组合式继承。思路:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法本质上,就是寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型基本模型如下所示function inheritProperty(subType, superType) {var prototype = object(superType.prototype);//创建对象prototype.constructor = subType;//增强对象subType.prototype = prototype;//指定对象}例子function SuperType(name){this.name = name;this.colors = ["red","blue","green"];}SuperType.prototype.sayName = function (){alert(this.name);};function SubType(name,age){SuperType.call(this,name);this.age = age;}inheritProperty(SubType,SuperType);SubType.prototype.sayAge = function() {alert(this.age);}原型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);//得到被继承的属性4、JavaScript的基本数据类型Object number function boolean undefined4(1)、js有哪些内置对象数据封装类对象:Object、Array、Boolean、Number、String其他对象:FU