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