javascript之数据类型

132 阅读6分钟

数据类型

  • 基本数据类型

    • Number 常规数字、NaN|

    • String 所有用单引号、双引号、反引号包起来的都是字符串|

    • Boolean true/false|

    • null 空指针对象

    • undefined 未定义

  • 引用数据类型

    • 对象数据类型object
      • {} 普通对象

      • [] 数组对象

      • /[1]?(\d|([1-9]\d+))(.\d+)?$/ 正则对象

      • Math数学函数对象

      • 日期对象

      • ...

      • 函数数据类型function

Number数字类型

包含:常规数字、NaN;

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

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

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

isNaN([val])
(isNaN(10)); //=>FALSE
(isNaN('AA')); //=>TRUE

Number('AA') //=>NaN 
isNaN(NaN) // =>TRUE

isNaN('10'); //=>FALSE

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

1、把字符串转为数字

把字符串转换为数字,只要字符串中包含任意一个非有效数字字符(第一个点除外)结果都是NaN, 空字符串会变成数字零;

Number('12.5');  //=>12.5
Number('12.5px');  //=>NaN
Number('12.5.5');  //=>NaN
Number('');      //=>0 

2、布尔转换为数字

    Number(true)==>1
    
    Number(false); ==> 0
    
    isNaN(false); ==>FALSE
    
    Number(null); ==> 0
        
    Number(undefined); ==> NaN

3、引用类型转换数字

  • == 把引用数据类型转换为数字,是先把它基于toString方法转换为字符串,然后转换为数字;

  • 对象的object.toString() ===>调用检测数据类型的方法

Number({name:'ddd'});  
Number({});//=>{}/{xxx:'xxx'} .toString() => "[object Object]" => NaN;object.toString() ==>调用检测数据类型的方法;
Number([]);   // => [].toString() => ''=> 0;
Number([12]);   // => [12].toString() => '12'=>  12 ;
Number([12,13]);    // ==>  "12,13"=>  NaN

 let str = '12.5px';
 Number(str); //=>NaN
parseInt(str); //=>12
parseFloat(str); //=>12.5
parseFloat('width:12.5px'); //=>NaN 

4、总结:转换数字类型的方法

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

string 字符串数据类型

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

其他类型值转换字符串方法

  • [val].toString()
  • 字符串拼接

注意:

  • 1、==null和undefined是禁止直接toString的== (null).toString() ==>报错 TypeError 但是和undefined 一样转换为字符串的结果就是 `'null'/'undefined',只是不让用
  • 2、普通对象.toString()的结果是“[object Object]” Object.prototype.toString方法不是转换为字符串的,而是用来检测数据类型的

字符串拼接

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

 '10' + 10; //=>'1010'
'10' - 10;    //=>0
'10px' - 10;     //=>NaN 
let aa = '22';
aa--  //=>22   -- 这里用来数学运算;
let a = 10 + null + true + [] + undefined + '珠峰' + null + [] + 10 + false;

 * 10 + null -> 10 + 0 -> 10
 * 10 + true -> 10 + 1 -> 11
 * 11 + [] -> 11 + '' -> '11'  let i='10';
 * 
	i=i+1 =>'10'+1 =>'101'
	i+=1  =>'101'
	i++   =>i=11   i++和以上两种不完全一样,它是纯粹的数学运算;
 * '11' + undefined -> '11undefined'
 * ...
 * '11undefined珠峰null10false'

boolean布尔数据类型

只有两个值 true/false

其他类型值转换布尔类型

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

  • Boolean([val])
  • !/!!
  • 条件判断
Boolean(0);
Boolean('');
Boolean(' ');
Boolean(null);
Boolean(undefined);
Boolean([]);
Boolean([12]);
Boolean(-1);

// !:取反(先转为布尔,然后取反)
// !!:取反再取反,只相当于转换为布尔 <=> Boolean
 !1;  //=>FALSE
!!1; //=>true

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:20,
	1:100
}
// person.1 => SyntaxError:语法错误

设置属性名属性值

let person = {
	name: '易烊千玺',
	age: 40,
	height: '185CM',
	weight: '80KG',
	1: 100
};
// 删除属性
/* // =>真删除:把属性彻底干掉
delete person[1];
// =>假删除:属性还在,值为空
person.weight = null;
console.log(person); 

对象注意:

  • 如果当前属性名不存在,默认的属性值为undefined;
  • 如果属性名是数字,则不能使用点的方式获取属性值;
  • 属性名不能重复,如果属性名已经存在,不属于新增属于修改属性值;
  • obj['weight'] & obj[weight] 区别,加引号,相当于找属性为weight的,但是obj[weight] ,相当于变量weight,也就是相当于需要先找一个为weight 的变量,比如定义了一个let weight = 10;那么找的就是obj[10]属性对应的属性值;

数组

数组是特殊的对象

  • 1.我们中括号中设置的是属性值,它的属性名是默认生成的数字,从零开始递增,而且这个数字代表每一项的位置,我们把其成为“索引”,=>从零开始,连续递增,代表每一项的数字属性名;
  • 2.天生默认一个属性名length,存储数组的长度;
  • 3.第一项索引是0,最后一项索引 ary.leng-1;
  • 4.向数组末尾追加内容,ary[ary.length]=100;

  1. +- ↩︎