数据类型

基本数据类型(值类型)
number string boolean null undefined bigint symbol
引用数据类型
object:  {}  []  /^$/  Math数学函数对象  日期对象  实例对象  。。。
function
ES6中新增
Symbol 唯一值
NaN

typeof 检测数据类型
typeof Infinity=>“number”
console.log(typeof NaN) =>“number”
NaN 不是一个有效数字,但是属于number数字类型
=>NaN==NaN也是不相等,它和谁都不相等,所以检测是否为有效数字需要用isNaN
任何数 加(+) NaN 结果都是 NaN

什么时候会出现NaN

把其它数据类型转化成Number类型的时候,不能转换就是NaN
parseInt、parseFloat、Number()、数学运算、一些其它比较的时候
isNaN调用的是Number()方法做的隐式转换

object

对象的属性名一定不能是引用类型值,默认会把引用类型值转换为字符串进行处理
ps:对象转换字符串 toString()

let a = { x: 100 }
let b = { x: 200 }
let obj = {}
obj[a] = "清欢"
// {[object Object]: "清欢"}
obj[b] = "长安"
// {[object Object]: "长安"}
//不论是obj[a]还是obj[b]转换后最终都变成了[object Object],所以最后一个值会覆盖前面的值 比较之后为true
console.log(obj[a] === obj[b]) //=> true
数组是特殊的对象

相对于 对象 来说 数组 的特殊性在于 数组 的属性名是有规律的、逐级递增的、代表位置的数字索引

console.log([1, 2, 3])
(3) [1, 2, 3]
	0: 1
	1: 2
	2: 3
	length: 3
	__proto__: Array(0)
// 同样有键值对
Number:NaN/isNaN/Infinity/parseInt/parseFloat/Number()
把其他数据类型转换为数字的方法
   强转换(基于底层机制转换) Number([value])
      一些隐式转换都是基于Number完成的
         1、isNaN('12px') 先把其它类型值转换为数字在检测
         2、数学运算 ‘12px’ - 13
         3、字符串==数字 两个等号比较时也是要把其它值类型转换为数字
   弱转换(基于一些额外的方法转换) parseInt([value])/parseFloat([value])
 
 
   
parseInt 处理的值是字符串,从字符串的左侧开始查找有效的数字字符(遇到非有效数字的字符则停止查找)->如果处理的值不是字符串,需要先转换为字符串然后再开始查找
   字符串中必须保证都是有效字符才会转换为数字,否则都是NaN
   


+(加号) 在js中除了数学运算还有字符串拼接
   什么时候拼接:+ 遇到字符串(或者对象,因为对象就是先转换为字符串然后再处理)
   在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接  =>对象本身是要转换为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,不好意思就变为字符串拼接了



0 NaN null undefined 空字符串 转换为布尔都是假



true -> 1 ;false -> 0
null -> 0 ; undefined -> NaN
    == 进行比较的规律
    在进行比较的时候,如果左右两边数据类型不一致,则需要先默认转换为一致的数据类型,然后在进行比较
    	1、对象==字符串 对象转化为字符串
    		对象转换为字符串  先调用 valueOf  获取原始值(一般都是基本类型值),如果原始值不是基本类型值,则继续调用 toString()
    	2、null==undefined (三个等于号不会相等) 但是和其它值都不相等   0==null(他俩不相等)
    	3、剩下两边不同都是转换为数字(剩下的情况都是转换为数字在做比较的)
    	4、NaN和谁(包括自己)都不相等
    	
    === 绝对相等,两边类型一致,值也一致才相等,类型不一样,直接不对等,不会转换(真实项目中一般用三个等于号===来保证严谨性)

在这里插入图片描述

[]==false  =>true
![]==false  =>true

[]==false   都转换为数字
[]先转换为''(toString)  在转换为数字0(Number)
false 变为数字0

![]==false
运算符优先级   ![]   再算比较
![]  转换为布尔值进行取反(把其它类型转换为布尔类型遵循的规律: 只有 0/NaN/null/undefined/'' 五个值是false,其余的都是true)  => false
{}+0  => 0
0+{}  => "0[object Object]"
{}+0+"10"  => "010"
{}+0+[]  => "0"
{}+0+{}  => "[object Object]0[object Object]"
({}+0)  => "[object Object]0"
({})+0  => "[object Object]0"
{(0)}+0  => 0

{}+0
大括号在JS中太特殊了:对象、代码块(块作用域)
此处把大括号当做一个代码块  后面是+0
+值 ++值 值++ 这三个操作都是数学运算(不论加谁)

大括号在运算符前面
1. 在没有使用小括号处理优先级的情况下  不认为是数学运算,加小括号才算
2. 出现在运算符的后面  认为是数学运算
在JS中对象的属性名是什么格式的?
普通对象的属性名只能是“字符串”(普通对象的属性名可以是基本数据类型值)
但是普通对象的属性名不能是对象,如果是对象,需要转换为字符串存储 普通对象转换为字符串存储调用的是 .toString() 是调取 Object.prototype.toString  是用来检测数据类型的
Map 这种数据结构支持对象作为属性名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值