javascript的基本数据类型
Number String Boolean Null undefind object是js中所有对象的父对象
js的基本规范
不在同一行声明多个变量
使用===或!==来比较true/false或者数值
switch必须带有default分支
函数应该有返回值
for if else必须用大括号
语句结束加分号
命名要有意义,使用驼峰法命名
javascript有几种类型的值
基本数据类型(存储在栈中)引用数据类型(存储在堆中)
两种类型的区别:存储位置不同,原始数据类型直接存储在栈中简单数据段,占据空间小,大小固定,被频繁使用,放在栈中存储
引用数据存储在堆中对象,占据空间大,大小不固定
堆和栈的区别?
栈(stack):由编译器自动分配释放,存放函数参数值,局部变量
堆:一般由程序员分配释放
javascript作用域链
作用域链的原理和原型链很类似,如果这个变量在自己的作用域中没有,那么他会寻找父级,直到最高层
js没有块级作用域,若要形成块级作用域,可通过function(){}立即执行的形式实现
this的理解
this总是指向函数的直接调用者(而非间接调用者)
如果有new关键字,this指向new出来的那个对象
在事件中,this指向目标元素,特殊的IE的attachEvent中this总是指向全局对象window
什么是window对象,什么是document对象
window对象代表浏览器中打开的一个窗口
document对象代表整个html文档
实际上,document对象是window对象的一个属性
如何判断一个对象是否属于某个类
instanceof(需要被判断的对象,instanceof,类)
new操作符具体有什么作用?
创建一个空对象,并且this变量引用该对象,同时还继承了该函数的原型
属性和方法被加入this引用的对象中
新创建的对象由this所引用,并且最后隐式的返回this
什么是跨域问题?怎么解决
不满足同源策略(协议、端口、ip相同),使用jsonp跨域或者cors跨域
call和apply方法的区别?
call和apply的作用相同,动态改变某个类的某个方法的运行环境
使用call()传递给函数的参数必须逐个列举出来
apply()传递给函数的是参数数组
GET和Post两种基本请求方式的区别?
GET把参数包含在URL中
Post通过request body传递参数
区别?
传送方式:get通过地址栏传输,post通过报文传输
传送长度:get参数有长度限制(受限于url长度)而post无限制
get产生一个TCP数据包,POST产生两个TCP数据包
建议:
get方式的安全性比Post方式要差些
在数据查询时,建议使用Get方式,做数据添加,修改、删除建议用Post
js常用的事件
onchange:当input框,textarea框或select下拉框等元素的内容发生变化时触发
onclick:点击事件
onfoucus:获取焦点事件(鼠标的光标)
onblur: 失去焦点
onload:加载事件
onkeydown:键盘按下事件
onkeypress:释放键盘按键事件
js数组操作的方法
map()将数组中每个元素调用一个提供的函数,结果作为一个新的数字返回,并不改变原来的数组
forEach()循环,
filter()将满足条件的元素作为一个新数组返回
every()将所有元素进行判断返回一个布尔值,所有元素都满足判断条件,则返回true
some()如果存在元素满足条件,则返回true,只要有一个正确就返回true
reduce()所有元素调用返回函数,返回值为最后的结果,传入的值必须是函数类型
push()在数组后面添加新元素
pop()删除数组最后一个元素,此方法改变数组长度
shift()在数组后面删除第一个元素
unshift()删除数组开头的第一个元素
isArray()判断一个对象是不是数组
concat()将多个数组拼接成一个数组
tostring()将数组转化为字符串
join()添加数组中元素
splice(开始位置,删除个数,元素):实现增删改查
js中字符串常用的方法
charcodeAt(index)返回一个整数,代表指定位置字符的unicode编码
fromcharcode([code1[,code2···]])从一些Unicode字符串中返回一个字符串
charAt(index)返回指定索引位置处的字符串
slice(start[,end])返回字符串片段
substring(start,end)返回位于string对象中指定位置的字符串
substr(start [,length])从指定位置开始的指定长度的字符串
index of(substr [,start index])返回string对象内第一次出现子字符串位置,如果没有找到,返回-1
lastindexof(substr [,startindex])返回string对象最后一次出现子字符串位置,如果没有找到,返回-1
search(reExp) 返回与正则表达式查找内容匹配的第一个字符串位置
concat([string1[,string2···]]) 返回字符串值,包含两个或多个提供的字符串的连接
split([separator[,limit]])字符串分割为子字符串
toLowerCase 字符串中字母转小写
toupperCase 字符串中字母转大写
说一下从输入URL到页面加载完中间发生了什么?
1、DNS域名解析 2、发起TCP连接(三次握手) 3、发送HTTP请求,接受HTTP响应 4、断开TCP连接(四次挥手) 5、浏览器解析HTML代码,请求js,css等资源,最后进行页面渲染,呈现给用户
解释 JavaScript 中“undefined”和“not defined”之间的区别
undefined是javascript语言中定义的五个原始类中的一个,换句话说,undefined并不是程序报错,而是程序允许的一个值。
not defined是javascript在运行我们的javascript代码时,遇到没有定义就用来运算的变量时爆出来的错误。
请描述值类型(基本数据类型)和引用类型的区别
1.值类型:String(字符串),Number(数字),Boolean(布尔类型),Undefinde
2.引用类型:Array(数组),Object(对象),Function(函数)储存方式不一样:值类型是栈存储,引用类型是堆存储
变量赋值:基本数据类型是直接把值赋给变量。而引用类型是,把值的地址复制给新变量,通过地址再找到内容。
js作用域?
作用域就是变量与函数的可访问范围,即作用域控制着函数与变量的可见性和生命周期
1.全局作用域
任何地方都能访问到的对象拥有全局作用域
1.1.函数外面定义的变量拥有全局作用域,全局变量拥有全局作用域,网页中所有脚本和函数均可使用。全局变量在页面关闭后销毁
1.2.未定义直接赋值的变量自动声明为全局变量拥有全局作用域
1.3.window对象的属性拥有全局作用域
HTML中,全局变量是window对象,所有数据变量都属于window对象
2.局部作用域
局部作用域一般只在固定的代码片段内能访问到,最常见的例如函数内部,所以也称为函数作用域
变量在函数内声明,变量为局部作用域
局部变量:只能在函数内访问
ES6的块级作用域
ES6引入了块级作用域,明确允许在块级作用域中申明函数,let和const命令都涉及块级作用域
块级作用域允许声明函数只在使用大括号的情况下成立,如果未使用大括号报错
什么是 JavaScript 中的提升操作
用var声明的变量提升,其只是变量提升了,而没有进行赋值的提升
什么是JavaScript原型,原型链 ? 有什么特点?
JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象,当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾
原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法
在对象实例和它的构造器之间建立一个链接(它是__proto____属性,是从构造函数的prototype属性派生的),之后通过上溯原型链,在构造器中找到这些属性和方法
浏览器是如何渲染页面的?
1.根据html文件构建DOM树和CSSOM树。构建DOM树期间,如果遇到JS,阻塞DOM树及CSSOM树的构建,优先加载JS文件,加载完毕,再继续构建DOM树及CSSOM树。
2.构建渲染树(Render Tree)。
3.页面的重绘(repaint)与重排(reflow,也有称回流)。页面渲染完成后,若JS操作了DOM节点,根据JS对DOM操作动作的大小,浏览器对页面进行重绘或是重排。
简述同步与异步的区别?
同步就相当于是 当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。这样的话客户端需要一直等待。用户使用起来会有不友好。
异步就是,当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。
什么是promise
一.Promise是异步编程的一种解决方案,它是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同
样的方法进行处理。promise对象是一个构造函数,用来生成Promise实例;
二.promise的两个特点 对象状态不受外界影响 && 一旦状态改变,就不会再变,任何时候都可以得到结果(pending状态-->fulfilled || pending-->rejected)
async/await是什么?
1. Async—声明⼀个异步函数(async function someName(){...})
2. ⾃动将常规函数转换成Promise,返回值也是⼀个Promise对象
3. 只有async函数内部的异步操作执⾏完,才会执⾏then⽅法指定的回调函数
4. 异步函数内部可以使⽤await
5. Await—暂停异步的功能执⾏(var result = await someAsyncCall();)
6. 放置在Promise调⽤之前,await强制其他代码等待,直到Promise完成并返回结果
7. 只能与Promise⼀起使⽤,不适⽤与回调
8. 只能在async函数内部使⽤
箭头函数的this指向哪里?
1.在全局环境下,this 始终指向全局对象(window)
2.对象内部方法的this指向调用这些方法的对象,函数的定义位置不影响其this指向,this指向只和调用函数的对象有关。
多层嵌套的对象,内部方法的this指向离被调用函数最近的对象(window也是对象,其内部对象调用方法的this指向内部对象, 而非window)。
3.构造函数中的this与被创建的新对象绑定。
null与undefined的区别是什么?
null表示"没有对象",即该处不应该有值。
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。
说一下 call,apply,bind区别
1)apply,call和bind都是 用来改变this的指向
2)apply和call会让当前函数立即执行,而bind会返回一个函数,后续需要的时候再调用执行
说一下你对JS面向对象的理解?
但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义JS中对象:无序属性的集合,其属性可以包含基本值、对象或者函数。可以简单理解为JS的对象是一组无序的值,其中的属性或方法都有一个名字,根据这个名字可以访问相映射的值(值可以是基本值/对象/方法)。
谈谈你对原型链的理解
访问一个对象属性时,先在自身属性中查找,找到返回
如果没有,再沿着__proto__这条链向上查找,找到返回
如果最终没有找到,返回undefined
什么情况造成跨域?
同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?
很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。
由此可见,"同源政策"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。