【前端⾯试题】JavaScript——数据类型
数据类型
⼀、有哪些数据类型
栈:基本类型:Undefined、Null、Boolean、Number、String
堆:引⽤类型:Array、Object、Function
Symbol和BigInt是ES6新增的数据类型:
Symbol:创建独⼀⽆⼆且不可变的数据类型,主要是为了解决可能出现的全局变量冲突的问题。
BigInt:是⼀种数字类型的数据,可以表⽰任意精度格式的整数。⽤于安全的存储和操作⼤数据。
两种类型的区别在于存储位置不同:
1、原始数据类型存放在栈中,占据空间⼩、⼤⼩固定,被频繁使⽤。
2、引⽤类型存储在堆中的对象,占据空间⼤、⼤⼩不固定,在栈中存储了指针,该指针指向堆中该实体的起始地址。⼆、数据类型检测的⽅式有哪些
1、typeof:object、null、array类型的值都是object,其他类型的都是正确。
console.log(typeof2);// number
console.log(typeof true);// boolean
console.log(typeof'str');// string
console.log(typeof[]);// object
console.log(typeof function(){});// function
console.log(typeof{});// object
console.log(typeof undefined);// undefined
console.log(typeof null);// object
2、instanceof:其内部运⾏机制是判断在其原型链中能否到该类型的原型。(不能检测基本类型,只能检测引⽤类型)//基本类型⽆法检测
console.log(2instanceof Number);// false
console.log(true instanceof Boolean);// false
console.log('str'instanceof String);// false
//引⽤类型可以检测
console.log([]instanceof Array);// true
console.log(function(){}instanceof Function);// true
console.log({}instanceof Object);// true
3、constructor
console.log((2).constructor === Number);// true
console.log((true).constructor === Boolean);// true
console.log(('str').constructor === String);// true
console.log(([]).constructor === Array);// true
console.log((function(){}).constructor === Function);// true
console.log(({}).constructor === Object);// true
4、String.call()
var a = String;
console.log(a.call(2));//[object Number]
console.log(a.call(true));//[object Boolean]
console.log(a.call('str'));//[object String]
console.log(a.call([]));//[object Array]
console.log(a.call(function(){}));//[object Function]
console.log(a.call({}));//[object Object]
console.log(a.call(undefined));//[object Undefined]
console.log(a.call(null));//[object Null]
三、判断数组的⽅式有哪些
1、通过String.call()做判断
var arr =[];
console.log(String.call(arr).slice(8,-1)==='Array');//true
2、通过原型链做判断
var arr =[112,2]
console.log(arr.__proto__ === Array.prototype);//true
3、通过ES6的Array.isArray()做判断
var arr =[112,2]
console.log(Array.isArray(arr));//true
4、通过instanceof做判断
var arr =[112,2]
console.log(arr instanceof Array);//true
5、通过Array.prototype.isPrototypeOf
var arr =[112,2]
console.log(Array.prototype.isPrototypeOf(arr));//true
四、null和undefined的区别
同:都是基本数据类型,都存放在栈中。
异:
1、含义:null是空对象,主要⽤于初始化;undefined是未定义,定义未赋值的变量,值为undefined。
2、保留字:null是保留字不可以作为变量名;undefined不是保留字,可以⽤作变量名,输出不会报错,但是会产⽣冲突。
3、typeof:typeof null === ‘object’;typeof undefined === ‘undefined’。
console.log(null==undefined);//true
console.log(null===undefined);//false
五、为什么0.1+0.2 ! == 0.3,如何让其相等?
console.log(0.1+0.2===0.3)// false 为什么呢?
因为计算机是通过⼆进制的⽅式存储数据的,所以计算0.1+0.2的时候,需要先转化为⼆进制再求和,这其中存在着⼀些精度误差,0.1+0.2=0.30000000000000004。
可以通过四舍五⼊进⾏判断
console.log((0.1+0.2).toFixed(2)==0.3);//true
六、typeof NaN 的结果是什么?
NaN 指“不是⼀个数字”(not a number),NaN 是⼀个“警戒值”(sentinel value,有特殊⽤途的常规值),⽤于指出数字类型中的错误情况,即“执⾏数学运算没有成功,这是失败后返回的结果”。
console.log(typeof NaN);// "number"
console.log(NaN!==NaN)
七、isNaN 和 Number.isNaN 函数的区别?
1、函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此⾮数字值传⼊也会返回true ,会影响 NaN 的判断。
console.log(isNaN(1));//false
console.log(isNaN('1'));//false
console.log(isNaN('a'));//true
console.log(isNaN('a'/2));//true
2、函数 Number.isNaN 会⾸先判断传⼊参数是否为数字,如果是数字再继续判断是否为 NaN ,不会
typeof array进⾏数据类型的转换,这种⽅法对于NaN 的判断更为准确。
console.log(Number.isNaN(1));//false
console.log(Number.isNaN('1'));//false
console.log(Number.isNaN('a'));//false
console.log(Number.isNaN('a'/2));//true
⼋、== 操作符的强制类型转换规则?
对于 == 来说,如果对⽐双⽅的类型不⼀样,就会进⾏类型转换。假如对⽐ x 和 y 是否相同,就会进⾏如下判断流程:
1、⾸先会判断两者类型是否相同,相同的话就⽐较两者的⼤⼩;
2、类型不相同的话,就会进⾏类型转换;
3、会先判断是否在对⽐ null 和 undefined,是的话就会返回 true;
4、判断两者类型是否为 string 和 number,是的话就会将** string 转换为 number**;
5、判断其中⼀⽅是否为 boolean,是的话就会把 boolean 转为 number 再进⾏判断;
6、判断其中⼀⽅是否为 object 且另⼀⽅为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进⾏判断。
九、其他值到字符串的转换规则?
1、Null 和 Undefined 类型 ,null 转换为 “null”,undefined 转换为 “undefined”,
2、Boolean 类型,true 转换为 “true”,false 转换为 “false”。
3、Number 类型的值直接转换,不过那些极⼩和极⼤的数字会使⽤指数形式。
4、Symbol 类型的值直接转换,但是只允许显式强制类型转换,使⽤隐式强制类型转换会产⽣错误。
5、对普通对象来说,除⾮⾃⾏定义 toString() ⽅法,否则会调⽤ toString()(String())来返回内部属性 [[Class]]的值,如"[object Object]"。如果对象有⾃⼰的 toString() ⽅法,字符串化时就会调⽤该⽅法并使⽤其返回值。
obj={}
console.log(String.call(obj));//[object Object]
⼗、其他值到数字值的转换规则?
1、Undefined 类型的值转换为 NaN。
2、Null 类型的值转换为 0。
3、Boolean 类型的值,true 转换为 1,false 转换为 0。
4、String 类型的值转换如同使⽤ Number() 函数进⾏转换,如果包含⾮数字值则转换为 NaN,空字符
串为 0。
5、Symbol 类型的值不能转换为数字,会报错。
6、对象(包括数组)会⾸先被转换为相应的基本类型值,如果返回的是⾮数字的基本类型值,则再遵循以上规则将其强制转换为数字。⼗⼀、其他值到布尔类型的值的转换规则?
以下这些是假值: · undefined · null · false · +0、-0 和 NaN · “”。
假值的布尔强制类型转换结果为 false。从逻辑上说,假值列表以外的都应该是真值。
值转数字转字符串转布尔值undefined NaN“undefined”false null0“null”false
true1“true”
false0“false”
0“0”false
-0“0”false
NaN“NaN”false
Infinity“Infinity”true
-Infinity”-Infinity”true
1(⾮零)“1”true {}(任意对象)见上⽂见上⽂true
[](任意数组)0””true
[9](包含⼀个数字元素)9“9”true
[”a”](其他数组)NaN使⽤.join()⽅法true function(){}(任意函数)NaN见上⽂true
⼗⼆、|| 和 && 操作符的返回值?
⾸先都会转化为boolean值。
||:如果判断结果为true,那就返回第⼀个为真的值;如果判断结果为false,那就返回第⼆个为假的结果。
&&:如果判断结果为true,那就返回第⼆个为真的值;如果判断结果为false,那就返回第⼀个为假的值。
console.log(5&&4);//当结果为真时,返回第⼆个为真的值4
console.log(0&&4);//当结果为假时,返回第⼀个为假的值0
console.log(5||4);//当结果为真时,返回第⼀个为真的值5
console.log(0||0);//当结果为假时,返回第⼆个为假的值0
console.log((3||2)&&(5||0));//5
console.log(!5);//false
⼗三、Object.is() 与⽐较操作符 “=== ” 、“ ==” 的区别?
1、 === :⽐较类型和值,类型不相同直接false。
2、 ==:⾸先判断类型,类型不⼀样先转化成⼀样的类型,然后⽐较值
3、Object.is() :⼀般情况与 === 基本相同,特殊情况⽐如 -0 和 +0 不再相等,两个 NaN 是相等的
Object.is(NaN,NaN);//true
⼗四、什么是 JavaScript 中的包装类型?
基本类型->包装类型:Object
var a ='abc'
Object(a)// String {"abc"}
包装类型->基本类型:valueOf
var a ='abc'
var b =Object(a)
var c = b.valueOf()// 'abc'
在 JavaScript 中,基本类型是没有属性和⽅法的,但是为了便于操作基本类型的值,在调⽤基本类型的属性或⽅法时 JavaScript 会在后台隐式地将基本类型的值转换为对象。
var str ='123';
console.log(str.length);//3
'123' -> String('123') -> String('123').length
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论