javascript变量和类型10问及自我理解
-
javascript 规定了几种语言类型?
javascript规定了7种语言类型 Undefined; Null;Boolean;String;Number;Symbol;Object.
undefined类型表示未定义,任何变量未赋值时,值都为undefined;undefined是一个变量。
void(express):void 运算符能执行express,不论如何,一律返还undefined
null 只是一个值,表示空值,null是关键字。
String是用UTF16进行编码的
Number中NaN表示非数,Infinity 表示无穷大,-Infinity表示负无穷大。IEEE754规定了双精度浮点数规则。
0.1+0.2不等于0.3,是因为计算机进行计算时先转化成二进制,二浮点数用二进制表示时是无穷位的,IEEE754标准中会截断后面的位数,再转化成十进制,就有了误差。
Symbol表示独一无二的值,Symbol值生成:let s=Symbol();,对象的属性名类型为字符串或者Symbol类 型
-
javascript对象底层数据结构是什么?
javascript对象可以看做是属性的无序集合,每个属性就是一个键值对,可增可减。
javascript中所有事物都是对象。
javascript对象除了可以保持自有属性外,还可以从一个称为原型的对象继承属性。
javascript是单线程的工作模式。但也是同步异步机制,解决cpu等待状态浪费大量资源。
js是单线程的,但js的宿主环境比如浏览器是多线程的。js只有一个主线程,来执行任务(函数),一次只能执行一个任务。但一些任务比如网络请求,定时器,事件监听会让浏览器开辟另外的线程来完成任务,这就是异步。任务完成后通过回调函数告诉主线程,并进入主线程任务队列。可以利用定时器和事件来触发线程。
-
Symbol类型在实际开发中的应用,手动实现一个简单的Symbol。
Symbol应用场景1:使用Symbol来作为对象的属性名(这一特点让‘对内操作’和‘对外选择性输出’变得更加优雅。)
const notsee=Symbol();//产生的值是唯一的 let obj={ [notsee]:'对外保密属性', age:18 } for(let x in obj){ console.log(x)//只输出‘age’ }
Symbol应用场景2:使用Symbol来代替常量。(常量多的时候,不用一个个取名字)
Symbol应用场景3:使用Symbol来定义私有属性方法。(使类中的属性方法,无法在外部访问到)
let gs=Symbol.for();//注册一个全局Symbol,这样创建的在多个window里都是唯一的
-
javascript中变量在内存中的具体存储形式?
变量分为两种类型:基本类型和引用类型。两种类型的存储方式也是不一样的。
对于基本类型:变量名存储在内存的栈区,变量值也存储在栈区。
对于引用类型来说:变量标识也存放在栈区,对象存储在堆区,而对象的地址存储在栈区。
-
javascript基本类型对应的内置对象,以及他们的装箱和拆箱操作?
javascript有5种基本类型:Number, String, Boolean, Undefined,Null. 新增Symbol
还有1种复杂数据类型:object
引用类型:object, array, function
装箱:就是把基本的数据类型转化为对应的引用类型对象。
隐式装箱:
num.toFixed(2); //后台把基本数据类型转化为对象 var c=new Number(123); c.toFixed(2); c=null;
显示装箱:
var obj=new String('123');
拆箱:把引用类型对象转化为基本类型,它是通过引用类型的valueOf()或者toString()方法来实现的。
var objNum=new Number(123); console.log(objNum.valueOf())
-
理解值类型和引用类型?
值类型:
- 占用空间固定,保存在栈中
- 保存和复制的是本身
- 使用typeof检测数据类型
- 基本类型数据是值类型
引用类型:
- 占用空间不固定,保存在堆中
- 保存和复制的是指向对象的一个指针
- 使用instanceof 检测数据类型
- 使用new()方法构造出的对象是引用型
-
null he undefined的区别?
undefined类型表示未定义,任何变量未赋值时,值都为undefined;undefined是一个变量。
void(express):void 运算符能执行express,不论如何,一律返还undefined
null 只是一个值,表示空值,null是关键字。
-
至少可以说出三种判断javascript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型?
-
typeof()判断数据类型,该类型是值类型
typeof(1) //number typeof('1')//string
-
instanceof()判断数据类型,该类型是引用类型
var obj={}; obj instanceof Object; //True var arr=[]; arr instanceof Array; //True var func=function(){}; func instanceof Function; //True
-
Object.prototype.toString.call()可以判断数据类型,可以是值类型或者引用类型
var num1=1; Object.prototype.toString.call(num1)=='[object Number]';//true var arr=[]; Object.prototype.toString.call(arr)=='[object Array]';//true
-
-
可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用?
发生隐式转换主要分三种:
-
转换为boolean类型
数据在逻辑判断和逻辑运算中会发生隐式转换为boolean类型
数据类型 转化后的值 数字0 false NaN false 空字符 false null false undefined false 非0数字 true 非空字符串 true 非空null对象 true -
转换为number类型
-
转化为string类型
把这两个放一起讲:先说运行环境对小护具类型的隐式转换影响:
很多函数需要传入value为string类型,如果我们传入number类型或非string类型时就会隐式转换
操作符也会影响数据的类型转换:
+作为一元运算符是会将数转化为数字类型
+作为二元运算符时,如果存在字符串,另一个也会转化为字符串;如果都不是字符串则会都转化为数(法转化成数字则为NaN)
原始数据类型 转换之后的值 数字类型 数字类型的字符表示 字符串 不做任何改变 null ‘null’ undefined ‘undefined’ 布尔类型 true变’true’,false变’false 原始数据类型 转换后值 数字类型 不变 空字符串 0 非空字符串 将字符串的数据变为数据,如果还有其他符号则为NAN true 1 false 0 null 0 undefined NaN NaN NaN -
复杂对象转换为简单值
会调用ToPrimitive(hint)方法,一般会调用对象的valueOf()或toString()方法
-
-
出现小数精度丢失的原因,javascript、可以存储的最大数字,最安全数字,javascript处理大数字的方法,避免精度丢失的方法?
0.1+0.2不等于0.3,是因为计算机进行计算时先转化成二进制,二浮点数用二进制表示时是无穷位的,IEEE754标准中用64位表示(1位用来表示符号位,11用来表示指数,52位表示尾数)会截断后面的位数,再转化成十进制,就有了误差。
最大数字:
对于整数,前端出现问题的几率可能比较低,毕竟很少有业务需要需要用到超大整数,只要运算结果不超过 Math.pow(2, 53) 就不会丢失精度。
对于小数,前端出现问题的几率还是很多的,尤其在一些电商网站涉及到金额等数据。解决方式:把小数放到位整数(乘倍数),再缩小回原来倍数(除倍数)
最安全的数字-Math.pow(2, 53)-1,到+Math.pow(2, 53)-1