概述
变量和类型
1.JavaScript规定了几种语言类型
八种:undefined:未定义,number:数字,string:字符串,boolean:布尔值,null:空值,symbol:独一无二的值(最大的用法是用来定义对象的唯一属性名),bigInt:大整数,object:对象,包含function,array,date等,属于引用类型
2.JavaScript对象的底层数据结构是什么
JavaScript基本类型数据都是直接按值存储在栈中的(Undefined、Null、不是new出来的布尔、数字和字符串),每种类型的数据占用的内存空间的大小是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对于堆来说 ,更加容易管理内存空间。
JavaScript引用类型数据被存储于堆中 (如对象、数组、函数等,它们是通过拷贝和new出来的)。其实,说存储于堆中,也不太准确,因为,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,在通过地址指针找到堆中的所需要的数据。
3.Symbol类型在实际开发中的应用、手动实现一个简单的Symbol
参考:https://juejin.cn/post/6846687598249771022#heading-3
应用场景 1-使用Symbol来作为对象属性名(key)
应用场景 2:使用 Symbol 定义类的私有属性/方法
应用场景 3-模块化机制
应用场景 4-使用Symbol来替代常量
应用场景 5-注册和获取全局的`Symbol
手动实现Symbol
javascript - ES6 系列之模拟实现 Symbol 类型_个人文章 - SegmentFault 思否
4.JavaScript中的变量在内存中的具体存储形式
同2
5.基本类型对应的内置对象,以及他们之间的装箱拆箱操作
内置对象 :javascript - JS所有内置对象属性和方法汇总_个人文章 - SegmentFault 思否
装箱拆箱:javascript数据类型及装箱拆箱介绍_个人文章 - SegmentFault 思否
6.理解值类型和引用类型
值类型也称为原始数据或原始值(primitive value).这类值存储在栈(stack)内存中, 基本类型的值不可以修改。每当我们定义一个变量,并赋给它一个基本类型的值时,可以理解为,我们为这个变量绑定了一个内存空间,这个内存空间存放的就是变量的值。因此。基本类型数据是存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。
引用类型存储在堆内存中,堆是内存中的动态区域,相当于自留空间,在程序运行期间会动态分配给代码和堆栈。对中存储的一般都是对象,然后在栈内存中存储一个变量指针,计算机通过这个变量指针,找到堆中的数据块并进行操作。这种访问方式,我们叫它按引用访问。
为什么会有栈内存和堆内存之分?
与垃圾回收机制有关,为了使程序运行时占用的内存最小。
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;
当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复理由(因为对象的创建成本通常比较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。
7.null和undefined的区别
null 表示一个值被定义了,定义为“空值”;
undefined 表示根本不存在定义。
它们出现的情景也各不相同,具体总结如下:
null:即表示为空,没有对象。
作为函数的参数,表示该函数的参数不是对象。
作为对象原型链的终点。
undefined:表示缺少值,此处应该有值,但未定义。
变量被声明了,但没有值,此时为undefined
调用函数时,应该提供的参数没有提供,此时为undefined
对象没有赋值的属性,此属性值为undefined
函数没有返回值,默认返回undefined
null与undefined的区别主要体现在一下三点:
- 值相等而类型不相等
- 数字运算不相同
- 具体操作方法不一样
typeof null // "object" (因为一些以前的原因而不是'null')
typeof undefined // "undefined"
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null //true
isNaN(1 + null) // false
isNaN(1 + undefined) // true
8.至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型
1、typeof 直接返回数据类型字段,但是无法判断数组、null、对象,其中 null, [], {}都返回 "object"
2、instanceof 判断某个实例是不是属于原型,可以检测array,object但是不能检测基本类型的数据也包括null也不可以
3、constructor 不能判断undefined和null,并且使用它是不安全的,因为contructor的指向是可以改变的
4、判断数据的最终的完美解决方案(Object.prototype.toString.call())
5、用Array对象的isArray方法判断数组类型
9.可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用
JavaScript 的怪癖 1:隐式类型转换 | justjavac(迷渡)
要避免这种隐式的类型转换,应该采用"==="和"!=="运算符。
10.出现小数精度丢失的原因,JavaScript可以存储的最大数字、最大安全数字,JavaScript处理大数字的方法、避免精度丢失的方法
原因是js number类型运算都需要先将十进制转二进制,但小数点后的位数转二进制会出现无限循环的问题,只能舍0入1,所以会出现小数点丢失问题,方法:可以通过先乘10的倍数,然后再除
比如 我要保留两位小数 那我就乘100,运算完后再除100
能够表示的最大数字Number.MAX_VALUE等于1.7976931348623157e+308,最大安全数字Number.MAX_SAFE_INTEGER等于2^53-1
最后
以上就是粗犷小懒虫为你收集整理的JavaScript基础(一)的全部内容,希望文章能够帮你解决JavaScript基础(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复