基本类型: number,string,boolean,undefined,null
非基本类型(引用类型):object
typeof的返回结果:number,string,boolean,undefined,object,function
Infinity 代表超出js处理范围的数 typeof 结果是number,最大的数是Infinity 最小是-Infinity
js所能处理的最大值为1.79769313486e+308 最小是5e-324
NaN typeof 结果是number
优先级 先!再&& 后 || 结合括号
undefined: 不存在或未赋值的变量 就会得到undefined typeof的结果是undefined
1undefined //NaN
1null //0
!!undefined //false
!!null //false
null 的值是null
转布尔是为false :“” null undefined 0 NaN false
数组 typeof结果是object
增加长度来增加数组 值默认为undefined
三元操作符 var a = 条件?条件为真的结果:条件为假的结果
for(var i in items) 来遍历数组或者对象如果某fn没有显式返回值 那么默认return 的是undefined
函数声明 function sum(){} function sum(a){}
函数调用 sum() sum(a)
函数里用到本来要传进来的参数 但是括号里没写参数 那么花括号里的该参数就会被赋为undefined
但是括号里写多了 会被忽略掉
arguments 不是数组 是类似数组的对象parseInt() 从左往右 结果是数字或NaN 遇到第一个不是数字的就哭
parseFloat() 同上
isNaN() 判断NaN 和数字 ,返回结果NaN就true 数字就false
NaN 不等于本身
isFinite() +-Infinity返回false 数字返回true、
1 | var g = 1 function f(){ var a = 2 g++ return g } >>>fn() //2 >>>fn() //3 >>>a //not defined //局部函数会改变外层定义的变量 |
1 | var a =123 function f(){ alert(a) //undefined var a = 1 alert(a) //1 } //预解析 f内a为undefined //赋值 var a=1 //局部优先于全局 会把外面的a替换 |
function f(){} 与 var f = function(){} 本质一样 第一种是声明 第二种是表达式,会调用 typeof f 都是function
1 | (function(name){ alert(name) })('ton') //自调用的匿名函数 ton为传递的参数 name=ton |
匿名函数 回调函数 私有函数(函数内的函数) 返回函数(return fn(){})
1 | //区别两种作用域 function f1(){var a = 1 f2()}//f1 f2间没有共享域 function f2(){return a} function f1(){ var a = 1 function f2(){//f2 在f1内 作用域继承 return a } } |
###闭包1
//私有函数拿到局部变量 然后把私有函数暴露给外面环境 这样外面环境就可以访问内部变量了
function f(){
var b = 1
return function(){
return b
}
}
1 | //这样也可以暴露内部变量 区别在全局定义了n函数 var n function f(){ var b=1 n = function(){ return b } } |
闭包:利用内部函数返回父级变量,不断翻出去
循环中的闭包
1 | function f(){ var a = [] for(var i=0;i<3;i++){ a[i] = function(){ return i } } return a } //内部函数是拿到的i,for循环已经遍历完 返回i=3 里面的i到父级去找值时 父级的i已经变成3 function f(){ var a=[] for(var i=0;i<3;i++){ a[i] = (function(x){ return function(){ return x } })(i) } return a } //用向匿名函数传参的方式 里面的i到父级去找值时 都经过参数x的桥梁拿到值 function f(){ var a=[] for(var i=0;i<3;i++){ a[i] = fn(i) } function fn(i){ return function(){ return i } } return a } //变体 区别就是函数的调用 自执行与()调用 |
1 | var get,set (function(){ var a=0 get = function(){ return a } set = function(v){ a=v } })() //这个自执行函数内相当一个全局 a是全局变量 两个全局函数都可以拿到a |
1 | //迭代器 function next(x){ var i = 0 return function(){ return x[i++] } } //i做索引 x是一个数组 i每次都会保存一个值 可以把x遍历完 |
对象
对象的属性可以是函数 因为函数也是一种数据
一般性数组 [1,2,3] 默认是有数字索引
关联性数组 字符串键值 哈希表
访问对象的属性 [] 和 . ,不确定的属性用[]
对象可以包含任何数据 包括对象
构造函数
可以用来创建对象的函数 new关键字
1 function People(){ this.aihao = 'baskball' } var peo = new People() //没有new会返回undefined
1 | fn1 = new fn(){} fn = fn1.constructor(){} //只有构造器才有constructor属性 //有显式构造器new 也有隐式的 object()函数 |
instanceof
1 function Hero (){} var h = new Hero() var o = {} >>h instanceof Hero //true >>h instanceof Object//true >>o instanceof Object//true
1 | var o = factory(a) >>o.constructor //Objecy() |
1 | function C(){this.a = 1 return {b:2}} var c = new C() typeof c.a //undefined c.b //2 //因为构造函数返回的是一个对象 这个对象没有a属性 |
对象的比较要看它们的指向是否一致 引用类型
###内建构造器
Object,Boolean,Number,String ,Math,Date,RegExp 等
var o = {} var o = new Object()
###Array()
a.push(‘new’) 后面插入 返回值是a的长度 pop()刚好相反
sort() 返回值是排序后的数组
join() 在数组的元素件插入字符串 返回改变后的数组
slice(1,3) 要前不要后 返回第一位到第二位的数组片段 原数组不变
splice() 要前也要后 会修改原来的数组 移除并返回指定切片
1 | a = [1,2,3,4,5] b = a.splice(1,2,aaa,sss,ddd) //返回b是 [2,3] //a 变成 [1,aaa,sss,ddd,3,4,5] 切走的后面部分被后面的参数补回 |
###Function
function fn(){} fn.constructor //Function() 普通函数的构造器属性指向Function()构造函数
Function 函数有length属性 记录参数的长度 所以所有普通函数也有length属性
Function 还有caller属性 返回调用该函数的函数 b函数里调用a函数 所以a的caller就是b函数
prototype属性 只有该函数是构造器是才发挥作用 该函数创建的所有对象都有对prototype的引用 继承
Function 继承Object
call() apply() 方法 借用某对象的方法 改变作用域 参数有差别
a.say.call(b,’d’,’e’,’f’) b调用a的say() 参数直接写
a.say.apply(b,[‘d’,’e’,’f’]) b调用a的say() 参数放数组里
a.say.call(this,1,2,3) 指定作用域里的对象调用a的say方法
###arguments对象
callee属性 arguments.callee 指向参数所属的函数
1 (function(count){ if(count<5){ alert(count) arguments.callee(++count) } })(1) //匿名函数的递归Number()
String对象
toUpperCase() toLowerCase()
charAt() 返回指定位置的字符
indexOf() 返回指定字符的索引 返回指定开始地方的字符的索引
lastIndexOf() 从右往左
slice() substring() 返回字符中的指定区间
split() 用指定标示切割字符串 返回一个数组 与 join() 相反
concat() 在原字符串上追加字符串search() 返回匹配字符串的索引
match() 返回数组中匹配的元素
replace() 把匹配到的文本替换成指定的
###原型
在构造器的原型上添加属性和方法,构造器的实例也可共享这些属性和方法
实例本身的属性方法是引用构造器的 地址引用 而原型属性方法是通过原型链共享的 也是一种引用
现在本身上去找某个指定的属性 如果没有找到 就沿着原型链去找 直到找到为止
实例.constructor.prototype 指向构造函数的原型
枚举对象属性 fon-in 显性的才可枚举 length constructor等隐性的不会
propertyIsEnumerable() 判断属性是否可枚举 对所有自己定义的属性都返回true 而内建的属性大部分是不可枚举的 任何原型链上的属性都是不可枚举的 除非是原型链上调用propertyIsEnumerable() 的对象
hasOwnProperty() 判断属性是自身的还是原型的
每个对象都有isPrototypeOf() 判断当前对象是否是某个指定对象的原型proto属性 与prototype不等价 是实例的属性 而prototype是构造器的属性 当然如果实例也是构造器的话 它就有这两个属性
1 | 实例 构造器 原型 a A A.prototype a.constructor a.constructor.prototype a._proto_ |
重写某对象的prototype是 应重置相应的constructor属性
共享的属性方法挂到原型上
浅拷贝 指针指向同一个地址 只是引用同一内存 你变我也变
深拷贝 完全复制一份,各有各的内存地址 你变与我无关
##Bom
window.navigator.userAgent 根据uaerAgent来识别浏览器类别及版本 但不是最好的方法
1 if(navigator.userAgent.indexOf('MSIE') !== -1){ //ie }else{ //not ie } if(typeof window.addEventListrner === 'function'){ // }else{ // } //通过特性检查更好location.href 完整的url
location.hostname 域名信息
location.reload() location.assign() location.replace()window.history.forward() 前进 history.go(1)
window.history.back() 后退 history.go(-1)window.frames永远指向window
frames[0].window frame里的window
frames[0].parent 最外层的window
window.frames[0].window.top === windowscreen.width 总分辨率宽
screen.height 总分辨率高
screen.availWidth 除去操作系统任务栏等的区域
screen.availHeight
##Dom
节点: 文档节点 文本节点 元素节点 属性节点
nodeType nodeName nodeValue 有些节点的nodeValue 是null
元素节点: nodeName与tagName 都是标签名
document.documentElement 值得是HTML标签 所有标签都是它的子节点
hasAttribute() 判断是否有属性
.attributes属性 是元素属性的集合
getAttribute(‘名’) 来获取元素属性的值
setAttribute(‘值’)
.textContent属性 获取元素的文本 ie不支持 ie用.innerText属性
innerHTML属性 获取元素里的html代码getElementById()
getElementsByName() 通过name属性 集合
getElementsByTagName()通过标签名 集合.childNodes .parentNodes
nextSibling previousSibling 属性 firstChild lastChildcreateElement() createTextNode() appendChild() insertBefore()
createElement() innerHTML属性cloneNode() true:深拷贝 包含所有节点 属性节点 文本节点 false:浅 只有当前节点 元素节点
removeChild()
Cookies 属性
referrer属性 与HTTP头信息的referer值相同 记录访问过的url
domain属性 跨域操作 document.domain=”最顶层的域名” 等同 window.location === document.locationaddEventListener(‘click’, function(){},false) false冒泡 true捕获 removeEventListener()
匿名函数定义的监听器不能被移除
冒泡 小到大 ie只有冒泡
捕获 达到小 ff o s 冒泡捕获都有
stopPropagation() 阻止冒泡
preventDefault() 阻止默认事件 并不是所有的默认事件都可以阻止 看事件对象cancallable属性
ie5 attachEvent() 监听 srcElement属性 触发元素 cancalBubble属性 阻止冒泡 returnValue属性 阻止默认事件 detachEvent() 移除监听
###ajax1
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = cb()
xhr.open('method',url,true) //true 异步 false 同步
xhr.send(data)
function cb(){
if(xhr.readyState<4){
return
}
if(xhr.status !== 200){
//err
return
}
//ok
}
//ie7
var xhr = new ActiveObject('MSXML2.XMLHTTP.3.0')//MSXML2.XMLHTTP Microsoft.XMLHTTP