JS数据类型

孤街浪徒 提交于 2019-12-15 14:37:58

Number数字类型

包含:常规数字、NaN

NaN

not a number :不是一个数,但它是属于数字类型

NaN和任何值(包括自己)都不相等:NaN!=NaN,所有不能用相等的方式判断是否为有效数字 

isNaN

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

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

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

console.log(isNaN(10)); //=>false;
console.log(isNaN(NaN)); //=>true;

/*

* Number(‘10’) => 10 ;

*isNaN(10); =>false;
*/

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

空字符串会变为数组零

  • Number([val])
  • parseInt/parseFloat([val], [进制]) : 也是转换为数字的方法,对于字符串来说,它是从左到右依次查找有效数字字符,直到遇到非有效数字字符,停止查找(不管后面是否还有数字,都不在找了),把找到的当做数字返回。
  • ==进行比较的时候,可能要出现把其它类型值转换为数字。
console.log(Number('')); //=>0
console.log(Number(true)); //=>1
console.log(Number(false)); //=>0
console.log(Number(null)); //=>0
console.log(Number(undefind)); //=>NaN

//把引用数据类型转换为数字,是先把他基于toString方法转换为字符串,然后在转换为数字

// {}/{xxx:'xxx'}.toString()  =>  "[object object]" =>NaN
console.log(Number({name:'9'})); //=>NaN
console.log(Number({})); //=>NaN

// [].toString() => '' =>0
console.log(Number([])); //=>0
// [12].toString() => '12' =>12
console.log(Number([12])); //=>12
// [12,23].toString() => '12,23' =>NaN
console.log(Number(12,23)); //=>NaN

let str = '20.1px';
console.log(Number(str)); =>NaN
console.log(parseInt(str)); =>20  //整数
console.log(parseFloat(str));=>20.1
console.log(parseFloat(‘width:20.1px'));=>NaN


String字符串数据类型

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

把其它类型值转换为字符串

  • [val].toString()
  • 字符串拼接
let a = 12;
console.log(a.toString()); //=>'12'
console.log((NaN).toString()); //=>'NaN'

//null 和undefined是禁止直接toString的
//(null).toString() //=>报错
//但是和undefined一样转换为字符串的结果就是'null'/'undefined'

//================字符串拼接
//四则运算法则中,除加法之外,其余都是数学计算,只有加法可能存在字符串拼接(一旦遇到字符串,则不是数学运算,而是字符串拼接)
console.log('10'+10); //=>'1010'
console.log('10'-10); //=>0
console.log('10px'-10); //=>NaN

let a = 10 +null +true + [] + undefined + 'XX' +null + [] +10 + false ;
 //  10+ null  -> 10+0->10   10+ true -> 10+1 ->11   11+[] -> 11+' ' ->'11'  空数组变为数字,先要经历变为空字符串,遇到字符串,直接变为字符串拼接

 //'11'+undefined -> '11undefined'
 //  '11undefinedXXnull10false'
    
console.log(a)  //=> '11undefinedXXnull10false'

boolean布尔数据类型

只有两个值 true/false

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

只有0、NaN、’’、null、undefined五个值转换为false,其余都转换为true(而且没有任何的特殊情况)

  • Boolean([val])
  • !/!!
  • 条件判断

!: 取反(先转为布尔,然后取反) !!: 取反再取反,只相当于转化为布尔 <=>Boolean

如果条件只是一个值,不是==/===/!=/>= 等这些比较,是要把这个值先转换为布尔类型,然后验证真假

if(1){

    true

}
if('3px'+3){

    true

}
if('3px'-3){

    false  //=>'3px'-3=>NaN-3=>NaN=>false

}

null/undefined

null和undefined都代表的是没有

  • null: 意料之中(一般都是开始不知道值, 我们手动先设置为null,后期再给予赋值操作)
  • undefined: 意料之外(不是自己能决定的)
  • 创建一个变量没有赋值,默认值是undefined

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

{[key]:[value], …}任何一个对象都是由零到多组键值对(属性名: 属性值)组成的(并且属性名不能重复)

获取属性名对应的属性值

  • =>对象. 属性名
  • =>对象[‘属性名’] 属性名是数字或者字符串格式的
  • 如果当前属性名不存在,默认的属性值是undefined
  • 如果属性名是数字,则不能使用点的方式获取属性值

设置属性属性值

  • 对象. 属性名=属性值 对象[‘属性名’]=‘属性值’ 属性名不能重复,如果属性名已经存在,不属于新增属于修改属性值

删除属性

  • 真删除: 把属性彻底干掉 //delete 对象. 属性名
  • 假删除: 属性还在,值为空 //对象. 属性名=null

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

  • 在中括号中设置的是属性值,它的属性名是默认生成的从0开始递增,而且这个数字代表每一项的位置,我们把其称为“索引”=>从零开始,连续递增,代表每一项位置的数字属性名
  • 天生默认一个属性名length,存储数组的长度# JS中的数据类型检测
  • typeof[val]: 用来检测数据类型的运算符
  • instanceof: 用来检测当前实例是否属于某个类
  • constructor: 基于构造函数检测数据类型(也是基于类的方式)
  • object.prototype.toString.call(): 检测数据类型最好的方法
/*
*基于typeof检测出来的结果

* 1.首先是一个字符串
* 2.字符串中包含对应的类型
* 局限性
* 1.typeof null =>"objecr" 但是null并不是对象
* 2.基于typeof无法细分出当前是普通对象还是数组对象等,因为只要是对象数据类型,返回的结果都是"object"

*/
console.log(typeof 1);  //=>"number"
let a = NaN;
console.log(typeof a);  //=>"number"
console.log(typeof null); //=>"object"
console.log(typeof undefined); //=>"undefined"
console.log(typeof function(){}); //=>"function"
console.log(typeof {}); //=>"object"
console.log(typeof []); //=>"object"
console.log(typeof /^/); //=>"object"

console.log(typeof typeof typeof []);
//=>typeof [] =>"object"
//=>typeof "object" => "string"
//因为typeof检测的结果都是字符串,所以只要两个及以上同时检测,最后结果必然是"string"
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!