一、2019oppo前端一面
-
JS中的数据类型:
(1)五种基本数据类型: a) String 字符串类型 b) Boolean 布尔类型 c) Number 表示整数和浮点类型 d) undefined 声明了变量但未初始化 e) null 空对象指针,也是对空对象的引用 (2)一种复杂数据类型 Object 是一组属性与方法的集合,属于引用类型。引用类型是一种数据结构。也就是说,JS按照存储方式分为值类型和引用类型。 JS中三大引用类型: Object类型 Array类型 function类型 (3)es6新增的Symbol数据类型 用于防止属性名冲突而产生的数据类型
-
原始值和引用值的区别
原始值------存储在栈(stack)中得简单数据段,也就是说它们的值直接存储在变量访问的位置;基本数据类型按值访问,因此直接操作保存在变量中的实际值。 引用值------以对象形式存储在堆(heap)中,也就是说,存储在变量中的是一个指向内存的指针。由于引用值的大小会改变,所以不能存储在栈中,否则会降低变量查询的速度。存放在栈空间的变量的值是该对象存储在堆中的地址,地址的大小是固定的,所以把他存储在栈中对变量性能无任何负面影响。 堆和栈的区别(补充): 栈(stack)----- 由操作系统自动分配内存空间,自动释放,存储的是基础变量以及一些对象的引用变量,占据固定大小的空间。 基础变量的值是存储在栈中,而引用变量存储在栈中的是指向堆中的数组或者对象的地址,这就是为何修改引用类型总会影响到其他指向这个地址的引用变量。 优点:相比于堆来说存取速度会快,并且栈内存中的数据是可以共享的,例如同时声明了var a = 1和var b = 1,会先处理a,然后在栈中查找有没有值为1的地址,如果没有就开辟一个值为1的地址,然后a指向这个地址,当处理b时,因为值为1的地址已经开辟好了,所以b也会同样指向同一个地址。 缺点:相比于堆来说的缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 堆(heap)-----由操作系统动态分配的内存,大小不定也不会自动释放,一般由程序员分配释放,也可由垃圾回收机制回收。 堆内存中的对象不会随方法的结束而销毁,就算方法结束了,这个对象也可能会被其他引用变量所引用(参数传递)。创建对象是为了反复利用(因为对象的创建成本通常较大),这个对象将被保存到运行时数据区(也就是堆内存)。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。
-
如何判断一个数组的类型
(1)ES5新增的数组方法,Array.isArray(),在支持ES5的浏览器中,没什么问题,但是如果是在IE9以下版本,这个方法并未受到支持.
(2)arr instanceof Array,一般来说,instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上,是用来判断某个元素是否某对象构造函数实例。在数组判断上,typeof不能区分数组,但instanceof关键字可以进行数组的判定。
(3)toString,对象的toString方式也可以判定数组类型,一般来说这种方式的判定是各大库的一种Array.isArray的代替实现。
例如,polyfill中,就是如此实现
补充(因为我不知道polyfill是什么。。。。):
Polyfill 是一块代码(通常是 Web 上的 JavaScript),用来为旧浏览器提供它没有原生支持的较新的功能。比如说 polyfill 可以让 IE7 使用 Silverlight 插件来模拟 HTML Canvas 元素的功能,或模拟 CSS 实现 rem 单位的支持,或 text-shadow,或其他任何你想要的功能。
https://developer.mozilla.org/zh-CN/docs/Glossary/Polyfill
if (!Array.isArray) {
Array.isArray = function(arg) {
return