JS之各大数据类型之间的相互转换(除function)

145 阅读5分钟

number 数字类型

包含: 常规数字、NaN

NaN

not a Number: 不是一个数,但它率属于数字类型 NaN 和任何值(包括自己)都不相等: NaN!=NaN ,所有我们不能用相等的方式判断是否为有效数字

  • == 进行比较的
console.log('AA' == NaN); // false
console.log(1 == NaN); // false
console.log(NaN == NaN); // false

isNaN

检测一个值是否为非有效数字,如果不是有效数字返回TRUE, 反之是有效数字返回FALSE

  • isNan([val])
console.log(isNaN(10)); //=> false
console.log(isNaN('AA')); //=> true
console.log(isNaN('10')); //=> false

在使用isNaN进行检测的时候,首先会验证检测的值是否为数字类型,如果不是,先基于Number()这个方法,把值转换为数字类型,然后再检测

console.log(isNaN('10')); //=> false
// 解析:
Number('10') //=> 10
isNaN(10)  //=> false

console.log('AA' == NaN); // false
Number('AA') //=> NaN
isNaN(NaN) //=> true

把其他类型值转换为数字类型

  • Number([val])
    • 把字符串转为数字,只要字符串包含任意一个非有效数字字符(第一个点除外) 结果都是NaN, 空字符串会变为数字零
    • 布尔转为数字, true转换为1 false转换为0
    • 把空转换为数字:null转换为0 undefined转换为NaN
    • 对象转换为数字:先基于toString()方法把对象转换为字符串,再把字符串转为数字
console.log(Number('12.5')); //=>12.5
console.log(Number('12px')); //=>NaN
console.log(Number('')); //=>0

console.log(Number(true)); //=>1
console.log(Number(false)); //=>0

console.log(isNan(false)); //=> false

console.log(Number(null)); //=> 0
console.log(Number(undefined)); //=> NaN

console.log(Number({name: '10'})) //=>NaN
console.log(Number({})) //=>NaN
// {}/{xxx: 'xxx'}.toString() => "[object Object]" => NaN
console.log(Number([])) //=>0
// [].tostring() => '' =>0
console.log(Number([12])) //=>12
// [].tostring() => '12' => 12
console.log(Number([12,23])) //=>NaN
// [12,23].tostring() => '12,23' => NaN
let str = '12.5px';
console.log(Number(str)) //=>NaN
console.log(parseInt(str)) //=>12
console.log(parseFloat(str)) //=>12.5
console.log(parseFloat('width:12.5px')) //=>NaN

  • parseInt/parseFloat([val],[进制]): 也是转为数字的方法,对于字符串来说,它是从左到右依次查找有效数字字符,直到遇到非有效数字字符,停止查找(不管后边是否还有数字,都不再找了),把找到的当做数字返回
    处理原理和Number不一样,他们是把字符串转换为数字类型(如果处理的值不是字符串,需要先转换为字符串然后在去转换为number类型的)
  • == 两个等号比较,可能要出现把其他类型值转换为数字

string 字符串数据类型

所有用单引号,双引号,反引号(撇ES6模板字符串)包起来的都是字符串

把其他类性质转换为字符串

null 和 undefined 是禁止直接toString的,但是null和undefined一样转换为字符串的结果是'null'/'undefined', 普通对象.toString()的结果是"[object, Object]" ? => Object.prototype.toString方法不是转换为字符串的,而是用来检测数据类型的

  • [val].toString()
  • 字符串拼接
console.log(12.toString()) //=>会报语法错误

let a = 12;
console.log(a.toString()) //=> '12'
console.log((NaN).toString()) //=> 'NaN'
console.log((null).toString()) //=> 报错
console.log([].toString()) //=>""
console.log([12].toString()) //=>"12"

字符串拼接

四则运用法则中,除加法之外,其余都是数学计算,只有加法可能存在字符串拼接(一旦遇到字符串,则不是数学运算,而是字符串拼接)

console.log('10'+10); //=>'1010'
console.log('10'-10); //=>0
console.log('10px'+10); //=>NaN

let a = 10 + null + true + [] + undefined + '珠峰' + null + [] + 10 + false
// 10 + 0 + 1 + '' + 'undefined' + '珠峰' + 'null' + '' + 10 + 'false'
//11undefined珠峰null10false
console.log(a);  //=> 11undefined珠峰null10false

boolean布尔数据类型

只有两个值 true/false

把其他类型值转换为布尔类型

只有 0、NaN、''、 null、undefined 五个之转换为FALSE,其余都转为TRUE(而且没有特殊情况)

  • Boolean([val])
  • !/!! !:取反(先转为布尔,然后再取反) !!:取反再取反,只相当于转为布尔类型<=>Boolean
  • 条件判断,如果提交还是一个值,不是 == /===/!=/>=等这些比较,是要把这个值先转为布尔类型,然后验证真假
console.log(Boolean(0)); //=>false
console.log(Boolean('')); //=>false
console.log(Boolean(' ')); //=>true
console.log(Boolean(null)); //=>false
console.log(Boolean(undefined)); //=>false
console.log(Boolean([])); //=>true
console.log(Boolean([12])); //=>true
console.log(Boolean(-1)); //=>true

if(1){
    console.log('呵呵')
}
if('12px'+3){
    console.log('哈哈')
}
if('12px'-3){
// NaN-3 => false
    console.log('嘿嘿')
}

// '呵呵'
// '哈哈'

null / undefined

null和undefined都代表没有

  • null 意料之中 (一般都是开始不知道值,我们手动先设置为null,后期再给予赋值操作)
let num = null; //=> let num = 0; //一般最好用null作为初始值的空值,因为零不是空值,她在栈内存中有自己的存储空间(占了位置)
num = 12
  • undefined: 意料之外 (不是我们能决定的)
let num; //=>创建一个变量没有赋值,默认值是undefined
...
num = 12

object 对象数据类型-普通对象

{[key]:[value],...} 任何一个对象都是由零到多组键值对(属性名:属性值)组成的(并且属性名不能重复),属性名是数字或者字符串格式的

  • 获取属性名对应的属性值
    • 对象名.属性
    • 如果当前对姓名不存在,默认的属性值是undefined
    • 如果属性名是数字,则不能使用点的方式获取属性值
  • 设置属性名属性值
    • 属性名不能重复,如果属性名已经存在,不属于新增属于修改属性
  • 删除属性
    • 真删除: 把属性彻底删掉
    • 假删除: 属性值还在,值为空
let person = {
    name : '张三',
    age: 40,
    height: '185CM',
    weight: '80KG',
    1: 100
}

console.log(person.name);
console.log(person['age']);
console.log(person.sex);  //=>undefined
console.log(person[1]);   //=> 100
console.log(person.1);    //=> 会报语法错误

// 设置属性名属性值
person.GF = '李四';
person.name = '李易峰';
console.log(person['GF']);
console.log(person['name']); //=>李易峰

// 删除
delete person[1]  //=>真删除

person.weight = null //=>假删除

数组是特殊的对象数据类型

  • 中括号中设置的是属性值,它的属性名是默认生成的数字,从零开始递增,而且这个数字代表每一项的位置,我们把其称为"索引" => 从零开始,连续递增,代表每一项位置的数字是属性名
  • 天生默认一个属性名 length, 存储数组的长度
let ary = [12, '哈哈', true, 13];

console.log(ary['length']);
console.log(ary.length);
console.lgo(ary[0]);
console.lgo(ary[ary.length-1]); //最后一项
ary[ary.length] = 100