1: javaScript 中基本数据类型:
(1): Number: 数值类型
String: 字符串类型
Boolean: 布尔类型
Null: 空对象
Undefined: 未定义的
Symbel (ES6 新增数据类型)
2: 引用数据类型:
引用数据类型统一称之为Object 类型; 引用数据类型: 包含Object, Array(数组), Date (日期对象) Function (函数); RegExp: 正则表达式;
基本数据类型的数据直接存存储在栈中, 而引用数据类型的数据存储在堆中, 每一个对象在堆中有一个引用地址, 引用数据类型在栈中会保存他的引用地址。 以便快速查找内存中的对象。
随便提一句: 栈内存是自动分配的内存的。 而堆内存是动态分配内存的, 不会自动释放。 所以每次使用完对象
的时候都需要把它设置为null, 从而减少无用内存的消耗。
3: 判断数据类型有几种方法:
typeof; 检测数据类型 但是缺点: typeof null 的值为Object (是对象类型), 无法辨别null 还是
Object null 和 object 是两种数据类型对象。
instanceof: 只可以判断对象是否存在目标对象原型链上
constructor: 构造函数
Object.prototype.toString.call() 方法:
一种最好检测基本类型的检测方式 Object.prototype.toString.call(); 它可以区分null,
String(字符串类型), boolean(布尔类型), number(数值类型) undefined (未定义); array(数组类
型) object(对象); date(日期对象); math: (数学对象) 类型。
4: 为什么typeof null 是object 对象;
因为在 javaScript 中不同对象都是使用二进制进行存储, 如果二进制前三位都是0 的话, 系统会判断为object 类型, 而null的二进制全是0, 自然也就判断为object类型。
5: == 和 === 有什么区别?
=== 是严格意义上的相等, 会比较两边数据类型的大小。
数据类型不相同: 则返回 false;
数据类型相同, 但是数值大小不相等, 则会返回false;
6: == 是非严格意义上的相等。
两边的类型相等, 比较大小。
7: 使用字面量创建对象和 new 创建对象有什么区别? new 内部都实现了什么, 手写一个new:
字面量: 字面量创建对象更加方面, 方面阅读。
不需要作用域解析, 速度更快。
new 内部: 创建一个新对象。 使新对象的__proto__ 指向原函数的prototype
改变this 指向 (指向新的obj) 并且执行该函数, 执行结果保存起来作为result.
判断执行函数的结果是不是null 或者 Undefined(未定义的) 如果是返回之前的新的对象, 如果不是则返回result
8: 字面量new 出来的对象, 和Object.created(null) 创建出来的对象有什么区别?
字面量创建出来的对象会继承Object 方法和属性, 他们的隐士原型会指向Object 的显示原型。
而Object.create(null) 创建出来的对象原型为 null, 作为原型链的顶端, 自然也没有继承Object的方法和属性。
9: 什么是原型? 什么是原型链? 如何理解?
原型分为显式原型和隐式原型, 每一个对象都会有一个隐式原型, 它指向自己的构造函数的显示原型。
原型链: 多个__proto__ 组成的集合成为原型链。
所有的实例的__proto__ 都指向他们的构造函数的prototype
所有的prototype 都是对象, 自然它的__proto__ 指向的是Object() 的prototype
所有构造函数的隐式原型指向的都是 Funtion 的显示原型。
Object 的隐式原型是null (是空对象);
10: 宏任务与微任务? 宏任务与微任务的都有哪些?
<script></script> 属于宏任务 setTimeOut, setInterval, setImmediate.
微任务有: Promise(对象); .then, process, nextTick Object.observe
注意: Promise 是同步任务。
11: 宏任务和微任务是怎样执行的? (执行顺序)
(1): 执行宏任务<script></script>
(2): 进入script 后, 所有的同步任务主线程执行。
(3): 所有的宏任务放进宏任务的执行队列中
(4): 所有的微任务放进微任务执行队列
(5): 先清空微任务队列
(6): 再去取一个宏任务, 执行, 再清空微任务队列。
(7): 依次循环
12: var let const 有什么区别?
var 声明变量可进行变量提升, let 和 const 不会。
var 可以重复声明
var 在非函数作用域中定义是挂载到window 上的。
let 声明变量只是在局部作用域起作用。
let 防止变量污染
const 具有let 的所有的特征
但是不可被改变
如果使用const 声明的对象的话, 是可以修改对象里边的值的。
13: 箭头函数和普通函数的区别? 箭头函数可以当做构造函数new 吗?
1: 箭头函数就是普通函数的简写, 但是他不具备普通函数的特性。
2: 第一点: this的指向问题, 箭头函数的 this指向它所定义时所在的对象, 而不是调用时所在的对象。
3: 不会进行函数提升
4: 没有arguments 对象, 不能使用argumnets, 如果要获取参数的话, 可以使用reset 运算符。
5: 没有yield 属性, 不可以作为生成器Generator(生成器);
6: 不能 new
没有自己的this, 不能调用call 和apply 方法
没有prototype, new关键字内部需要把新对象的__proto__ 指向函数的prototype.
14: 为什么要使用模块化? 都有哪几种方式可以实现模块化, 各有什么特点?
为什么要使用模块化?
1: 防止命名冲突
2: 更好的分离, 按需加载
3: 更好的服用性
4: 更高的维护性
15: localStorage, SessionStorage, cookie, session 有什么区别?
localStorage: 生命周期: 关闭浏览器后依然保存数据, 除非手动清空, 否则一直都在。
作用域: 相同的浏览器的不同标签在同源策略的情况下, 可以共享localSession;
16: sessionStorage: 生命周期关闭浏览器或者标签后当即失效。
作用域: 只在当前标签可用, 当前的iframe 中且同源可以享用。
cookie: 只是保存在客户端的, 一般由后端设置值。 可以设置过期时间。
存储大小只有4k,
一般用来保护用户的信息的
在http 下的cookie 是明文传输的, 较不安全。
cookie: 属性有
http-only: http-only:不能被客户端更改访问,防止XSS攻击(保证cookie安全性的操作)
Secure:只允许在https下传输;
Max-age: cookie生成后失效的秒数
expire: cookie的最长有效时间,若不设置则cookie生命周期与会话期相同
session:
session 是保存在服务器端的。
session 的运行依赖sessioid, 而sessionid 有保存在 cookie中, 所以如果禁用cookie,
session 也是不能用的, 不过硬要用也是可以的, 可以把sessionid 保存在URL 中。
session 一般用来跟踪用户的状态。
session: 安全性更高, 保存在服务器端, 不过一般为服务器端性能更佳, 会考虑部分信息保存在
cookie 中。
javaScirpt 中基本数据类型和引用数据类型
最新推荐文章于 2024-01-14 21:31:56 发布