<script>标签
script 没有 defer 和 async
会停止(阻塞)dom 树构建,立即加载,并执行脚本
script 带 async
不会停止(阻塞)dom 树构建,立即异步加载,加载好后立即执行。不保证脚本按照出现的先后顺序执行
script 带 defer
不会停止(阻塞)dom 树构建,立即异步加载。加载好后,如果 dom 树还没构建好,则先等 dom 树解析好再执行;如果 dom 树已经准备好,则立即执行。
null的应用场景及其与undefined 的区别:
- null用于指向一个空对象(typeof null返回object),在定义一个未初始化的对象变量时,应赋值为null。
- 而无论在任何时候都没必要把一个变量显示地赋值为undefined
- null==undefined 会返回true
- 对于声明而没有赋值的变量,typeof操作符会返回undefined
对于没有声明的变量唯一能执行的操作就是typeof ,返回undefined
NaN
- 用于表示本来要返回数值却没有返回数值的情况(这样就不会抛出错误了),例如一个数除以0会返回NaN。
- 任何值等于NaN都会返回false,包括NaN本身
- isNaN() 函数判断一个值能否被转换为数值
Boolean(x)会返回false的值:
0,null,undefined,空字符串,NaN
String(x)与x.toString()的区别:
undefined和null没有toString方法,而String(undefined)和String(null)返回"undefined"和"null"
slice()与substr()和substring()的区别
- slice和substring的两个参数是截取字符串的起止索引位置
- substr的参数是起始索引和截取的长度
- slice,substr都支持负索引,即从后往前数。(substr的第二个参数是子串长度,所以当它为负时会被转换为0)
- substring所有负参数都会被转换为0
基本数据类型为什么可以访问原型对象上的方法
var a='abc'
var b=a.length
此处a是一个基本类型的变量,本不应该具有任何属性和方法。js定义了三种基本包装类型,Boolean,Number和String,在读取模式下访问变量时,js会通过基本包装类型的构造函数创建一个该类型的实例,并把基本类型的变量作为参数传入。接下来就是通过该实例来访问原型上的方法和属性,访问结束后便立即销毁该实例
js进入第二行代码时,从内存访问了a,此时后台执行了三个操作
1,创建一个String实例
2,访问String实例上的length属性
3,将该实例指向null,随后被垃圾收集器回收
正则之match和exec
var text='123asf345df2'
var reg=/[1-9]+/g
var match=text.match(reg)
console.log(match)
for(let i=0;i<3;i++){
console.log(reg.exec(text))
}
输出结果为
[ '123', '345', '2' ]
[ '123', index: 0, input: '123asf345df2', groups: undefined ]
[ '345', index: 6, input: '123asf345df2', groups: undefined ]
[ '2', index: 11, input: '123asf345df2', groups: undefined ]
- match是字符串上的方法,返回的是所有匹配结果组成的数组
- exec是正则对象的方法,用于迭代匹配,每执行一次匹配一次,每次返回该次匹配的字符串和起始索引,输入串等信息的数组
包含子模式的情况
var text='123asf345df2'
var reg=/[1-9]+([a-z])/g
var match=text.match(reg)
console.log(match)
for(let i=0;i<3;i++){
var res=reg.exec(text)
console.log(res)
}
输出结果
[ '123a', '345d' ]
[ '123a', 'a', index: 0, input: '123asf345df2', groups: undefined ]
[ '345d', 'd', index: 6, input: '123asf345df2', groups: undefined ]
null
exec返回的数组中第一个是当前匹配到的整个串,后面是匹配到的子串