JS数据类型

94 阅读7分钟

一. 数据类型

1)基本数据类型(值类型/原始值类型)

 + 数字number  
 + 字符串string  
 + 布尔boolean  
 + 空对象指针null  
 + 未定义undefined  
 + Es6新增唯一值类型symbol   
 + bigint

2)引用数据类型

     + object 
       (普通对象、实例对象、数组对象、正则对象、日期对象Math、prototype原型对象)
    + function (主类型)

2.JS中常用的输出方式

console  控制在浏览器控制台输出的
+ console.log() 控制台输出日志
+ console.dir() 控制台详细输出
+ console.table() 把数据以表格的形式输出在控制台
+ console.time() /console.End()  计算某一个程序消耗的时间
+ console.warn() 输出警告信息
+ 。。。

windows提示框

+ alert() 提示框 1.输出指定信息 2.阻碍主线程的渲染 3. 默认转化为字符串(toString方法)  对象转字符串“[object Object]”
+ confirm() 确认取消提示框
+ prompt() 在confirm的基础上多加一个原因

向指定容器中插入内容

+ document.write   向页面中输出内容
+ innertHTMl/interText  向页面指定指定容器中输入内容(也会变成字符串) a.基于这两种方式会把之前容器中的内容覆盖,想要追加则采用+=的方式 b. innerHTML能够把标签文本进行识别和渲染而innerText会把所有内容都当做普通的文本

number 数据类型

+ 正数 零 负数  小数
+ NaN  not a number 不是一个有效数字,但是属于number类型
+ infinity 无穷大的值也是number类型的
NaN和任何值都不相等(包括自己本身)

isNaN

 专业用来检测某一个值是否为非有效数字的(验证一个值是否为非有效数字,如果有效数字则返回false,如果不是有效数字,则返回true)
 + 在使用isNaN 进行检测的时候,如果检测的值是非数字类型的值,则需要先把其转换为数字类型,然后在进行检测
 + 把其它数据类型转换为数字类型
   > Number([value]) 而isNaN在检测的时候使用的就是这种方式转换为数字类型的
   > parseInt([value])
   > parseFloat([value])

Number是JS内置的转换方法可以把其它数据类型“强制”转换为数字类型

 + 把字符串转换为数字,一旦字符串出现非有效数字字符,则结果为NaN,只有都是有效数字字符,才能转换为具体的数字
 + 把布尔转换为数字  true转换为1  false=>0
 + 把空转换为数字  null=>0  undefined=> NaN
 + 不能把symbol类型转换为数字,否则会报错
 + 对象转化为数字  先把对象转化成字符串,再把字符串转化成数字
 + 函数转化为数字 =>NaN
 + 普通对象  先把obj转字符串‘[object Object]’ => 数字Number(‘[object Object]’)=> NaN
 + 数组对象
 + 其余对象格式 => NaN
 
 
console.log(100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false);
        100 + true => 101
        101 + 21.2 => 122.2
        122.2 + null => 122.2
        122.2 + undefined => NaN 
        NaN + "Tencent" => "NaNTencent"  字符串拼接(以后都是字符串拼接)
        "NaNTencent" + [] => "NaNTencent"  
        "NaNTencent" + null => "NaNTencentnull"
        "NaNTencentnull" + 9 => "NaNTencentnull9"
        "NaNTencentnull9" + false => "NaNTencentnull9false"
        注: 这里需要注意的是进行四则运算的时候,不是Number数据类型,要先把转换为数字类型在计算,一旦遇到字符串立马进行字符串拼接
        + 基本值是直接拼接,不在进行数据类型转换
        + 引用值转换为字符串再进行字符串拼接

parseInt/parseFloat 也是把其他数据类型转换为number类型的(专门用于把字符串转换成数值)

 处理原理和Number不一样,他们是把字符串转换为数字类型(如果处理的值不是字符串,需要先转换为字符串,然后在去转换为number类型的)
 => 从字符串最左边开始查找,把找到的有效数字字符转换为数字,一直遇到一个非有效数字字符为止,则结束查找
 如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN; 也就是说,用parseInt()转换空字符串会返回NaN。

