javascript变量和类型10问及自我理解

javascript变量和类型10问及自我理解

  1. 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类 型

  2. javascript对象底层数据结构是什么?

    javascript对象可以看做是属性的无序集合,每个属性就是一个键值对,可增可减。

    javascript中所有事物都是对象。

    javascript对象除了可以保持自有属性外,还可以从一个称为原型的对象继承属性。

    javascript是单线程的工作模式。但也是同步异步机制,解决cpu等待状态浪费大量资源。

    js是单线程的,但js的宿主环境比如浏览器是多线程的。js只有一个主线程,来执行任务(函数),一次只能执行一个任务。但一些任务比如网络请求,定时器,事件监听会让浏览器开辟另外的线程来完成任务,这就是异步。任务完成后通过回调函数告诉主线程,并进入主线程任务队列。可以利用定时器和事件来触发线程。

  3. 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里都是唯一的
    
    
  4. javascript中变量在内存中的具体存储形式?

    变量分为两种类型:基本类型和引用类型。两种类型的存储方式也是不一样的。

    对于基本类型:变量名存储在内存的栈区,变量值也存储在栈区。

    对于引用类型来说:变量标识也存放在栈区,对象存储在堆区,而对象的地址存储在栈区。

  5. 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())
    
  6. 理解值类型和引用类型?

    值类型:

    1. 占用空间固定,保存在栈中
    2. 保存和复制的是本身
    3. 使用typeof检测数据类型
    4. 基本类型数据是值类型

    引用类型:

    1. 占用空间不固定,保存在堆中
    2. 保存和复制的是指向对象的一个指针
    3. 使用instanceof 检测数据类型
    4. 使用new()方法构造出的对象是引用型
  7. null he undefined的区别?

    undefined类型表示未定义,任何变量未赋值时,值都为undefined;undefined是一个变量。

    void(express):void 运算符能执行express,不论如何,一律返还undefined

    null 只是一个值,表示空值,null是关键字。

  8. 至少可以说出三种判断javascript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型?

    1. typeof()判断数据类型,该类型是值类型

      typeof(1)   //number
      typeof('1')//string
      
    2. instanceof()判断数据类型,该类型是引用类型

      var obj={};
      obj instanceof Object;   //True
      
      var arr=[];
      arr instanceof Array; //True
      
      var func=function(){};
      func instanceof Function; //True
      
      
    3. 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
      
      
  9. 可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用?

    发生隐式转换主要分三种:

    1. 转换为boolean类型

      数据在逻辑判断和逻辑运算中会发生隐式转换为boolean类型

      数据类型转化后的值
      数字0false
      NaNfalse
      空字符false
      nullfalse
      undefinedfalse
      非0数字true
      非空字符串true
      非空null对象true
    2. 转换为number类型

    3. 转化为string类型

      把这两个放一起讲:先说运行环境对小护具类型的隐式转换影响:

      很多函数需要传入value为string类型,如果我们传入number类型或非string类型时就会隐式转换

      操作符也会影响数据的类型转换:

      +作为一元运算符是会将数转化为数字类型

      +作为二元运算符时,如果存在字符串,另一个也会转化为字符串;如果都不是字符串则会都转化为数(法转化成数字则为NaN)

      原始数据类型转换之后的值
      数字类型数字类型的字符表示
      字符串不做任何改变
      null‘null’
      undefined‘undefined’
      布尔类型true变’true’,false变’false
      原始数据类型转换后值
      数字类型不变
      空字符串0
      非空字符串将字符串的数据变为数据,如果还有其他符号则为NAN
      true1
      false0
      null0
      undefinedNaN
      NaNNaN
    4. 复杂对象转换为简单值

      会调用ToPrimitive(hint)方法,一般会调用对象的valueOf()或toString()方法

  10. 出现小数精度丢失的原因,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值