Javascript基本

106 阅读7分钟

 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,需要检查数据类型

箭头函数有哪些特点?

  • 特点为:
      1. 相比普通函数,箭头函数有更加简洁的语法。
      1. 箭头函数不绑定this,会捕获其所在上下文的this,作为自己的this。
      1. 箭头函数不绑定arguments,取而代之用rest参数解决,同时没有super和new.target。
      1. 使用call,apply,bind并不会改变箭头函数中的this指向。
  • 2.箭头函数的优点
    • 1.简洁的语法、
    • 2.隐式返回,如 下面的代码可以去掉return,代码移到一行,减少代码量numbers.map((number)=>number*2)
    • 3.解决了this的指向问题,原生的写法this指向的是调用者,箭头函数this绑定的是定义时的那个对象。如果有对象嵌套的情况,则this绑定到最近的一层对象上
  • 3.箭头函数的缺点
    • 1.做为构造函数的时候不能使用箭头函数
    • 2.真正需要this的时候如给元素绑定click事件的 时候,执行的回调函数不能使用箭头函数。
      1. 箭头函数是匿名函数,不能作为构造函数,不可以使用new命令,否则后抛出错误。
    • 4.我们需要使用arguments对象的时候不能使箭头函数。箭头函数中没有arguments对象。
      1. 箭头函数没有原型对象prototype这个属性
      1. 不能使用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(内容安全策略)可以减少或消除这类攻击,副作用是 evalFunction() 等方法会失效。类似的还有 CRLF 攻击,防御此类攻击的核心就是严格控制用户提交的内容,对输入进行过滤,对输出进行转义