JS 数据类型 ? 如何判断 ?
数据类型主要包括两部分:
- 基本数据类型: Undefined、Null、Boolean、Number 和 String
- 引用数据类型: Object (包括 Object 、Array 、Function)
- ECMAScript 2015 新增:Symbol(创建后独一无二且不可变的数据类型 )
如何判断基本数据类型 ?
- typeof它返回值是一个字符串,该字符串说明运算数的类型。返回结果只有以下几种:
undfined,boolean,number,string,object,function,- 缺点 - 无法判断
对象和数组,还有null,因为都返回的是object - 用法 typeof(1)); //number
- 缺点 - 无法判断
- instanceof 是用来 判断数据是否是某个对象的实例,返回一个
布尔值, 无法区分 array/obj/fun, null 和undfined- 用法
5 instanceof Number // false
new Number(5) instanceof Number // true
- Object.prototype.toString.call()方法,会返回一个形如 “[object Xxx]” 的字符串很准确,比如("[object Number]"), 因为实例对象有可能会自定义toString()方法,会覆盖Object.prototype.toString(), 所以在使用时,最好加上call()
null 和 undefined 的区别?
- null 表示一个对象被定义了,值为“空值”;
- undefined 表示不存在这个值。
“ ===”、“ ==”的区别
- ==,当且仅当两个运算数相等时,它返回 true,因为在运算之前会进行一个隐式转换,可以将等式两边的数值转换成相同类型,即不检查数据类型
- ===,只有在无需类型转换运算数就相等的情况下,才返回 true,需要检查数据类型
箭头函数有哪些特点?
- 特点为:
-
- 相比普通函数,箭头函数有更加简洁的语法。
-
- 箭头函数不绑定this,会捕获其所在上下文的this,作为自己的this。
-
- 箭头函数不绑定arguments,取而代之用rest参数解决,同时没有super和new.target。
-
- 使用call,apply,bind并不会改变箭头函数中的this指向。
-
- 2.箭头函数的优点
- 1.简洁的语法、
- 2.隐式返回,如 下面的代码可以去掉return,代码移到一行,减少代码量numbers.map((number)=>number*2)
- 3.解决了this的指向问题,原生的写法this指向的是调用者,箭头函数this绑定的是定义时的那个对象。如果有对象嵌套的情况,则this绑定到最近的一层对象上
- 3.箭头函数的缺点
- 1.做为构造函数的时候不能使用箭头函数
- 2.真正需要this的时候如给元素绑定click事件的 时候,执行的回调函数不能使用箭头函数。
-
- 箭头函数是匿名函数,不能作为构造函数,不可以使用new命令,否则后抛出错误。
- 4.我们需要使用arguments对象的时候不能使箭头函数。箭头函数中没有arguments对象。
-
- 箭头函数没有原型对象prototype这个属性
-
- 不能使用yield关键字,不能用作Generator函数
var、let、const 区别?
- var 变量提升,定义到window上了(但是函数闭包内打印报错not defined),let/const 块内(代码块),
- var 可以重复声明、后面的覆盖前面的,let/const不允许重复申明会报错
- 暂时性死区,var 会提升 未定义, 但是let/cosnt,不会提升,直接没有定义
// name会被提升
console.log(name); // undefined
var name = 'zimo'; // 等于 var name name = ''
// age不会被提升
console.log(age); // ReferenceError:age没有定义
let age = 18;
// sex不会被提升
console.log(age); // ReferenceError:age没有定义
const sex = "男";
- 初始值设置 var/let 可以不设置初始值,const必须设置初始值
- 指针指向 let创建的变量是可以更改指针指向(可以重新赋值),const 不能改变指针(对象除外,改变的不是指针)
- 应用场景
- 内层变量可能覆盖外层变量
- 计数的循环变量泄露为全局变量
- 对象类型使用 const ,非对象类用let
new操作符具体干了什么呢
> 1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
> 2、属性和方法被加入到 this 引用的对象中。
> 3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
JSON 的了解
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小
{‘age’:‘12’, ‘name’:‘back’}
document.write 和 innerHTML 的区别?
- document.write 只能重绘整个页面
- innerHTML 可以重绘页面的一部分
请解释一下 JavaScript 的同源策略
- 概念:同源策略是客户端脚本(尤其是Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。
这里的同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议。
指一段脚本只能读取来自同一来源的窗口和文档的属性。
javascript的内存(垃圾)回收机制?
- 垃圾回收器会每隔一段时间找出那些不再使用的内存,然后为其释放内存
- 一般使用标记清除方法(mark and sweep), 当变量进入环境标记为进入环境,离开环境标记为离开环境, 垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了
- 还有引用计数方法(reference counting), 在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。
- 在IE中虽然JavaScript对象通过标记清除的方式进行垃圾回收,但BOM与DOM对象却是通过引用计数回收垃圾的, 也就是说只要涉及BOM及DOM就会出现循环引用问题。
JavaScript原型,原型链 ? 有什么特点?
原型 又名 prototype,它的职责是给其它对象提供共享属性
- 原型对象:每个函数都有一个 prototype 属性,这个属性是一个指针,指向一个对象,这个对象称为原型对
- 原型属性:每个函数都有一个 prototype 属性,唤为原型属性,指向原型对象
原型链的概念 每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时, 如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype, 于是就这样一直找下去,也就是我们平时所说的
用js递归的方式写1到100求和
function add(num1, num2) {
const num = num1 + num2;
if(num2 === 100) {
return num;
} else {
return add(num, num2 + 1)
}
}
var sum = add(1, 2);
事件队列(宏任务微任务)
- 可以分为微任务(micro task)队列和宏任务(macro task)队列。
- 微任务一般比宏任务先执行,并且微任务队列只有一个,宏任务队列可能有多个。另外我们常见的点击和键盘等事件也属于宏任务。
下面我们看一下常见宏任务和常见微任务。
常见宏任务:
- setTimeout()
- setInterval()
- setImmediate()
常见微任务:
- promise.then()、promise.catch()
- new MutaionObserver()
- process.nextTick() 微任务和宏任务的本质区别。
宏任务特征:有明确的异步任务需要执行和回调;需要其他异步线程支持。 微任务特征:没有明确的异步任务需要执行,只有回调;不需要其他异步线程
网络安全
- XSS(跨站脚本攻击): 利用了浏览器对于从服务器所获取的内容的信任,注入恶意脚本在受害者的浏览器中得以运行,分为反射型、储存型、DOM型。开启 CSP(内容安全策略)可以减少或消除这类攻击,副作用是
eval、Function()等方法会失效。类似的还有 CRLF 攻击,防御此类攻击的核心就是严格控制用户提交的内容,对输入进行过滤,对输出进行转义