这边文章是对上一篇博客的补充。
js的数据类型
js的数据类型分为两类:原始类型和对象类型
原始类型
原始类型包含:
- 数字(特殊的数字NAN和infinity)
- 字符串
- 布尔值
- 特殊原始值null和undefined
对象类型
对象类型包含:
- 对象
- 数组
- 日期
- 函数
- 正则表达式对象
- 等等…
用xmind画了张图加深理解
补充:所谓的“原始值是不可更改”,就是原始值对应的内存数据没有发生变化,变化的是重新申请的内存空间的数据。
Math对象
js对数字提供一些更复杂的算数运算,这些运算通过作为Math对象的属性定义的函数和常量来实现。
以下是Math对象常用的方法。
//四舍五入
Math.round(0.5) // 1
Math.round(0.4) // 0
//向上取整
Math.ceil(.1) //1
//向下取整
Math.floor(.9) //0
//返回最大值
Math.max(8,2,6.3,6) //8
//返回最小值
Math.min(8,2,6.3,6) //2
//生成随机数
Math.random() //生成一个大于等于0小于等于1的随机数
//求绝对值
Math.abs(-2) //2
//幂,根 pow可以代替sqrt和exp
Math.pow(2,3)// 8 2的3次方
Math.pow(2,1/3)// 1.25... 2的立方根
//平方根
Math.sqrt(3)//1.732...
//立方幂
Math.exp(3) // 8
js二进制浮点数四舍五入问题
javascript 通过浮点数形式只能表示出有限的个数,即:在JavaScript中使用实数的时候,常常只是真实值的一个近似表示。 JavaScript采用的是IEEE-754浮点数表示法(现在使用的的编程语言大多数多是使用该表示法)。二进制浮点数表示法不能精确的表示类似0.1这样的数字, 0.3-0.1不等于0.2。所以为了不出现以下情况尽量使用大整数进行重要的金融计算。
字符串操作
var s = 'hello,world'
//获取第一个字符
s.charAt(0) //'h'
s[0] //'h'
//获取字符长度
s.length //11
//获取第2-4个字符
s.substring(1,4) //'ell'
s.slice(1,4) //'ell'
//获取最后三个字符
s.slice(-3) //'rld'
//字符l首次出现的位置
s.indexOf('l') //2
//字符l最后出现的位置
s.lastIndexOf('l') //10
//在位置3之后首次出现字符l的位置
s.indexOf('l',3) //3
//分割字符串
s.split(',') //['hello','world']
//替换字符串
s.replace('h','H') //'Hello,world'
//字符串大小写
s.toUpperCase() //'HELLO, WORLD'
'HELLO'.toLowerCase() //'hello'
匹配模式
这里先只简单介绍下js为正则提供的方法
var text = 'test:1,2,3';
var p = /\d+/g //匹配一个或多个数字
p.test(text) // true 匹配通过
text.search(p) //5 首次匹配成功的位置
text.match(p) //['1','2','3'] 所有匹配组成的数组
text.replace(p) //'test:#,#,#' 替换
text.split(/\D+/) //['','1','2','3'] 正则分割字符串
变量声明提前
var a='hello'
var b =()=>{
console.log(a) //是undefined而不是'hello'
console.log(aaaa) //error
var a="ll"
console.log(a) //'ll'
}
b()
以上代码解释了变量声明提升,通常未定义的变量打印会报错,由于声明提升被提升到函数最顶部所以打印不报错。
作用域链
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问
var scope = "global";
function CheckScope(){
var scope = "local";
return scope;
}
CheckScope();