js面试考点一

考点一:数据类型

数据类型:

string,number,object,boolean,null,undefined,symbol

判断数据类型的方式:

type,instanceOf,Constructor,Object.prototype.toStrign.call

三种强制类型转换:

Number("10")转换为number类型

parseInt("20.5")转换为number取整

parseFloat("10.5")转换为number保留小数

String(10)转换为string类型

Boolean(1)转换为Boolean类型

两种隐式类型转换:

1.四则运算转换:

“+”是双目运算符,只要其中一个是string,表达式的值便是一个String

其他四则运算:只要其中一个是Number类型,表达式便是一个Number

2.判断语句转换

10==”10“ ”10“隐式转换为10

考点2:传值 vs 传址

1.传值

基本类型的值是通过值复制的方式来赋值或者传递的,这里b的改变不会影响a。

基本类型:string,number,null,undefined,bollean,以及ES6中的symbol

let a = 1
let b = a
b = 3
console.log(a, b)

控制台打印

2.传址

引用类型赋值并不会真正重新拷贝引用值,而是拷贝引用的地址,也就是传址。c和d是引用同一个地址,所以如果修改了c,那么d的值也会改变

引用类型:数组,对象,函数

let c = { name: 'hello' }
let d = c
c.name = 'hi'
console.log(c, d)

控制台打印

考点3:作用域

全局作用域+局部作用域

全局作用域:script标签和js文件最外层,在此声明的变量在函数内部也可以被访问

局部作用域:(函数作用域+块作用域,var声明的变量不会产生块作用域)

作用域链(底层的变量查找机制)

(1)函数执行,优先在当前函数作用域中查找变量

(2)当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域

变量提升

允许在变量声明之前即被访问(仅存在于var声明变量),把所有var声明的变量提升到当前作用域的前面,但是只提升声明,不提升赋值

function test() {
      console.log(a)
      console.log(foo())
      var a = 1
      function foo() {
        return 2
      }
    }
    test()

控制台打印

考点4:闭包

含义:有权访问另一个函数作用域中的变量的函数

闭包就是建立在函数内部的子函数,当函数执行完之后,作用域就会被清理,内存也随之会被回收。但是由于闭包函数是建立在函数内部的子函数,它可以访问上级作用域,即使上级函数执行完,作用域也不会随之销毁。

考点5:原型链和继承

原型链:当对象查找一个属性的时候,如果没有在自身找到,那么就会查找自身的原型,如果原型还没有找到,那么会继续查找原型的原型,直到找到Object.prototype的原型,此时原型为null,查找停止。

这种通过原型链接的逐级向上的查找链被称为原型链。

原型链继承:一个对象可以使用另外一个对象的属性或者方法,就称之为继承。

通过将这个对象的原型设置为另外一个对象,这样根据原型链的规则,如果查找一个对象属性且自身不存在时,就会查找另外一个对象,相当于一个对象可以使用另外一个对象的属性和方法

使用prototype实现继承

    function Father(name)
    {this.name=name}
    Father.prototype.myName = function()
    {return this.name}
    // 继承属性,借用构造函数调用
    function Son(name,label){
      Father.call(this,name)
      this.label=label
    }
    // 继承方法,创建备份
    Son.prototype=Object.create(Father.prototype)
    // 必须设置正确的构造函数,要不然在判断类型出错
    Son.prototype.constructor=Father
    Son.prototype.myLabel=function()
    {return this.label}


function Father 定义了一个构造函数,用于创建和初始化对象,this关键字指代正在创建的对象实例,this.name=name,将传入的参数赋值给对象的name属性。

Father.prototype是Father构造函数的原型对象,通过new Fathre()创建的对象实例都会继承这个原型对象上的属性和方法。

Father.prototype.myName 是在Father构造函数的原型对象上添加了一个myName方法,该方法返回该对象实例的name属性值

function Son(name,label)定义了构造函数Son,Father.call调用了Father构造函数,

Father.call(this,name)将this指向Son对象的实例,而name本就是定义Father构造函数时的参数形式,不变而已。

Son.prototype=Object.create(Father.prototype)是创建了一个原型指向Father.prototype的新对象,赋值给Son.prototype,也就是新对象继承了Father.prototype上的所有属性和方法

Son.prototype.constructor是修正Son原型对象上的constructor属性使其指向Father构造函数。

