一. 数据类型
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