1,介绍 js 的基本数据类型。

Undefined、Null、Boolean、Number、String

2,介绍 js 有哪些内置对象?

Object 是 JavaScript 中所有对象的父对象 数据封装类对象:Object、Array、Boolean、Number 和 String 其他对象:Function、Arguments、Math、Date、RegExp、Error

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

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

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

特点: JavaScript 对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于 自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。 当我们需要一个属性的时,Javascript 引擎会先看当前对象中是否有这个属性, 如果 没有的话,就会查找他的 Prototype 对象是否有这个属性,如此递推下去,一直检索 到 Object 内建对象。

4,JavaScript 有几种类型的值?

栈:原始数据类型(Undefined,Null,Boolean,Number、String)

堆:引用数据类型(对象、数组和函数)

两种类型的区别是:存储位置不同

1,原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属 于被频繁使用数据,所以放入栈中存储;

2,引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈 中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该 实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后 从堆中获得实体

5,JavaScript 继承的几种实现方式?

1,构造函数继承,使用 call 和 apply 两个方法的特性可以实现,改变方法中的 this

2,原型链继承

3,组合式继承

组合继承,指的是将原型链和借用构造函数的技术组合到一起。思路是使用原型链实 现对原型方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过 在原型上定义方法实现了函数的复用,又能够保证每个实例都有它自己的属性。以下 例子充分说明了这一点

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;
}//继承方法 使用原型链实现
SubType.prototype=new SuperType();
SubType.prototype.constructor=SubType;
subType.prototype.sayAge=function(){
alert(this.age);
};var instance1=new SubType("mary", 22);
instance1.colors.push("black");
alert(instance1.colors); //red,blue,green,black
instance1.sayName(); //mary
instance1.sayAge(); //22
var instance2=new SubType("greg", 25);
alert(instance2.colors); //red,blue,green
instance2.sayName(); //greg
45
instance2.sayAge(); //25
复制代码

这个例子中,两个实例既分别拥有自己的属性,包括 colors 属性,又可以使用相同的 方法。

组合继承避免了原型链和借用构造函数的缺点,融合了他们的优点,是 JavaScript 中最常用的继承模式。

6,javascript 创建对象的几种方式?

javascript 创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以 用 JSON;但写法有很多种,也能混合使用。

1、对象字面量的方式

person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
复制代码

2、用 function 来模拟无参的构造函数

function Person(){}
var person=new Person();//定义一个 function,如果使用 new"实
例化",该 function 可以看作是一个 Class
person.name=“Mark";
person.age="25";
person.work=function(){
alert(person.name+" hello...");
}
person.work();
复制代码

3、用 function 来模拟参构造函数来实现(用 this 关键字定义构造的上下文属性)

function Pet(name,age,hobby){
this.name=name;//this 作用域:当前对象
this.age=age;
this.hobby=hobby;
this.eat=function(){
alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序
员");
}
}
var maidou =new Pet("麦兜",25,"coding");//实例化、创建对象
maidou.eat();//调用 eat 方法
复制代码

4、用工厂方式来创建(内置对象)

var wcDog =new Object();
wcDog.name="旺财";
wcDog.age=3;
wcDog.work=function(){
alert("我是"+wcDog.name+",汪汪汪......");
}
wcDog.work();
复制代码

5、用原型方式来创建

function Dog(){ }
Dog.prototype.name="旺财";
Dog.prototype.eat=function(){alert(this.name+"是个吃货");}
var wangcai =new Dog();
wangcai.eat();
复制代码

7,Javascript 作用链域?

首先在 js 中有作用域的概念,值得就是一个变量的活动范围,分为全局作用域和局部 作用域,全局作用域指的是 window,局部作用域指的是每一个函数内部,在作用域 中查找一个变量首先在自己当前作用域查找找不到向上级查找,逐层向上找到 window 为止,找不到就会抛出一个错误,这个查找的过程就叫作用域链,作用域链 的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上 访问,变量访问到 window 对象即被终止,作用域链向下访问变量是不被允许的。作 用域链有一个需要要注意的问题就是变量提升,当一个变量的使用在定义之前的时候 就会得到一个 undefined 值,在 es6 中则不会出现这个问题,es6 不允许在定义之前 使用

8,谈谈 This 对象的理解。

this 分为几个不同的使用场景,在 function 中 this 指的的是 window,如果是实用 new 调用的话 this 指的是当前的实例化对象,在事件调用函数中 this 指的调用事件 的 window 特殊的是在 IE 中的 attachEvent 中的 this 总是指向全局对象 Window;,在定时器中 this 指的是 window,在 es6 中有一个箭头函数,在箭头函 数中 this 永远指向的是父级对象

1.当函数作为对象的方法调用时,this 指向该对象。

2.当函数作为淡出函数调用时,this 指向全局对象(严格模式时,为 undefined)

3.构造函数中的 this 指向新创建的对象

4.嵌套函数中的 this 不会继承上层函数的 this,如果需要,可以用一个变量保存上层 函数的 this。

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

window:它是一个顶层对象,而不是另一个对象的属性,即浏览器的窗口。

document:代表整个 HTML 文档,可用来访问页面中的所有元素

Window 对象表示当前浏览器的窗口,是 JavaScript 的顶级对象。我们创建的所有对 象、函数、变量都是 Window 对象的成员。 Window 对象的方法和属性是在全局范围内有效的。

Document 对象是 HTML 文档的根节点与所有其他节点(元素节点,文本节点,属 性节点, 注释节点)

Document 对象使我们可以通过脚本对 HTML 页面中的所有元素进行访问

Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进 行访问

10,null,undefined 的区别?

null 表示一个对象被定义了,值为“空值”;

undefined 表示不存在这个值。

typeof undefined //"undefined"

undefined :是一个表示"无"的原始值或者说表示"缺少值",就是此处应该有一个值, 但是还没有定义。当尝试读取时会返回 undefined; 例如变量被声明了,但没有赋值时,就等于 undefined

typeof null //"object"

null : 是一个对象(空对象, 没有任何属性和方法); 例如作为函数的参数,表示该函数的参数不是对象;

注意:

在验证 null 时,一定要使用 === ,因为 == 无法分别 null 和 undefined undefined 表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:

1.变量被声明了,但没有赋值时,就等于 undefined。

2.调用函数时,应该提供的参数没有提供,该参数等于 undefined。

3.对象没有赋值的属性,该属性的值为 undefined。

4.函数没有返回值时,默认返回 undefined。

null 表示"没有对象",即该处不应该有值。典型用法是:

1) 作为函数的参数,表示该函数的参数不是对象。

2) 作为对象原型链的终点。