-
JS 数据类型有哪些?分别是如何存储的?
- JS 共有 8 种数据类型
- 7 种基本数据类型:undefined、null、booblean、number、string、symbol(es6新增)、bigint(es10新增)
- 1 种引用数据类型:object,包括:function、object、array
- 如何存储
- 基本数据类型存储在栈中,占用空间小,大小固定
- 引用数据类型存储在栈和堆中,占用空间大,大小不固定。引用数据类型在栈中存储指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获取实体。
- JS 共有 8 种数据类型
-
ES5 中如何实现继承?有哪些继承的实现方式?
-
基本数据类型和引用数据类型有何区别?
-
基本数据类型,是按值访问的,变量之间拷贝后,修改其中一个不影响其他变量存储的值;
-
引用数据类型,是保存在堆中的对象。与其他语言不同,不能直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈中的引用地址。
-
区别
- 声明变量时分配的内存空间不同;
- 访问机制不同
- 复制变量时不同,引用类型只是将变量在栈中的地址指针进行了复制,在堆中共用同一份实体,可以理解为复制变量就多了一份栈内指针的实体引用;
- 参数传递不同:首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。对于引用类型变量而言,函数传参时传递的是该变量在栈中存储的实体引用。
-
-
原型链是什么?
-
谈谈作用域?
-
谈谈对 this 指向的了解?
-
JS 中对象遍历的方法有哪些?
- for...in 循环遍历对象自身的和继承的可枚举属性(循环遍历对象自身的和继承的可枚举属性(不含Symbol属性).).
- Object.keys()遍历 (返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性).).
- Object.getOwnPropertyNames(obj),返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性).
- Reflect.ownKeys(obj)遍历返回一个数组,包含对象自身的所有属性,不管属性名是Symbol或字符串,也不管是否可枚举.
- Object.getOwnPropertySymbols() 方法返回对象自身的 Symbol 属性组成的数组,不包括字符串属性
-
JS 中数组遍历的方法有哪些?
- for 循环
- foreach 循环,注意有三个参数
- map 循环,注意有三个参数
- forof遍历可以正确响应break、continue和return语句
- filter遍历不会改变原始数组,返回新数组
- every()是对数组中的每一项运行给定函数,如果该函数对每一项返回true,则返回true。
- some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true。
- reduce接受一个函数,函数有四个参数,分别是:上一次的值,当前值,当前值的索引,数组
- reduceRight()方法的功能和reduce()功能是一样的,不同的是reduceRight()从数组的末尾向前将数组中的数组项做累加。
- find()方法返回数组中符合测试函数条件的第一个元素。否则返回undefined
- 对于数组中的每个元素,findIndex 方法都会调用一次回调函数(采用升序索引顺序),直到有元素返回 true。只要有一个元素返回 true,findIndex 立即返回该返回 true 的元素的索引值。如果数组中没有任何元素返回 true,则 findIndex 返回 -1。findIndex 不会改变数组对象。
- ES6 提供三个新的方法 —— entries(),keys()和values() —— 用于遍历数组。它们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历
-
JS 数组常用的方法有哪些?
- push,数组尾部添加一个新元素
- pop,删除数组尾部一个元素,并返回该元素
- shift,删除数组头部第一个元素,并返回该元素
- unshift,数组首部添加一个元素,并返回数组
- concat,数组拼接
- join,数组元素转为字符串,并以参数作为分隔
- toString, 数组元素转为字符串
- split,
- reverse,数组倒序
- sort,数组排序
- slice(start,end),返回数组指定元素
- splice(index,howmany,item1,.....,itemX),删除元素并添加新元素
-
谈谈变量提升?
-
JS 精度丢失问题?
-
JS 精度丢失的典型问题
- 浮点数相加
0.1 + 0.2 != 0.3 // true
- 大整数运算
9999999999999999 == 10000000000000001 // true
- toFixed 不会四舍五入
1.335.toFixed(2) // 1.33
-
JS 精度丢失的原因 计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。JS 遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit。
-
精度丢失的解决方案 zhuanlan.zhihu.com/p/100353781
-
-
JS 中如何处理二进制数据?(蓝牙通讯等涉及)
-
重点!!!谈谈 JS 异步编程解决方案?
-
重点!!!谈谈对 Promise 的理解?如何实现一个 Promise?如何实现 Promise.all 方法?
-
co 库的执行原理?
-
什么是严格模式?与普通模式有何差别?
- 使得Javascript在更严格的条件下运行。
- 严格模式对Javascript的语法和行为,都做了一些改变
-
全局变量显式声明
在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。
-
静态绑定
(1)禁止使用with语句
(2)创设eval作用域
-
增强的安全措施
(1)禁止this关键字指向全局对象
``` function f(){ return !this; } // 返回false,因为"this"指向全局对象,"!this"就是false function f(){ "use strict"; return !this; } // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
(2)禁止在函数内部遍历调用栈
-
禁止删除变量
严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除
-
显式报错
正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。
严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。
严格模式下,对禁止扩展的对象添加新属性,会报错。
严格模式下,删除一个不可删除的属性,会报错。
-
重名错误
(1)对象不能有重名的属性
(2)函数不能有重名的参数
-
禁止八进制表示法
-
arguments对象的限制
-
函数必须声明在顶层
-
增加了一批保留字
-
-
string 和 array 有哪些常用方法?
-
使用过闭包吗?谈谈闭包的使用场景?如何正确的使用闭包?
-
使用过扩展运算符吗?
-
有使用过 Proxy 和 Reflect 吗?
-
谈谈对 Generator 函数的理解?
-
有用过 ES6 的 Class 吗?和 ES5 实现的继承有何区别?
-
ES6 对 ES5 做了哪些扩展?(函数、数组、对象、运算符)
- 箭头函数
- 模板字符串
- 块级作用域
- 默认参数
- 类定义与继承
- for...of 运算符
- 展开操作符
- Promise
- 模块导出和导入
-
IIFE 是立即调用函数表达式
-
symbol 使用场景?
-
在 ES6 中使用展开(spread)语法有什么好处? 它与剩余(rest)语法有什么不同?
-
call、apply、bind 区别?
-
变量提升和函数提升是什么?
-
临时死区?
-
Map 和 weakMap 区别?
-
了解函数柯里化吗?
-
JS 对象的浅拷贝和深拷贝?