• 前端面试:js数据类型


    js数据类型是js中的基础知识点,也是前端面试中一定会被考察的内容。本文旨在知识的梳理和总结,希望读者通过阅读本文,能够对这一块知识有更清晰的认识。文中如果出现错误,请在评论区指出,谢谢。

    js数据类型都有什么?

    答:js数据类型一共有7种,两大类:原始类型,引用类型(对象)
    原始类型包括:boolean, null,undefined,number,string,symbol


    为什么1.toString会报错?

    答:js中点有两种,小数点和访问对象属性的点,如果一个表达式中有两个以上的点,那么第二个及后面的点会被js引擎当作是访问对象属性的点。而第一个点会有两种情况,js引擎在解读以数字开头的第一个点时,会被当成小数点进行处理,而'toString()’会被作为一个不合法的浮点数来解释,所以报错。
    而1.2.toString()则不会报错。


    symbol是什么数据类型?

    答:原始数据类型。symbol是ES6引入的一种新的原始数据类型,表示独一无二的值。symbol值由Symbol函数生成。


    为什么0.1+0.2 !== 0.3?

    答:我们在控制台中打印0.1+0.2的时候,可以看到结果为0.30000000000000004。而不是0.3。这是因为在计算机中,数字无论是定点数还是浮点数都是以二进制的方式进行存储的。而0.1和0.2转换成二进制后会无限循环,JavaScript使用Number类型表示数字,遵循IEEE754标准。在进行运算时,先转换二进制,由于IEEE754尾数位数限制,多余部分舍弃,这样在进制之间的转换中进度已经损失,由于指数位数不相同,运算时需要对接运算,也可能产生精度损失,所以计算结果出现偏差。解决问题的最常用的方法就是将浮点数转化为整数计算。


    null是对象类型么?

    答:null是原始数据类型,虽然typeof null === ‘object’,但是这是js的一个历史遗留Bug。


    说一说对象类型和原始类型的不同

    答:对象类型,也叫做引用类型。与原始类型不同的是,对象类型是在计算机内存中帮我们开辟一个空间来存放值,这个空间会有一个地址(指针)。例如:

    const a = []
    

    对于常量a来说,假设内存地址为#001,那么在地址#001的位置存放了值[],常量a存放了地址#001,所以

    const a = {}
    b  = a
    b[‘key’] = ‘value'
    console.log(a[‘key'])    //‘value'
    

    当我们给变量b赋值的时候,是将a存放的内存地址(指针)复制给了b。所以a和b指向了同一个内存空间,这样当内存空间存放的值放生了变化时,a和b同时被影响。


    请说明p1,p2的值

    function test(person){ 
        person.age =26
        person = {
                    name:'yyy’,
                    age:30
                 }
        return person 
    }
    const p1 = {
                 name:'yck’,
                 age:25
               }
    const p2 = test(p1)
    console.log(p1)// -> ?
    console.log(p2)// -> ?
    

    答:
    p1->{name: "yck", age: 26}
    p2 ->{name: "yyy", age: 30}

    函数传参是传递对象指针的副本,到函数内部修改参数的属性这步,当前的p1值也被修改了,但是放我们重新为person分配了一个对象时,person拥有了一个新的地址,也就和p1没有任何关系了。


    说一下js类型判断的方法

    1.typeof 对于原始类型来说,除了null都可以显示正确类型(null->object)
    2.typeof 对于对象来说,除了函数都会显示object(function -> function)
    3.instanceof 可以判断某个变量是否是每个对象的实例。
    4.比较理想的方法是 Object.prototype.toString.call(variable)


    如何判断一个对象是空对象

    1.Object.keys({}).length === 0
    2.JSON.stringify({}) === ‘{}'


    类型转换

    转布尔值

    1.在条件判断时,除了undefined, null,false,NaN,’’,0,-0,其他所有值都转化为true,包括空对象

    对象转原始类型顺序

    1.判断是否为原始类型,如果不是,继续下一步
    2.调用x.valueOf(),如果转换为基础类型就返回转换的值,如果没有,继续下一步
    3.调用x.toString(),如果转换为基础类型就返回转换的值,如果没有,继续下一步
    4.报错

    四则运算中的类型转换

    1.加法运算,如果一方为字符串或者引用类型,那么会转换为字符串进行运算
    2.加法运算,如果一方为布尔类型,那么会转换为数字进行计算(引用类型,字符串除外)。
    3.加法运算,undefined与任何值相加,值都为NaN(字符串,引用类型相加除外)
    4.加法运算,如果一方为null, 那么会转化为数字进行运算,null值为0(字符串,引用类型相加除外)
    5.加法运算,如果一方为数字, 那么会转化为数字进行运算(字符串,引用类型相加除外)


    == 和===的区别

    == 当比较的两者类型不同时会进行类型转换,

    - 1==‘1’ //true 此情景 string转number
    - null == undefined //true 如果仅需要过滤掉null, undefined 两种属性时可以利用此特性
    - [] == ! [] //true 因为对象转基本类型后做比较 false == fase 0 == 0
    - [] == ![] //true
    - [] == false //true
    - '' == false //true
    - '' == Number(false) //true
    - '' == 0 //true
    - Number('') == 0 //true
    - 0 == 0 //true
    
  • 相关阅读:
    NOIP 2012 文化之旅
    史上最全的各种C++ STL容器全解析
    详解C++ STL map 容器
    详解C++ STL priority_queue 容器
    浅谈C++ STL stack 容器
    浅谈C++ STL queue 容器
    浅谈C++ STL vector 容器
    CF1185F Two Pizzas
    浅谈C++ STL deque 容器
    详解C++ STL multiset 容器
  • 原文地址:https://www.cnblogs.com/yxqd/p/10478709.html
Copyright © 2020-2023  润新知