【准备面试】- JS - 数据类型

内置类型

JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型和对象(Object)。 基本类型有六种: null,undefined,boolean,number,string,symbol。

Typeof

typeof 对于基本类型,除了 null 均可以显示正确的类型数组


000 开头表明是对象,然而 null 表示 为全零,因此将它错误的判断为 object 。
bash

instanceof 和 Object.prototype.toString.call

typeof 没法判断数组,对象.spa


能够经过 Object.prototype.toString. call(xx)。这样咱们就能够得到相似 [Object Type] 的字符串。
prototype

instanceof 能够正确的判断对象的类型,由于内部机制是经过判断对象的原型链 中是否是能找到类型的 prototype。
code

类型转换

ToString负责处理非字符串到字符串的强制类型转换cdn

null转换为'null',undefined转换为'undefined',其余基本类型都调用基本类型的包装对象属性toString()并返回值。对象

const a = 123; 
const _a = new Number(123); 
console.log(String(a), _a.toString());               //'123' '123' 复制代码

数字的字符串化遵循通用规则,可是极小极大数字使用指数形式blog

const a = 1.07*1000*1000*1000*1000*1000*1000*1000;
console.log(String(a));                               //'1.07e+21'复制代码

对于普通对象来讲,除非自行定义,不然toString()返回Object.prototype.toString()的值,其余对象有本身的toString()方法则调用本身的该方法.原型链

const b = {};
console.log(String(b));                                //[object object]复制代码

对于数组来讲会转成以“,”拼接各项的字符串字符串

const arr = [{s:1},2,3]
console.log(arr.toString())                           //"[object Object],2,3"复制代码

ToNumber负责处理非数字到数字的强制类型转换

true转换为1,false转换为0,undefined转换为NaN,null转换为0

console.log(Number(null));                                //0 
console.log(Number(undefined));                           //NaN
console.log(Number(true));                                //1
console.log(Number(false));                               //0复制代码

对字符串的处理遵循数字常量的相关规定/语法,处理失败时返回NaN

console.log(Number('123'));                               //123
console.log(Number('0b111'));                             //7
console.log(Number('0o123'));                             //83
console.log(Number('0x123'));                             //291
console.log(Number('123a'));                              //NaN
console.log(Number('a123'));                              //NaN

复制代码
对象(包括数组)会首先按照ToPrimitive抽象操做被转换为相应的基本类型值,再按照前两条规则处理;若是某个对象即不存在valueOf方法也不存在toString方法,则会产生TypeError错误(例如Object.create(null)不存在以上两种方法)

const arr = [1, 2, 3]; 
console.log(Number(arr));                               //NaN
console.log(Number(arr.toString()));                    //NaN

const num = new Number(123);
console.log(Number(num));                               //123
console.log(Number(num.valueOf()));                     //123

const bool = new Boolean(true);
console.log(bool.valueOf());                           //true
console.log(Number(bool));                             //1
console.log(Number(bool.valueOf()));                   //1

const obj1 = {
  toString:()=>"21"
}

const obj2 = {
  valueOf:()=>"42",
  toString:()=>"21"
}

const obj3 = {
  a:1
}
console.log(Number(obj1));                              //21
console.log(Number(obj2));                              //42
console.log(obj3.toString());                           //[object Object]
console.log(Number(obj3));                              //NaN


const obj = Object.create(null);
console.log(Number(obj));                               //TypeError
复制代码

ToBoolean负责处理非布尔值到布尔值的强制类型转换,规则以下

能够被转换为false的值(undefined,null,false, 0和NaN,'')

其余都被转换为true(切记:封装对象均被转为true)

隐式强制类型转换

隐式强制类型转换为字符串

一元运算符加号(+)首先把非基本类型经过ToPrimitive抽象操做转换为基本类型,若是加号中的两项有一项是字符串,另外一项则进行ToString操做,进行字符串拼接,若是是布尔值加数字,则对布尔进行ToNumber操做再求和

隐式强制类型转换为数字,经过一元运算符-、/、*转换,遵循ToNumber的抽象值操做规则

隐式强制类型转换为布尔值

if(..)语句中的条件判断表达式

for(..;..;..)语句的第二个条件判断表达式

while(..)和do..while(..)的条件判断表达式

?:中的条件判断表达式

逻辑运算符||和&&左边的操做数(a||b等同于a?a:b,a&&b等同于a?b:a)

相关文章
相关标签/搜索