String 数据类型

  在js中单引号  双引号  反引号包起来的都是字符串
  把其它数据类型转换为字符串类型
  +String([value])
  +[value].toString()
  普通对象转换为字符串都是“[objec Object]”
  数组对象转换为字符串是“第一项,第二项,第三项。。。”(逗号分隔数组中的每一项)
在JS中常用的数学运算
    数学运算 + - * / 加减乘除
    %(膜)取余数
    除了加法以外,其余的情况都是数学运算(如果遇到非数字类型,需要基于Number把其强制转换为数字类型,然后在进行运算的) 加号在js中既有数学运算,也有字符串拼接的意思(只要加号两边的任意一边出现字符串,则变为字符串拼接) 想把它转换为数字,但是中间一定要先转换为字符串 
  对象=>  数字 就是先转换成字符串的

boolean 数据类型

 把其他数据类型转换为布尔类型
 + Boolean ([value])
 + ![value] 把指定的值转换为布尔类型后取反
 + !![value] 取反再取反,相当于没有取反,只是把它转换为布尔类型值
**规则: 0 /NaN / null / undefined / 空字符串,最后都是false,其余都是true**
条件判断中,每一个条件最后一定是true / false
* 条件判断中,每一个条件最后一定是true/false */
        // if (1 == 1) {}
        // if (1) {
        // 	//=>写一个值,也是要把这个值转换为布尔,然后校验程序的真假
        // }
        // if (3 + '3px') {} //=>3 + '3px' =>'33px'  真
        // if (3 - '3px') {} //=>3 - '3px' =>NaN   假

Object数据类型

所有对象都应该具备一下特点
1. 用键值对(key:value 俗称属性名和属性值)来描述一个对象的特征(每一个对象都是综合体,存在零到多组键值对)
2. {key:value,...} 每一组键值对是key:value 的格式,多组键值对用逗号分隔
3. key不是引用数据类型的,value可以是任何数据类型。
关于对象中键值对的增删改查
1.新增或者修改属性和属性值
    对象的属性名(键)是不允许重复的,之前没有这个属性则为新增,之前有这个属性,则是修改对应的属性值
  操作属性的两种方式
  + 对象.属性名 = 属性值  点在这里可以理解为“的”
  + 对象[属性名] = 属性值
2. 获取对象中的属性名和属性值
    1) 获取指定属性名的属性值
    2) 如果指定的属性不存在,获取到的属性值是undefined(不会报错)
    3) 获取当前对象中所有的属性名,返回结果是包含所有属性名的数组
    Object.keys(obj)
 3. 删除对象中指定的属性
     1) 假删除:当前属性还存在,只不过属性值赋值为空
         eg: obj.xxx = null
      2) 真删除:彻底把属性从对象中移除掉
         eg: delete obj.xxx
    对象的属性名不能是引用数据类型值
    
let n = 100
 obj['n'] = 200
 obj[n] = 200 =>  {100:200}  =>   obj[100] =200
 n 本身是一个变量(n和‘n’的区别,前者是一个变量,后者是一个字符串的值) 它代表的所存储的值100(是一个数字格式)

基于对象[属性名] 的方式操作,需要保证属性名是一个值(字符串、数字、布尔等都可以),如果不是一个值,而是一个变量,它会把变量存储的值作为对象的属性名进行操作 => 基于 对象.属性名的方式操作,属性名就是点后面的 obj.1 => 有局限性 属性名不能是数字的 对象.数字属性,此时只能用 对象[数字属性] 对象不能作为属性名,需要把其转换为字符串 => {"[object Object]":"哆啦A梦" } => 如果非要让属性名是个对象,只能基于ES6中的新数据结构Map处理

数组是特殊的对象 1. 它的属性名是数字,数字从零开始,逐级递增,每一个数字代表着当前项的位置 => 我们把这种数字属性名叫做“索引” 2. 默认有一个length属性存储数组的长度

let arr = [1,2,3]
arr[0] = 1
arr.lenth = 3