constructor的四大作用
1.标识构造函数
constructor 属性指向创建当前对象实例的构造函数。默认情况下,当你创建一个对象的原型时,constructor 属性会被设置为与该对象原型相关联的构造函数
2.原型链的导航
constructor 属性可以用来反向查找构造函数。例如,如果你有一个对象 obj,你可以通过 obj.constructor 找到构造 obj 的函数,这对于调试和动态代码很有用。
3.确保正确的继承
在继承中,如果你改变了构造函数的原型链,constructor 属性也可能需要被更新
4.用于自定义类型检查
constructor 属性还可以用于类型检查,例如判断一个对象是否是某个构造函数创建的实例

考点6:BOM(浏览器对象模型)和DOM(文档对象模型)操作

BOM:提供了独立于内容,与浏览器窗口进行交互的对象; 由于其主要用于管理窗口与窗口之间的通讯,因此核心对象是window;BOM由一系列相关对象构成,并且每个对象都提供了很多方法和属性

DOM:利用DOM我们可以操作HTML中的元素,使得网页被下载到浏览器后,开发者可以根据需求进行页面内容的修改

常见的BOM对象和方法:

window对象,是JS的最顶层对象,其他的BOM对象都是window对象的属性;

document对象,文档对象;

location对象,浏览器当前URL信息;

navigator对象,浏览器本身信息;

screen对象,客户端屏幕信息;

history对象,浏览器访问历史信息;

常用的方法:window.alert('提示信息')

window.confirm("确认信息")

window.prompt("弹出输入框")

window.open("url地址",“打开的方式”,“新窗口的大小”)

window.close()关闭当前的网页

window.moveTo() -移动当前窗口

window.resizeTo() -调整当前窗口的尺寸

swindow.setTimeout(函数,时间)只执行一次

window.setInterval(函数,时间)无限执行

考点7:Ajax与跨域

1.原生js ajax请求有几个步骤

1.创建XMLHttpRequest对象
var ajax = new XMLHttpRequest()

2.规定请求类型,URL以及是否异步处理请求
Ajax.open('GET',url,true)

3.发送信息到服务器时内容编码类型
ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded")

4.发送请求
ajax.send(null)

5.接受服务器响应数据
ajax.onreadystatechange = function() {
  if (obj.readyState == 4 && (obj.status == 200 ||obj.status == 304){
}
}

2.生么情况造成跨域

同源策略限制,不同源会造成跨域。

协议,域名,端口号三者要求全部相同,只要一个不相同就是非同源策略

3.跨域解决方案

a.动态创建一个script标签,利用script标签的src属性不受同源策略限制。因为所有的src属性和href属性都不受同源策略限制。可以请求第三方服务器数据内容。

//创建一个script标签
var script = document.createElement("script")

//script的src属性设置接口地址,并带一个calback回调函数名称
script.src="http://xxxxx/index.php?callback = jsonpCallback"

//插入到页面
document.head.appendChild(script)

//通过定义函数名去接收后台返回数据
function jsonpCallback(data){
//注意jsonp返回的数据是json对象可以直接使用
//ajax去的数据是json字符串需要转换为json对象才可以使用
}

b.CORS:跨域资源共享原理:服务器设置Access-Control-Allow-OriginHTTP响应头之后,浏览器将会允许跨域请求限制:浏览器需要支持HTML5,可以支持POST,PUT等方法兼容ie9以上

需要后台设置
Access-Control-Allow-Origin: *
//
允许所有域名访问,或者
Access-Control-Allow-Origin: http://a.com
//
只允许所有域名访问

c.向代理属于后端的解决方案,需要搭建一个中转nginx服务器,用于转发请求。也是最正规的解决方案

4.解释JSONP的工作原理

JSONP是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的javascript,于是我们可以通过script标记来动态加载其他域的资源。例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据,然后在pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数,pageB加载完之后会执行pageA中定义的函数,所需要的数据会以参数的形式传递给该函数。JSONP易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。

考点8.事件模型

1.事件流:事件是文档或者浏览器窗口中发生的,特定的交互瞬间。而事件流,描述的是从页面中接收事件的顺序。

2.冒泡与事件捕获:

事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。

事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。

3.阻止事件冒泡的几个方法:

a.event.stopPropagation();事件处理过程中,阻止了事件冒泡,但不会阻击默认行为,比如:点击事件绑定在a标签的话,会执行了超链接的跳转。

b.return false;事件处理过程中,阻止了事件冒泡,也阻止了默认行为。比如:点击事件绑定在a标签的话,不会执行超链接的跳转。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值