JS复习
- 可以将JS代码写在超链接中,在点击时执行
<a href="javascript:JS代码">
- 不写分号的话,程序会自动添加,会消耗一些系统资源,还可能加错,建议写
- 数据类型,
typeof 变量名
检查
基本数据类型
String
Number
Boolean
Null
Undefined
引用数据类型
Object
- 数字超过最大值变成Infinity,超过最小值是-Infinity是一个字面量,也是number型;NaN是一个特殊的数字,表示不是一个数字(比如字符串相乘的结果),也是number型
- Null类型的值只有null一个,专门表示空对象,typeof检查时返回object
- Undefined类型的值只有undefined一个,用typeof检查时返回undefined
- 将其他的数据类型转换为String:方法一,调用被转化类型的toString()方法,null和undefined这两个值没有这个方法;方法二,调用String()函数,对number和boolean实际上就是调用toString()方法
- 将其他的数据类型转换为Number: 方法一,Number()函数,纯数字的字符串直接转换成数字,不纯为NaN,空串或全空格转换为0,,null转为0,undefined转为NaN;方法二专门针对字符串,parseInt()转换成整数,parseFloat()转换为小数,小数时检测科学计数法,对非字符串使用这些函数会先转换成字符串,第二个参数可以指明进制
- 将其他的数据类型转换为Boolean,调用Boolean()函数,变成false的情况有,数字的0和NaN,字符串的空串,null,undefined
- 当对非Number类型的值进行计算时,会先转换成Number再计算,可以前面加+来隐式转换;任何职和NaN计算都会变成NaN;任何值和字符串做加法都会先转成字符串再拼接,与空串拼接转换成字符串本质上就是用了String()
- 如果对非布尔值进行逻辑运算,会先转换为布尔值,可以用!!来隐式转换;与和或运算返回最后一个判断的值
- 对非数值进行比较时(==与!=见14),先转换成数字再比较;任何值和NaN比较都是false;如果两边都是字符串,根据Unicode码比较
- 在字符串中使用转义字符输入Unicode编码
\u四位编码
,这里是十六进制;在网页中使用&#编码;
,这里的编码为十进制 - ==判断两个值是否相同时,会自动类型转换,大部分情况下都是转换成数字,由于undefined衍生于null,null和undefined与其他值比较都是false,
null == null
,null == undefined
,undefined == undefined
为true;NaN不和任何值相等,包括本身,可以通过isNaN()函数判断 - 与运算的优先级比或高
- switch,case语句依次做全等比较
- break语句可以跟label来结束指定的循环
console.time('计时器的名字')
开启一个计时器;console.timeEnd('计时器的名字')
终止计时- 读取对象没有的属性,返回undefined
- 创建对象
var obj = new Object();
var obj = {};
- delete删除对象的属性
- 对象的属性名可以不遵守标识符的规范;特殊的属性名比如123这种不能用
.
操作,而要用['']
;[]
里可以用变量,这样属性名就是变量值 '属性名' in obj
来判断对象是否有某属性- 创建函数对象
var fun = new Function(); // 可以给构造函数传递代码字符串,这种方式很少用
function 函数名(参数列表) {
函数体
}
var fun = function() {
函数体
}
- 解析器不会检查实参的数量,多则忽略,少则undefined
- 如果函数中不写return,返回undefined
- 函数的参数可以是任何值,包括函数
- 函数内部可以继续声明函数
- 全局作用域中的对象window可以直接使用;全局作用域中创建的变量都会成为window对象的属性;全局作用域中创建的函数都会成为window对象的方法
- 使用var关键字声明的变量会在所有代码执行之前被声明好,但不会立刻赋值;使用函数声明形式创建的函数在所有代码执行之前创建
function fun() {}
,可以在函数声明前调用,而使用函数表达式创建的不会被提前创建var fun = function() {}
- 构造函数内部定义的方法,每次调用构造函数都会生成,因此性能存在问题;所有考虑将构造函数的方法定义在全局,内部使用引用,这样可以优化性能,但是这样又会污染全局;因此引出原型,可以通过
类名.prototype
或者实例名.__proto__
访问到原型对象;原型对象相当于一个公共区域,所有该类实例都可以访问到,当访问对象的属性或方法时,会现在对象自身中寻找,找不到去原型找,直到找到Object对象的原型 - 使用
in
关键字也会去查找原型,只查找自己的话可以用对象.hasOwnProperty('属性名')
方法,这个方法在原型链中 - 将不再使用的对象的引用变量设置为null,让浏览器自动垃圾回收
- 数组是内建对象,读取不存在的数组不会报错,返回undefined
- length属性获取数组最大索引+1,哪怕中间不连续;可以设置长度,大于数组实际长度的时候也会产生空值,小于的时候截断
- 创建数组
var arr = new Array();
arr[0] = '第一个元素';
// 构造函数
var arr = new Array(1, 2, 3, 4, 5);
// 但如果是一个参数,表示的是长度
var arr = new Array(1);
// 字面量
var arr = [1, 2, 3, 4, 5];
- 数组的push方法一次可以给多个参数,返回的是新长度
- 对原数组影响的常用的数组方法有
push
pop
unshift
shift
splice
reverse
sort
- 函数对象的方法call和apply,第一个参数为对象,此时该对象成为函数中的this;call和apply的参数不同,call依次写实参即可,apply第二个参数为数组
- 在调用函数时,除了this,arguments也是一个隐藏的参数,这是一个类数组对象(可以通过Array.isArray()方法判断);
arguments.callee
返回当前正在执行的函数对象 - js也有包装类String(),Number(),Boolean(),对基本类型调用属性和方法时,浏览器会临时用包装类转换成对象
- 字符串方法中,substring和slice的区别是substring不能接受负值作为参数(默认为0,并且根据参数大小自动调整位置
- 字符串方法中的split和search可以使用正则表达式
- 创建正则表达式
var reg = new RegExp('正则表达式', '匹配模式');
或
var reg = /正则表达式/匹配模式;
| nodeName | nodeType | nodeValue |
---|
文档节点 | #document | 9 | null |
元素节点 | 标签名 | 1 | null |
属性节点 | 属性名 | 2 | 属性值 |
文本节点 | #next | 3 | 文本内容 |
getElementsBytTagName
这样的方法返回的是类数组对象- 属性一般可以直接取,但class由于是保留字,要用className
- style只能读写内联样式,当前样式的读(写还是只能style)用currentStyle(只有IE支持);其他浏览器中通过getComputedStyle()方法获取(属于window对象)
- clientWidth(Height)得到的是不带单位的内容区加内边距的值,只读;offsetWidth则加上边框;scrollWidth得到的是整个滚动元素的值
- offsetParent,可以获取当前元素的定位父元素,offsetLeft等为相对其定位父元素的偏移量
- scrollLeft可以获取水平滚动条移动的距离;当
scrollHeight - scrollTop = clientHeight
时,说明垂直滚动条到底了 - clientX是鼠标相对于窗口的坐标,pageX是相对于页面的
event.cancelBubble
取消冒泡event.target
表示触发事件的对象,this
是绑定的对象- 绑定事件的方法
btn.onclick = () => {
}
btn.addEventListener('click', () => {
}, false)
- 直接打印Location可以得到当前地址,直接修改则会产生历史记录
- 每修改一次样式,浏览器会重新渲染一次页面,所以可以通过修改类名来改样式
- 使用ES5的函数语法来写模块,自执行的参数一般会写window,有利于代码压缩
- 内存溢出的三种情况:意外产生的全局变量,未清除的定时器、闭包
- H5的web works是JS多线程的解决方案