16.js中面向对象和面向过程的区别
答:
- 面向过程
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候一个一个一次调用就可以了,例如c语言的特点
- 面向对象
是把构成问题的事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。例如java语言的特点
17.什么是脚本?
答: 脚本script是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件
18.cookies、sessionStorage和localStorage的区别?
- cookie数据始终在同源的http请求中携带(即使不需要),即会在浏览器和服务器来回传递;而sessionStorage和localStorage不会自动把数据发送给服务器,仅仅在本地保存;并且
sessionStorage和localStorage的储存空间更大;
sessionStorage和localStorage有更多丰富易用的接口
sessionStorage和localStorage有各自独立的存储空间
- 从存储大小来说,cookie数据大小不能超过4k。而sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大
- 从有效时间来说,cookie数据设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭数据依旧在;而localStorage是用来存储持久数据,浏览器关闭后数据不丢失;sessionStorage:数据在当前浏览器窗口关闭后自动删除
19.谈一下你对面向对象的理解?
-
对象的组成:一个对象是由属性和方法组成的
-
面向对象的理解:万物皆对象,面向对象会把事物抽象成对象的概念,就是说这个问题里面有那些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决
-
面向对象的特点
- 抽象
- 封装
- 继承:就是为了代码复用,从父类上继承出一些方法和属性,子类也有自己的一些属性
- 多态:实际上是不同对象作用于同一操作产生不同的效果。多态的思想实际上是把“”想做什么和“谁去做分开”
20.什么是函数
答:函数是由事件的驱动的,或者当它被调用时执行的可重复使用的代码
21.什么是闭包?简述一下优缺点
答:闭包是有权访问另一个函数私有变量的函数叫闭包
- 优点:避免变量污染,加强了封装性,逻辑性比较强的的可读性高,加载到内存中的执行效率高
- 缺点:在内存中,造成内存浪费,如果滥用闭包会是灾难性的
23.怎么判断一个object是否是数组(array)?
- instanceof 用于判断一个变量是否是某个对象的实例
var arr=[];
console.log(arr instanceof Array) //true
- constructor 属性返回对创建此对象的数组函数的引用,就是返回对象相对应的构造函数
console.log([].constructor == Array) //true
Array.isArray()
用于确定传递的值是否是一个Array。
Array.isArray(obj)
24.javascript中函数声明与函数表达式的区别?
- 函数声明:
function 函数名称 (参数:可选){ 函数体 }
- 函数表达式:
function 函数名称(可选)(参数:可选){ 函数体 }
区别如下:
- 以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的,它可以是一个匿名函数或者说一个箭头函数
- 以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用
- 以函数声明的方法定义的函数并不是真正的声明,他们仅仅可以出现在全局中或者嵌套在其他函数中
console.log("fn函数表达式之前调用开始")
fn() //报错:fn is not a function
console.log('fn函数表达式之前调用结束')
var fn=function(){
console.log("fn函数表达式声明执行")
}
因为在第一次调用fn()的同时,var fn 变量没有作为全局对象的一个属性而存在,且 fn 引用的匿名函数上下文也没有被初始化,所以在他之前调用失败。
接下来看fn2()函数声明是可以在声明之前调用的
console.log("fn2函数声明之前调用开始")
fn2() //fn2函数声明执行
console.log('fn2函数声明之前调用结束')
function fn2(){
console.log('fn2函数声明执行')
}
25.this一般的指向,以及如何改变指向
this指代那个对象
- 通常在函数中this指向的是调用函数的那个对象即谁调用指向谁,如x.fn()
- 事件函数中的this通常指向的是绑定事件的事件源元素,click单击事件
- 构造函数中的this,(使用new调用构造函数创建对象),通常指向的是new所创建出来的对象本身
- 全局范围的this通常指向的是全局对象(浏览器中是指window)
修改this指向:
使用js中的call()、apply()、bind()方法可以修改this的指向
Function.prototype.bind(thisArg) -- ES5
能够返回一个新函数,该新函数的主体与原函数主体一致,但当新函数被调用执行时,函数体中的 this 指向的是 thisArg 所表示的对象
Function.prototype.call(thisArg, val1, val2, ....)
调用函数执行,在函数执行时将函数体中的 this 指向修改为 thisArg 所表示的对象
val1, val2, … 表示传递给调用函数的实际参数列表
Function.prototype.apply(thisArg, array|arguments)
调用函数执行,在函数执行时将函数体中的 this 指向修改为 thisArg 所表示的对象,
array|arguments 表示调用函数的参数列表,使用数组或类数组的格式
下面给出完整例子帮助理解:
let obj={
name:'zhangsan',
age:18,
provice:'广东',
city:'深圳',
myfn:function (x,y){
console.log("我的名字是:"+this.name+"我的年龄为:"+this.age+"来自:"+x+y)
}
}
let obj2={
name:'lisi',
age:18
}
//未修改函数的this指向时
obj.myfn("广东","深圳") //我的名字是:zhangsan我的年龄为:18来自:广东深圳
//修改函数的this指向后
obj.myfn.call(obj2,"广东","汕头") //我的名字是:lisi我的年龄为:18来自:广东汕头
obj.myfn.bind(obj2,"广东","梅州")() //我的名字是:lisi我的年龄为:18来自:广东梅州
obj.myfn.apply(obj2,["广东","广州"]) //我的名字是:lisi我的年龄为:18来自:广东广州
26.javascript的typeof返回哪些数据类型
答:string
,boolean
,number
,undefined
,function
,object
27.new操作符具体干了什么呢?
答:
new关键字主要的作用是继承:
当一个构造函数前加new的时候,背地里做了四件事
- 创建一个空对象
//创建一个空对象,并将其作为this
let obj=new Object()
- 将空对象的__proto__指向构造函数的prototype
obj.__proto__=Object.prototype
- 让构造函数的this指向obj,并执行了函数体
let result=Object.call(obj);
- 判断返回类型,如果是值就返回这个obj,如果是引用类型,返回这个引用对象
return typeof result ==="object"?result:obj;
28.什么是JSON?
答:
- JSON是一种轻量级的数据交换格式
- JSON独立于语言和平台,JSON解析器和JSON库支持许多不同的编程语言
- JSON的语言表示三种类型值,简单值(字符串,数值,布尔值,null),数组,对象
29.js中的3中弹出式命令是什么?
- alert() 警告提示框
- comfirm() 确认框用于显示一个带有指定消息和 OK 及取消按钮的对话框,根据用户点击确认框上的按钮返回true与false。
- prompt() 输入框用于显示可提示用户进行输入的对话框。如果用户单击提示框的取消按钮,则返回null。 如果用户单击确认按钮,则返回输入字段当前显示的文本。
30.javascript dom中有几种节点类型
答:一般地,一个节点至少拥有nodeType、nodeName、nodeValue这三个基本属性。即节点类型不同,这三个属性的值也不相同
我知道的nodeType属性返回节点类型的常用值。不同的类型对应不同的常数值,12中类型分别对应1到12的常数值:即
- 元素节点:nodeType===1
- 属性节点:nodeType===2
- 文本节点:nodeType===3