基本数据类型

内置类型

JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型和对象(Object)。 基本类型有六种: nullundefinedbooleannumberstringsymbol

Typeof

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

000 开头代表是对象,然而 null 表示 为全零,所以将它错误的判断为 object 。

instanceof 和 Object.prototype.toString.call

typeof 无法判断数组,对象.
可以通过Object.prototype.toString.call(xx)。这样我们就可以获得类似 [Object Type] 的字符串。
instanceof 可以正确的判断对象的类型,因为内部机制是通过判断对象的原型链 中是不是能找到类型的 prototype

类型转换

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

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

const a = 123; 
const _a = new Number(123); 
console.log(String(a), _a.toString());               //'123' '123' 
数字的字符串化遵循通用规则,但是极小极大数字使用指数形式
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的值(undefinednullfalse0NaN,’’)

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

隐式强制类型转换

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

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

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

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

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

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

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

?:中的条件判断表达式

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


   转载规则


《基本数据类型》 abnerLiu 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录