这是基础版的第二天,数据类型就像是java中的内置对象与数据类型一样,对于语法的一个基础架构
JavaScript有6中数据类型 (ES6 又新增了 Symbol 和 BigInt 数据类型,先不讲述)
- 数值 number
- 字符串 string
- 布尔值 boolean
- undefined 声明定义未赋值
- null 声明赋空值
- 对象 object
对象分为 函数function 数组array 对象object
数据类型判断
- typeof (数组,null,object返回都是'object')
- instanceof (原本是判断对象与构造函数关系,所以右侧必须是首字母大写的类型)
- Object.prototype.toString.call() (原本的tostring方法返回[object Object]改变this指针,得到的[object 首字母大写的类型])
null与undefined
之所以放在开头讲述就是因为下面的类型都是具象的,这两个对于初学者比较抽象
- undefined
声明未赋值
var x; (x是undefined类型,没有值) - null
声明且赋空值
var y = null; (y是null类型,且值为null,意思是空值)
注:
- 当出现undefiend的时候要注意:
变量是否在相应的作用域中有赋值
对象访问时,上级的访问是否存在 - 当出现null的时候要注意:
是否是后端传递的,可能格式需要沟通转换
布尔值与数值
-
布尔值boolean
只有true与false,主要就是逻辑判断结果,对应着计算机底层的01编制强烈建议,搞编程的朋友们,不要脑子中全是是非对错,多一些辐射的可能性,可以让你的生活更加充实!
-
数值number
- 正负0,是不同的,64位浮点数的符号位不同
- NaN,类型是number,但是数值不是数字
判断方式只有 isNaN(),不等于自己 - 正负Infinity
数值正向溢出(overflow)、负向溢出(underflow)
判断方式只有isFinite()
注:
数字相关的方法:
- parseInt('参数',进制)
- parseFloat(参数); 将参数转换成小数,只认识一个小数点
布尔值六大0值:
false 0 null undefined NaN ‘’(空字符串)
内置的数学方法:
Math.floor(3.999) 向下取整 去掉小数部分
Math.ceil(3.001)) 向上取整 只要有小数就进位
Math.max(1, 2, 36, 9) 取参数的最大值
Math.min(1, 2, 36, 9)) 取参数的最小值
Math.floor(Math.random() 取(0,1]的随机数
字符串
转义字符
1.\n :换行符
2.\t :制表符
3.' :单引号
4." :双引号
5.\ :反斜杠字符串属性
1.length长度
2.下标(index)
str[index] str.charCodeAt(index)
3.字符串就是一个字符数组转码方式
1.Base64(原生携带的)
btoa():任意值转为 Base64 编码
atob():Base64 编码转为原来的值
2.Unicode(语法携带的)
str.charCodeAt(index) 字符转unicode编码
String.fromCharCode(unicode编码值) Unicode编码值转字符串
注:
字符串常用方法:
1. 查找:
字符串.indexOf(要查找的字符, 查找的起始位置); 从左向右找
字符串.lastIndexOf(要查找的字符, 查找的起始位置); 从右向左找
- 截取:
字符串.substring(起始下标, 结束下标),不含结束下标
字符串.slice(起始下标, 结束下标),不含结束下标,建议使用
字符串.substr(起始下标, 截取的个数);,知道具体要截取的个数,挺方便的 - 转大小写:
字符串.toUpperCase() 转大写
字符串.toLowerCase() 转小写 - 去首尾空格:
字符串.trim(),去除字符串左右空格,IE8及以下不支持(正则方式解决)
5.字符串拆分:
字符串.split(分隔符)
6.最强大的方法splice (删除,添加,替换)
字符串.replace(被替换的字符, 新的字符串),返回被替换以后的字符串,不影响原字符串
数组
- 数组属性
1.length长度
2.下标(index)
arr[index]
3.数组就是一个key为数字的对象 - 数组的特殊运算符
1.in
字符串 in 数组 ,判断数组的key中是否含有该字符串
2.for( in )遍历
借助for循环与in形成的迭代方式
注:
数组常用方法:
1. 栈操作:
数组.push(参数),向数组的尾部添加,返回数组的长度
数组.unshift(参数), 向数组的头部添加,返回数组的长度
数组.pop(),删除数组最后一项,返回被删除的项
数组.shift(),删除数组第一项,返回被删除的项
- 最强大的splice方法 (删除,添加,替换)
数组.splice(起始位置, 要删除的个数, 要添加的项...),会修改原数组,也会返回新数组
增(n,0,添加项列表)
删(n,m)
改(n,m,修改后的项);先删再加就是修改 - 数组排序:
数组.sort() (可以自定义排序规则)
4.数组合并:
数组.concat(参数, ...),将参数拼接到数组中,返回新数组,不影响原数组
5.数组项反转:
数组.reverse(),反转数组,返回反转以后的数组,并修改原数组
6.数组查询:
数组.indexOf(要查找的项[, 查找的起始位置])
数组.lastIndexOf(要查找的项[, 查找的起始位置])
7.数组截取:
数组.slice(起始下标, 结束下标),数组截取,不影响原数组,返回截取的新数组
8.数组类型判断(类方法):
Array.isArray()
9.数组迭代方法:
数组.forEach(function (item, index, array) { });循环数组(没有返回值),代替for循环
数组.map(function (item, index, array) { });循环数组,返回每次函数调用的结果组成的一个新数组(可以进行逻辑与算术操作)
数组.filter(function (item, index, array) { });循环数组,返回每次函数调用的结果为true的项组成的一个新数组(过滤)
数组.every(function (item, index, array) { });循环数组,如果每次函数调用结果都为true,则返回true
数组.some(function (item, index, array) { });循环数组,函数调用只要有一个为true,则结果为true
数组.find(function (item, index, array){}); 循环数组,条件返回true,则把对应的item返回,否则返回undefined
数组.findIndex(function (item, index, array){}); 循环数组,条件返回true,则把对应的item的下标返回,否则返回-1
10.数组转字符串
数组.join('连接符'),数组按照连接符连接
11.数组求和
数组.reduce(function (
sum, // 累积变量,必须
newVal, // 当前变量,必须
newIndex, // 当前位置,可选
array // 原数组,可选
) { .... })
对象
现实世界你唯唯诺诺,虚拟世界你桃花满身,对象new一个就来了
对象属性
1.属性
对象.属性 对象{属性}
2.对象就是一个key-value的键值对集合对象的特殊运算符
1.in
字符串 in 对象 ,判断对象的key中是否含有该字符串
2.for( in )遍历
借助for循环与in形成的迭代方式
注:
对象常用方法:
1. 属性查看(类级方法)
Object.keys(对象),返回一个属性组成的数组
Object.getOwnPropertyNames(),返回一个属性名组成的数组
- 属性权限配置
Object.defineProperty(对象, 属性, {配置内容});
Object.getOwnPropertyDescriptor(obj,属性名)方法可以获取属性描述对象
函数
-
函数两种表现形式
1.函数声明式:function xxx(){}
2.函数表达式:(本质上是变量赋值)
let xxx = function(){}
函数提升
1.遇到function会提升到作用域顶部
2.函数与变量同名,函数会覆盖变量
3.同名函数,顺序在后覆盖顺序在前-
函数的基本信息
1.函数参数
实参与形参一一对应,没有传递则为undefined
形参可以有默认值,实参可以有缺省值
形参个数未知,可以使用arguments- 函数返回值
函数的调用结果,用于后续的处理
- 函数返回值
- 函数作用域
先从函数中寻找变量,没有再逐层往上寻找到全局,全局没有就是undefined
注:
函数进阶:
1. 回调函数: callback
通常是一种初步解决异步的方式
2. 自执行函数(匿名函数): 做一些检测等嵌入式操作(防止对于原代码有影响)
(function () { })();
3.闭包
函数return嵌套函数
内部函数可以读取外部函数的变量、参数或者函数
这个内部函数在包含它的外部函数外面被调用
function xxx(){
return function(){
}
}
注:
闭包能记住它的诞生环境,这些变量会一直存在内存中
如果大量的数据被缓存,可能造成内存泄漏,在使用闭包的时候要慎重。
闭包沟通函数内部和外部的桥梁,缓存数据,延伸变量的作用范围。
4.回调函数: 一些复杂的逻辑
自己调用自己,但必须有递归出口
function xxx(){
//递归出口判断
if(){
xxx()
}
}